Androidでfastlaneを使ってみる

[fastlane](https://fastlane.tools/)と言えば、iOSをやっている人なら、一度は使ったこと, 聞いたことあるツールだと思います。

fastlaneは、iOSだけしか使えないのではなく、**Androidでも使えます！**
でも、すべての機能を使えるわけではないです。

Androidで使えるのは、こちらの２つです。

- [supply](https://github.com/fastlane/fastlane/tree/master/supply): Google Playへのアップロード
- [screengrab](https://github.com/fastlane/fastlane/tree/master/screengrab): スクリーンショット作成

# fastlaneの導入
※ Rubyの環境が必要です。

```
sudo gem install fastlane --verbose
```

# fastlaneのセットアップ

fastlaneを使うには、プロジェクト内にfastlaneの設定ファイル等を作る必要があります。

## ①init
initコマンドをすると、質問に答えるだけで、必要なファイルを作れます。

```
fastlane init
```

## ②Git

Git などで、バージョン管理している？？って聞いてくれるので`y`を押します。（してない人は`n`ね。）

```
Do you have everything commited in version control? If not please do so now!
(y/n)
```

## ③パッケージ名
パッケージ名入れてっと聞いてくるので、パッケージ名をいれます。

```
To not re-enter your packagename and issuer every time you run one of the fastlane tools or fastlane, these will be stored in a so-called Appfile.
Package Name (com.krausefx.app):
```

## ④認証ファイルのパス

Google playの認証ファイルのパスを入れてっと聞いてくるので、認証ファイルのパスを入力します。(入力したくない人は、そのままエンターを押してください)
認証ファイルを設定すると、`supply`が使えるようになり、Google playへのapkのアップロードができます。

認証ファイルの作成方法については、[こちら](https://docs.fastlane.tools/getting-started/android/setup/#collect-your-google-credentials)を参照してください。（この辺りは、また今度書きます。）

```
Follow the Setup Guide on how to get the Json file: https://github.com/fastlane/fastlane/tree/master/supply#setup
Path to the json secret file: 
```

## ⑤metadata

Google Playに掲載するアプリの説明や画像ファイルなどを管理する？？っと聞いてくるので、管理したい人は`ｙ`、したくない人は`ｎ`。

```
Do you plan on uploading metadata, screenshots and builds to Google Play using
fastlane? (y/n) 
```

## ⑥成功
```
Successfully finished setting up fastlane
```

と表示されたたら、成功です。
プロジェクトにはfastlaneというフォルダができているはずです(　´∀｀)b
![スクリーンショット 2016-11-09 14.16.24.png](https://qiita-image-store.s3.amazonaws.com/0/53996/d7d9367f-c253-5f69-5c9b-798641e1e1ca.png)

# fastlaneのファイルの簡単な説明

## Fastfile
デプロイやテストなどの処理を書くファイルです。

```ruby
fastlane_version "1.107.0"

default_platform :android

platform :android do
  before_all do
     ENV["SLACK_URL"] = "slackのweb hookのurl"
  end

  desc "Runs all the tests"
  lane :test do
    gradle(task: "test")
  end

  desc "Submit a new Beta Build to Crashlytics Beta"
  lane :beta do
    gradle(task: "assembleDebug")
    crashlytics(
        api_token: "トークン",
        build_secret: "トークン",
        groups: "betaのグループ名",
        emails: "メアド",
        debug: "true"
     )
  end

  desc "Deploy a new version to the Google Play"
  lane :deploy do
    gradle(task: "assembleRelease")
    supply
  end

  after_all do |lane|
    slack(
        message: ":tada: Successfully deployed new App Update.＼(^o^)／"
      )
  end

  error do |lane, exception|
    slack(
       message: exception.message,
       success: false
    )
  end
end
```

### Fastfileにあるコマンドの説明

#### lane

テストやapkのアップロードなど処理を定義したものです。

#### desc
laneの説明です。

#### crashlytics 

Fabricの[Beta](https://docs.fabric.io/apple/beta/overview.html)です。
これでBetaにapkのアップロードができます。
FabricのBetaの使い方は、[こちら](http://dev.classmethod.jp/smartphone/android/android-fabric-crashlytics-beta-distribution/)を参照してください。

#### supply 
Developer Consoleへのapkのアップロードです。
※認証ファイルの設定が必要です。

#### slack
slackへの通知です。

こちらにslackのweb hookのurlを書いてください。

```ruby
before_all do
  ENV["SLACK_URL"] = "slackのweb hookのurl"
end
```
#### gradle

Gradleのコマンド実行です。

### Appfile

認証情報とアプリのパッケージ名が書かれています。

```
json_key_file "認証ファイルのパス"
package_name "com.gupuru.hogehoge"
```

### metadata
Developer Consoleにアップロードするアプリのスクリーンショットや説明文などが含まれています。

# fastlaneを使う

`fastlane`とコマンドをうつだけです。

```
fastlane
```

すると、こんな感じのやつが表示されます。実行したい番号を入力します。

```
+--------+----------------+---------------------------------------------+
|                        Available lanes to run                         |
+--------+----------------+---------------------------------------------+
| Number | Lane Name      | Description                                 |
+--------+----------------+---------------------------------------------+
| 1      | android test   | Runs all the tests                          |
| 2      | android beta   | Submit a new Beta Build to Crashlytics Beta |
| 3      | android deploy | Deploy a new version to the Google Play     |
| 0      | cancel         | No selection, exit fastlane!                |
+--------+----------------+---------------------------------------------+
```

例えば、`android beta`を使いたい場合は、`2`を押します。

そして...

```
fastlane.tools finished successfully
```
と表示されたら成功です( *• ̀ω•́ )b

ちなみに...

```
fastlane android beta
```

としても同じことができます。

# アプリのスクリーンショットを撮ってみる

fastlaneの`screengrab`を使って、アプリのスクリーンショットを撮ってみます。

## セットアップ

`gradle`に、この２つを追加してください。

```build.gradle
dependencies {
    androidTestCompile 'com.android.support:support-annotations:25.0.0'
    androidTestCompile 'tools.fastlane:screengrab:0.5.5'
    //...
}
```

`debug/AndroidManifest`に、これを追加してください。

```src/debug/AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.gupuru.hogehoge">

    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />

</manifest>
```

で、スクリーンショットを撮りたい所に` Screengrab.screenshot("screan");`を追加します。

```java
@RunWith(JUnit4.class)
public class JUnit4StyleTests {

    @ClassRule
    public static final LocaleTestRule localeTestRule = new LocaleTestRule();

    @Rule
    public ActivityTestRule<MainActivity> activityRule = new ActivityTestRule<>(MainActivity.class);

    @Test
    public void testTakeScreenshot() {
        Screengrab.screenshot("screan");
    }

}
```

## 実行

はじめに、`assembleAndroidTest`を実行します。

```
./gradlew assembleDebug assembleAndroidTest
```

次に、こちら。

```
fastlane screengrab
```

で、このように表示されるので、`androidTest`ほうを選びます。

```
Select your debug tests APK
1. app/build/outputs/apk/app-debug-androidTest.apk
2. app/build/outputs/apk/app-debug.apk
```

成功すると、こんな感じにスクリーンショットが撮れています。

![スクリーンショット 2016-11-09 14.22.46.png](https://qiita-image-store.s3.amazonaws.com/0/53996/6447ccb6-ddf5-f1f4-3243-ae94530c0967.png)


ちなみに、Fastfileにこんな感じに書いても同じことができます(•̀ᴗ•́)و 

```ruby
 lane :test do
    gradle(task: "assembleDebug assembleAndroidTest")
    screengrab
  end
```

## screengrabの公式のサンプル
https://github.com/fastlane/fastlane/tree/master/screengrab/example

# まとめ
fastlane便利(･ω･)b
...と思うけど、fastlaneでできることは、gradleのプラグインとかで出来てしまうから、iOSみたいに必須ツールとは言えないかも???