技術ネタ: 2015年8月アーカイブ
どうも。
保存用RITZを開封するか悩んでいます。 ハシモトです。
また、こちらなんですが、Elixirの特集があったんで読みたくて買ったわけなんですね。で、まぁElixirの特集もそれなりに面白く、またMQTTとかの特集も結構良かったんですが、他の特集で「モバイル開発最前線」というのがあって、これはAndroidの開発環境回りのお話だったので、チラッとやってみるかと思ったんですが、色々手こずったのでこちらにログを。 (ちなみにAndroidは出たばかりの頃にチラッとやっただけでほぼ初心者です)
サンプルアプリケーション
https://github.com/yanayanalte/SampleAndroid まず記事で紹介されているサンプルアプリケーションはこちらです。
おもむろに git clone してコンパイルを試みますが
git clone git@github.com:yanayanalte/SampleAndroid.git
cd SampleAndroid
./gradlew assembleDebug
:app:preBuild UP-TO-DATE
:app:preDebugBuild UP-TO-DATE
:app:compileDebugNdk UP-TO-DATE
:app:checkDebugManifest
:app:preReleaseBuild UP-TO-DATE
:app:prepareComAndroidSupportAppcompatV72211Library
:app:prepareComAndroidSupportSupportV42211Library
:app:prepareComCrashlyticsSdkAndroidAnswers122Library
:app:prepareComCrashlyticsSdkAndroidBeta112Library
:app:prepareComCrashlyticsSdkAndroidCrashlytics232Library
:app:prepareComCrashlyticsSdkAndroidCrashlyticsCore232Library
:app:prepareIoFabricSdkAndroidFabric133Library
:app:prepareDebugDependencies
:app:compileDebugAidl
:app:compileDebugRenderscript
:app:generateDebugBuildConfig
[Fatal Error] :22:27: 要素タイプ"android:value"に関連付けられている属性"{1}"には、開始引用符が必要です。
FAILURE: Build failed with an exception.
* What went wrong:
Cannot read packageName from path/to/SampleAndroid/app/src/main/AndroidManifest.xml
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
BUILD FAILED
Total time: 16.873 secs
あえなく失敗します。 どうやらAndroidManifest.xmlのandroid:valueがイカンとのことなので調べますと、fabricのAPI KEYの設定のようです。
Fabric
で、Fabric。Twitterが開発しているモバイルの開発プラットフォームというかクラッシュレポートとかをよろしくやってくれるようですが、こいつのAPI KEYがイカンと。
https://github.com/yanayanalte/SampleAndroid/blob/master/app/src/main/AndroidManifest.xml#L22
「XXXXXXXXXXX」という設定になっています。 fabric自体がよくわからないので、色々ググって、まずどうにかしてAPI KEYを手に入れる事に専念するわけですが、fabricにサインアップしても設定画面などは一向に出てこない。 設定画面から取れるという情報もあるが、そもそも以下の画面しか出てこない。
ので、取り敢えずAndroid Studioにプラグインを突っ込む事にする。 ここでsafariとかでやってるとプラグインのzipを勝手に解凍してしまうので注意。 基本的にはfabricのページの手順に沿ってインストール。 するとAndroidのアイコンの横にfabricのアイコンが現れる。
ので、これをクリックしてサインインして進める。
そして、サンプルアプリケーションをAndroid Studioで開いた状態からこのプラグインを起動させて進めていくと、以下のようにインストールするkitを選べとなる。
CrashlyticのUpdateをクリックすると、
こんな感じでAPI KEYを変更するぜ、と言われるのでApplyボタン(キャプチャでは見切れてますが)を押すとAndroidManifest.xmlが書き換わり、API KEYが取得できる。
$ vi ./app/src/main/AndroidManifest.xml
$ ./gradlew assembleDebug
:app:preBuild UP-TO-DATE
:app:preDebugBuild UP-TO-DATE
:app:compileDebugNdk UP-TO-DATE
:app:checkDebugManifest
:app:preReleaseBuild UP-TO-DATE
:app:prepareComAndroidSupportAppcompatV72211Library UP-TO-DATE
:app:prepareComAndroidSupportSupportV42211Library UP-TO-DATE
:app:prepareComCrashlyticsSdkAndroidAnswers122Library UP-TO-DATE
:app:prepareComCrashlyticsSdkAndroidBeta112Library UP-TO-DATE
:app:prepareComCrashlyticsSdkAndroidCrashlytics232Library UP-TO-DATE
:app:prepareComCrashlyticsSdkAndroidCrashlyticsCore232Library UP-TO-DATE
:app:prepareIoFabricSdkAndroidFabric133Library UP-TO-DATE
:app:prepareDebugDependencies
:app:compileDebugAidl UP-TO-DATE
:app:compileDebugRenderscript UP-TO-DATE
:app:generateDebugBuildConfig UP-TO-DATE
:app:generateDebugAssets UP-TO-DATE
:app:mergeDebugAssets UP-TO-DATE
:app:generateDebugResValues UP-TO-DATE
:app:generateDebugResources UP-TO-DATE
:app:mergeDebugResources UP-TO-DATE
:app:processDebugManifest
Warning: /path/to/SampleAndroid/app/src/main/AndroidManifest.xml:25:1 Warning:
Element uses-permission#android.permission.INTERNET at AndroidManifest.xml:25:1 duplicated with element declared at AndroidManifest.xml:5:5
/path/to/SampleAndroid/app/src/main/AndroidManifest.xml:25:1 Warning:
Element uses-permission#android.permission.INTERNET at AndroidManifest.xml:25:1 duplicated with element declared at AndroidManifest.xml:5:5
:app:fabricGenerateResourcesDebug
:app:processDebugResources
:app:generateDebugSources
:app:compileDebugJava
注意:一部の入力ファイルは非推奨のAPIを使用またはオーバーライドしています。
注意:詳細は、-Xlint:deprecationオプションを指定して再コンパイルしてください。
:app:preDexDebug
:app:dexDebug
:app:processDebugJavaRes UP-TO-DATE
:app:validateDebugSigning
:app:packageDebug
:app:zipalignDebug
:app:assembleDebug
BUILD SUCCESSFUL
Total time: 38.731 secs
めでたくビルド成功。
だがしかし
この企画はgithubにpushした上でのcircleCIでのビルドを前提としているはず。 API KEYをハードコーディングした状態でpushして良いはずがなかろう....。
ということで環境変数からうまく読み込む方法を調べる。
http://stackoverflow.com/questions/25700680/crashlytics-found-an-invalid-api-key#answer-25704532
安定のStack Overflow。 build.gradleに
manifestPlaceholders = [name: value]
とすれば
${name}
でAndroidManifest.xmlから変数で読み込める模様。 今々ではFlavorは無視するので、/app/build.gradleのdefaultConfigにこのmanifestPlaceholdersを突っ込みます。
あとはbuild.gradleはそもそもgradleなので、こいつに環境変数から値が渡ればOK。
build.gradleからの環境変数の参照 - horie1024の日記
こちらによれば、
ORG_GRADLE_PROJECT_
がプレフィックスにつく環境変数はbuild.gradleからそのまま読み込める模様。 なので、
$ export ORG_GRADLE_PROJECT_FABRIC_API_KEY="YOUR KEY"
$ vi ./app/build.gradle
defaultConfig {
....略....
manifestPlaceholders = [fabricApiKey: FABRIC_API_KEY]
}
$ vi ./app/src/main/AndroidManifest.xml
<meta-data
android:name="io.fabric.ApiKey"
android:value="${fabricApiKey}" />
というような感じにすればOK。 circleCIでも上記のようなORGGRADLEPROJECTFABRICAPI_KEYのような環境変数を充ててやればOK。
それにしてもデベロッパーフレンドリーじゃないサンプルだったな...。