BlackBerry KEYone で使うためのランチャーを書いて、 Google Play にリリースした

去年、 Nexus 5X がブートループに陥り、買い換えざるを得なくなったので、BlackBerry KEYone を購入していた。キーボードがあるので快適に使っていたが、 Alfred のようなアプリがあるとより便利なのではないかと思った。幸いにも、 KEYone には(それまで使っていなかったが)「便利キー」という名前の、アプリを最大 3 つまで紐づけられて、特に一つしか紐づけなければどの画面でもボタン一つでアプリを起動できるボタンがあったので、そこから呼び出すことにしてアプリを作成、リリースまでした。

作成したアプリは「Blue Line Console」で、 Google Play にリリースした。ソースコードは GitHub のリポジトリに置いてある。

(3/27 追記:画像を一枚も貼っていなかったので、スクリーンショットを追加)

リリースするまでの流れを思い出せる範囲で書いておく。

    • アプリを作ろうと思った
    • とりあえず、 Android Studio をダウンロードしてパソコンに入れ、プロジェクトを作成した。
    • Android Studio は Git との連携が最初からついていて、 .gitignore もちゃんと書いてあったので、 Git でコードを管理できるようにした。
    • とりあえず欲しい機能が実現できるか書き始めてみた。アプリの検索周りが Android 特有の事情でどれくらい影響を受けるかわからなかったので、そこから書き始めた。
    • 動いたが遅かった。アプリ一覧そのものはすぐ取得できるが、アプリの名前の取得が遅いらしいことに気付いた。ぐぐってみると Android: Getting list of device applications – Very Slow – Stack Overflow というページがひっかかり、どうにもならなそうだったので、アプリの名前を SQLite にキャッシュすることにした。
    • レイアウトの画面で、 left / right より start / end のほうが RTL な端末にフレンドリーだよ、という警告がでていたので、 RTL 周りを調べて修正した。端末の言語設定をアラビア語に変えてどのように動作するか調べた(開発者オプションで日本語のまま RTL レイアウトにすることもできたが、どうせなので実際にアラビア語だとどうなるか調べた)。
    • 必要な機能を実装したり、レイアウトを調整したりしていた。名前がまだ決まっていなかったので、パッケージ名は仮置きのまま、アプリの名前やアイコンはデフォルトのままになっていた。
    • 途中で、 Jenkins でビルドできるようにした。gradlew ファイルを実行可能にして、Jenkins に Android エミュレータプラグインを入れて、 Gradle で “build connectedCheck” の二つのジョブを実行するようにした。GitLab からフックするようにして、コミットしたら入れられる apk ができるようにした。
    • 名前が決まったので、クラス名などを決定し、アイコンを作成した。 デフォルトで roundIcon (Android 7.1 (API レベル25)から)と anydpi なアイコン(Android 8.0 (API レベル26)から)が設定されていたが、一旦は無視することにして削除した。なお、後で Google Play にアップロードする操作の途中でアプリのアイコンの高解像度版やヘッダなどが必要になるので、アイコンができたからといってアイコン用の png だけ残して元ファイルを削除してしまうと悲しい思いをする(さすがに消さなかったが)。
    • Google Play にリリースする準備をした。
      • Google Play コンソールから、デベロッパー登録をして $25 を支払った。
      • Google Play App Signing (Google Play アプリ署名)を利用することにしたが、 Google に確認してもらうための電子署名はしないといけないので、 Jenkins の Android Signing Plugin (と Credentials Plugin)を設定した。PKCS#12 な証明書(秘密鍵あり)を keytool コマンドで作成して Jenkins の Credentials プラグインに読み込ませた。方法は後述。
      • フォームから、デフォルトの言語を選んで、アプリのタイトルや説明、スクリーンショットをアップロードした。レーティング(何歳以上じゃないと使ってはいけないとか)の判別のための設問なども必要だった。基本的には必要な作業は画面を見ればわかるようになっていた。非公開な状態で apk のアップロードと説明の記述まで実施した。
      • 完了したらアップロードボタンを押すと割とすぐにアプリのタイトルで検索してインストールできるようになった。

PKCS#12 な証明書の作成

アプリケーションへの署名 | Android Developersに従って署名を作った後、Credentials Plugin に読み込ませるために PKCS#12 に変換した。よくわかっていなかったのでこうしたが、もっといい方法がありそう。

$ keytool -genkey -v -keystore android-build-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-alias
$ keytool -importkeystore -srckeystore android-build-key.jks -destkeystore android-build-key.p12 -deststoretype PKCS12 -srcalias my-alias

Jenkins で Android テスト

(追記)この状態でしばらく使ってみたが、見ての通り一発でインストールが通らないだけでも何が起こっているかいまいちわかりづらいエラーが出るシステムは、何かあった時もやはり何が起こっているかいまいちわかりづらいエラーが出て復旧が面倒という印象だった。次回構築するときは別の方法を検討したいと思う。

優秀なプラグインが公開されているおかげでなんてこともない……はずなのだが、なんか迷走した挙句にすごく簡単にできることがわかったのでメモ。キーワードは「いらんことすんな」。

手順

  • Jenkins スレーブとして構成する。つまり、とりあえず最初に Jenkins スレーブにする。ホームディレクトリは必要だが、sudo できる必要はない。
  • gradle を入れる。
  • Jenkins に “Android Emulator Plugin” を入れる。つまり、 Android SDK はまだ入れない。
  • なんでもいいから Android アプリのテストを試みる。つまり、 Android SDK を自分で入れようなどと考えずにテストを試みる。プラグインが入れてくれるが、失敗した。
  • ここで初めて Android SDK を触る。結局のところ Android SDK を入れようとして完全には headless で入らなかったという状況になっているので、 Jenkins と同じ権限で (workspace)/tools/android-sdk/tools/bin/sdkmanager –list を実行する。
  • 再度テストを試みる。通る。

ここで余計なことをすると、

Warning: File /home/xxxx/.android/repositories.cfg could not be loaded.

とか

['(workspace)/tools/android-sdk']: Does not look like an Android SDK directory

とか、とにかく「なんで???」としか言いようがないエラーメッセージを睨めっこして、ぐぐっても必要な情報が出なくて苦労することになる。

Android SDK のみの Linux へのインストール

Jenkins での自動ビルドなどで、 Android SDK 単体をインストールしたくなることがあるが、その時困った情報をメモ。

手順メモ

Ubuntu 16.04 を使用

  • openjdk-8-jdk, gralde をインストール
  • Android Studio のページから、 SDK のみの Linux 版をダウンロード。sdk-tools-linux-*.zip というファイル名だった。
  • 解凍すると tools というディレクトリができた。
  • /opt/android-sdk を作成し、先ほどのディレクトリは /opt/android-sdk/tools に配置した。環境変数 ANDROID_HOME は /opt/android-sdk に設定。
  • sudo /opt/android-sdk/tools/bin/sdkmanager “platform-tools” “platforms;android-26” 的な感じでインストール
  • /opt/android-sdk はビルドする対象(Jenkins とか)から書き込めるパーミッションに設定
  • (環境構築とは別) Windows 版の Android Studio で作成されたディレクトリを使用するにあたり、 (PROJECTROOT)/graldew を chmod +x する必要があった。

参考サイト