AndroidStudio 3.4からコードシュリンカー・難読化にR8がデフォルトで使用されるようになりました。
自分が担当していアプリではProGuardは一般的な用途でしか使っていなかったのですが、この度R8に切り替えました。
特にアプリ自体に挙動の変化はなかったのですが、少し注意点がありました。
ただしすべての環境で再現するかは不明です・・・。
特定のビルドタイプで難読化を解除したい
自分たちのアプリはビルドタイプにDebugとReleaseの2つを使用しております。
Releaseでは難読化を行うのですがDebugでは難読化を行っていませんでした。
ところがAndroid Studio 3.4.1にアップデートしてデバッグ実行すると難読化が行われるようになりました。
[groovy]
minifyEnabled true
useProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules-debug.pro'
[/groovy]
R8とProguardの関連性がいまいちよくわかっていないのですが、おそらくR8が有効になっているからだとおもいます。
以下のようにDebugビルドタイプのときに読み込むProGuardの設定ファイルに以下を追加しました。
[groovy]
-dontobfuscate
[/groovy]
ProGuardが使われビルドに失敗した
実はAndroid Studio 3.3時代に自分たちのアプリで特定のライブラリが原因でProGuardでビルドが失敗する現象がありました。
特定のバージョンのProGuardを使うことでワークアラウンドで対応しておりました。
このワークアラウンドが書いてあるIssuesにAndroid Studio 3.4からR8が使われるからこのワークアラウンドは必要ないとも記載されておりました。
Android Studio 3.4.0にアップデートするとR8が使われるようになったので実際にこのワークアラウンドがない状態でもビルドが行えました。
ところがAndroid Studio 3.4.1にアップデートしてビルドすると同じエラーでビルドが失敗する現象が再発しました。
ProGuardが使われていることが原因なのですが、よく見返してみるとビルドタイプがReleaseの場合build.gradleでuseProguard true
となっていたためこれをuseProguard false
に変更してビルドし直すと正常にビルドできるようになりました。
ということは、3.4.0のときはR8とProGuardが変に混ざっていたのかな・・・。
Android Studio 3.4.1のリリースノートも見てみたのですが、どの記載が影響しているか知識不足でわかりませんでした。
Firebase Crashlytics
FirebaseのCrashlyticsでスタックトレースの難読化が解除されないという現象が発生しました。
これは使っているプラグインによるのでしょうが、自分たちはfabric-gradle-plugin
を使っていました。
このバージョンが1.28.0
以上じゃないとマッピングファイルがアップロードされないみたいです・・・。
fabric-gradle-plugin changelog
まとめ
いろいろありましたが、自分たちのアプリがそれほど大きくないので思ったより簡単に移行できました。
今の所体感ですがR8の恩恵はそれほどないのですが、最適化がより良くなっているみたいなのでよい影響はあるのだと思います。