LobiのAndroidアプリ開発を Android Studio 3.0 に移行しました!

こんにちは!

ゲームコミュニティ事業部(Lobi)サービス基盤チームでアプリエンジニアをしているジェイソンです。

ついにAndroid Studio 3.0 正式版がリリースされましたね。 Android Studio 3.0 では、Kotlin の正式サポートをはじめとして様々な新機能や変更が含まれています。

というわけで、さっそくLobiのAndroidアプリ開発を、Android Studio 3.0 に移行しました。

ゲーム攻略チャットSNS、マルチ掲示板 Lobi(ロビー)

本記事では移行にあたって、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 は非推奨となり、代わりに implementationapi を使うことが推奨されています。

implemntationapi の違いについて簡単に説明すると、外部(モジュールの利用者)に対して、モジュールの依存関係を公開するかしないかで使い分けることになります。 たとえば、依存関係を外部に公開するのであれば api を、依存関係をモジュール内部でのみ使用し外部に公開しないのであれば implementation を使うということです。 同様に provided の代わりに compileOnlyを、 apk の代わりに runtimeOnly を使うことが推奨されています。

このあたりは公式ドキュメントをご覧になっていただくと、より理解が深まります。

Use the new dependency configurations - Migrate to Android Plugin for Gradle 3.0.0

Androidライブラリのビルドバリアント設定

今までは、アプリモジュールをデバッグビルドしていても、アプリモジュールはライブラリのリリースビルドを使用するのが標準でした。 もしライブラリをリリース以外のビルドタイプでビルドしたい場合、以下の二つの設定が必要です。

  1. ライブラリモジュールの build.gradlepublishNonDefault true を設定する
  2. アプリモジュールの依存関係で、以下のように追加する
dependencies {
    debugCompile project(path: ':library', configuration: 'debug')
    releaseCompile project(path: ':library', configuration: 'release')
}

Android Studio 3.0 では、モジュールの依存関係を implementation にしていると、アプリモジュールのビルドバリアントを引き継いでくれるようになりました。 なので、ライブラリをリリース以外のビルドタイプでビルドしたい場合、以下のように設定します。ちょっとだけ簡単になりましたね。

  1. ライブラリモジュールの build.gradlepublishNonDefault true を設定する
  2. アプリモジュールの依存関係で、以下のように追加する
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.propertiesandroid.deprecatedNdkCompileLease=1508989475208 と設定すると継続してビルドできるようです。

しかしこれはあくまで延命手段なので、抜本的な解決策を模索するのがよいでしょうね。

まとめ

本記事では、待ちに待った Android Studio 3.0 を気兼ねなく使えるよう、Android Studio 3.0(Android Plugin for Gradle 3.0)対応のために、どういったことをしなければならないかをまとめました。

Android Studio 3.0 は様々な新機能や変更が盛り込まれた、半年ぶりの大規模なアップデートでした。

本記事によって、より新しい環境にスムーズに移行できる一助ができれば幸いです!

カヤックではAndroid Studio 3.0 にアップデートしたい欲を抑えられないエンジニアを募集しています!

カヤックではKotlinに移行したくて仕方がないエンジニアも募集しています!