今までは普通に動作していたあるアプリがAndroid 8系からデバッグで起動しなくなったので調査しました

環境

Android: 実機のAndroid 8系
Android Studio: 3系
proguard:有
言語:Java, C++(NDK)

現象

アプリを実機に転送して起動するタイミングでクラッシュする

Logcatは下記の通り

    java.lang.RuntimeException: Unable to get provider com.google.firebase.provider.FirebaseInitProvider: java.lang.ClassNotFoundException: Didn't find class "com.google.firebase.provider.FirebaseInitProvider" on path: DexPathList[[zip file "/data/app/test-app-kg6Lsjzujg==/base.apk", zip file "/data/app/test-app-kg6Lsjzujg==/split_lib_directories_apk.apk", zip file "/data/app/test-app-kg6Lsjzujg==/split_lib_resources_apk.apk"],nativeLibraryDirectories=[/data/app/test-app-kg6Lsjzujg==/lib/arm, /system/fake-libs, /data/app/test-app-kg6Lsjzujg==/base.apk!/lib/armeabi-v7a, /data/app/test-app-kg6Lsjzujg==/split_lib_directories_apk.apk!/lib/armeabi-v7a, /data/app/test-app-kg6Lsjzujg==/split_lib_resources_apk.apk!/lib/armeabi-v7a, /system/lib, /system/vendor/lib]]
        at android.app.ActivityThread.installProvider(ActivityThread.java:6319)
        at android.app.ActivityThread.installContentProviders(ActivityThread.java:5882)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5803)
        at android.app.ActivityThread.-wrap1(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1666)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:251)
        at android.app.ActivityThread.main(ActivityThread.java:6572)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

解決策

proguardの設定に下記を追加する

-keep class com.google.firebase.** { *; }

原因

初めは65536dex問題(64K問題)でクラスが含められなかったのかなと思ったので、ここを参考にMultiDex問題について対処しましたが、効果はありませんでした
今回の原因はproguard(難読化)のキープ対象にcom.google.firebaseが対象になっておらず、難読化されたためです

でも、Android 7系まではそのまま動いていたのは、なぜなんだぜ...