こんにちは!
ゲームコミュニティ事業部(Lobi)サービス基盤チームでアプリエンジニアをしているジェイソンです。
ついにAndroid Studio 3.0 正式版がリリースされましたね。 Android Studio 3.0 では、Kotlin の正式サポートをはじめとして様々な新機能や変更が含まれています。
- Java8サポートの強化
- Android Profiler
- CMake、ndk-buildや、Gradle syncの高速化
- Android Asset Packaging Tool 2.0 (AAPT2) がデフォルトでON
というわけで、さっそくLobiのAndroidアプリ開発を、Android Studio 3.0 に移行しました。
本記事では移行にあたって、Android Studio 3.0(Android Plugin for Gradle 3.0)対応のために、どういったことをしなければならないかをまとめました。 プロジェクトによって対応不要なものや、本記事に記載のない対応が必要になるかもしれませんが、参考にしていただければと思います!
Android Plugin for Gradle 3.0.0
まずは、Androd Plugin for Gradle 3.0.0 に更新しないと始まりませんよね。
top-level(root直下)の build.gradle
ファイルに、以下を記載します。
dependencies { classpath 'com.android.tools.build:gradle:3.0.0' }
buildToolsVersion 26.0.2
Android Plugin for Gradle 3.0.0 を使うためには、SDK Build Tools も更新しなければいけません。
モジュール単位の build.gradle
ファイルに、以下を記載しましょう。
android { buildToolsVersion '26.0.2' }
Gradle 4.1
Gradleも最新にする必要があります。
gradle-wrapper.properties
ファイルに、以下を記載しましょう。
distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip
Flavor Dimensions
Android Studio 3.0 から、すべての Flavor に対して、Flavor Dimensions の設定が必須となりました。
未設定の場合、以下のようなメッセージとともにビルドエラーとなるので注意しましょう。
Error:All flavors must now belong to a named flavor dimension. The flavor 'flavor_name' is not assigned to a flavor dimension.
新しい dependency configuration
Android Studio 3.0 から、 compile
は非推奨となり、代わりに implementation
か api
を使うことが推奨されています。
implemntation
と api
の違いについて簡単に説明すると、外部(モジュールの利用者)に対して、モジュールの依存関係を公開するかしないかで使い分けることになります。
たとえば、依存関係を外部に公開するのであれば api
を、依存関係をモジュール内部でのみ使用し外部に公開しないのであれば implementation
を使うということです。
同様に provided
の代わりに compileOnly
を、 apk
の代わりに runtimeOnly
を使うことが推奨されています。
このあたりは公式ドキュメントをご覧になっていただくと、より理解が深まります。
Use the new dependency configurations - Migrate to Android Plugin for Gradle 3.0.0
Androidライブラリのビルドバリアント設定
今までは、アプリモジュールをデバッグビルドしていても、アプリモジュールはライブラリのリリースビルドを使用するのが標準でした。 もしライブラリをリリース以外のビルドタイプでビルドしたい場合、以下の二つの設定が必要です。
- ライブラリモジュールの
build.gradle
にpublishNonDefault true
を設定する - アプリモジュールの依存関係で、以下のように追加する
dependencies { debugCompile project(path: ':library', configuration: 'debug') releaseCompile project(path: ':library', configuration: 'release') }
Android Studio 3.0 では、モジュールの依存関係を implementation
にしていると、アプリモジュールのビルドバリアントを引き継いでくれるようになりました。
なので、ライブラリをリリース以外のビルドタイプでビルドしたい場合、以下のように設定します。ちょっとだけ簡単になりましたね。
- ライブラリモジュールの
build.gradle
にpublishNonDefault true
を設定する - アプリモジュールの依存関係で、以下のように追加する
dependencies { implementation project(path: ':library') }
Android Asset Packaging Tool 2.0 (AAPT2) 対応
Android Studio 3.0 から、Android Asset Packaging Tool 2.0 (AAPT2) を使ったリソース処理がデフォルト動作となりました。
もしAAPT2を使いたくない場合は、 gradle.properties
に以下を追記してください。
android.enableAapt2=false
AAPT2有効時に、Support Library がビルドエラー
AAPT2が有効の場合、Support Library でビルドエラーが発生することがあります。
C:\Users\hogehoge\.gradle\caches\transforms-1\files-1.1\appcompat-v7-26.0.2.aar\fee37bff362162d6a864b5b32c15cd0e\res\values\values.xml Error:(387, 5) error: style attribute '@android:attr/windowEnterAnimation' not found. Error:(387, 5) error: style attribute '@android:attr/windowExitAnimation' not found. C:\Kayac\hogehoge\app\NakamapNewUI\app\build\intermediates\incremental\mergeDevelopDebugResources\merged.dir\values\values.xml Error:(1804) style attribute '@android:attr/windowEnterAnimation' not found. Error:(1805) style attribute '@android:attr/windowExitAnimation' not found. Error:failed linking references. Error:java.util.concurrent.ExecutionException: java.util.concurrent.ExecutionException: com.android.tools.aapt2.Aapt2Exception: AAPT2 error: check logs for details Error:java.util.concurrent.ExecutionException: com.android.tools.aapt2.Aapt2Exception: AAPT2 error: check logs for details Error:com.android.tools.aapt2.Aapt2Exception: AAPT2 error: check logs for details Error:Execution failed for task ':app:processDevelopDebugResources'. > Failed to execute aapt
この場合、 @android:attr/windowEnterAnimation
と @android:attr/windowExitAnimation
という属性が見つからないよ、というエラーのようです。
AAPT2が有効で、名前空間からリソースにアクセスしたいとき、リソース参照シンボル(@)を付与すると上記のようなエラーが発生してしまうようなので、以下のように name
属性から @
を削除することで問題が解消しました。
<style name="Animations_Fading"> - <item name="@android:windowEnterAnimation">@android:anim/fade_in</item> - <item name="@android:windowExitAnimation">@android:anim/fade_out</item> + <item name="android:windowEnterAnimation">@android:anim/fade_in</item> + <item name="android:windowExitAnimation">@android:anim/fade_out</item> </style>
これについても、 公式ドキュメント にしっかりまとまっています。
android.useDeprecatedNdk はもう使えない
android.useDeprecatedNdk
を使っていると、いよいよビルドが通らなくなってしまいました。
Error:FAILURE: Build completed with 2 failures. 1: Task failed with an exception. ----------- * What went wrong: Execution failed for task ':app:compileDevelopDebugNdk'. > Error: Flag android.useDeprecatedNdk is no longer supported and will be removed in the next version of Android Studio. Please switch to a supported build system. Consider using CMake or ndk-build integration. For more information, go to: https://d.android.com/r/studio-ui/add-native-code.html#ndkCompile To get started, you can use the sample ndk-build script the Android plugin generated for you at: C:\Kayac\project\app\hogehoge\app\build\intermediates\ndk\develop\debug\Android.mk Alternatively, you can use the experimental plugin: https://developer.android.com/r/tools/experimental-plugin.html To continue using the deprecated NDK compile for another 60 days, set android.deprecatedNdkCompileLease=1508989475208 in gradle.properties * Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. ==============================================================================
ただし60日間限定で、 gradle.properties
に android.deprecatedNdkCompileLease=1508989475208
と設定すると継続してビルドできるようです。
しかしこれはあくまで延命手段なので、抜本的な解決策を模索するのがよいでしょうね。
まとめ
本記事では、待ちに待った Android Studio 3.0 を気兼ねなく使えるよう、Android Studio 3.0(Android Plugin for Gradle 3.0)対応のために、どういったことをしなければならないかをまとめました。
Android Studio 3.0 は様々な新機能や変更が盛り込まれた、半年ぶりの大規模なアップデートでした。
本記事によって、より新しい環境にスムーズに移行できる一助ができれば幸いです!