问题
安装应用,点击图标启动立马闪退!
诡异的闪退:AGP4+ 打包运行闪退,AGP7+ 正常
unity 导出的 Android
日志两个主要点:
com.android.boot.App 是 Android 的 application 子类,程序入口
- java.lang.ClassNotFoundException: Didn't find class "com.android.boot.App"
o0o0O0o/OOO0oo/Ooo0oo/Ooo0oo/o0OOo0oo/oOo0o 是混淆之后的一个类(类名)
- java.lang.NoClassDefFoundError: Failed resolution of: Lo0o0O0o/OOO0oo/Ooo0oo/Ooo0oo/o0OOo0oo/oOo0o;
java
10:59:48.668 1664-1664 AndroidRuntime pid-1664 Shutting down VM
10:59:48.668 1664-1664 AndroidRuntime pid-1664 FATAL EXCEPTION: main
Process: com.primer.hello.world.gamecenter, PID: 1664
java.lang.RuntimeException:
Unable to instantiate application com.android.boot.App
package com.primer.hello.world.gamecenter:
java.lang.ClassNotFoundException:
Didn't find class "com.android.boot.App"
on path: DexPathList[[zip file "/data/app/~~W6mjZeLN-UnIJxZJb7wgMg==/com.primer.hello.world.gamecenter-Bem74GRkWNj-5Qcy_nln7A==/base.apk"],
nativeLibraryDirectories=[/data/app/~~W6mjZeLN-UnIJxZJb7wgMg==/com.primer.hello.world.gamecenter-Bem74GRkWNj-5Qcy_nln7A==/lib/arm64,
/data/app/~~W6mjZeLN-UnIJxZJb7wgMg==/com.primer.hello.world.gamecenter-Bem74GRkWNj-5Qcy_nln7A==/base.apk!/lib/arm64-v8a, /system/lib64,
/system_ext/lib64]]
at android.app.LoadedApk.makeApplication(LoadedApk.java:1377)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:7029)
at android.app.ActivityThread.access$1600(ActivityThread.java:274)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2128)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:210)
at android.os.Looper.loop(Looper.java:299)
at android.app.ActivityThread.main(ActivityThread.java:8258)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:556)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1045)
Caused by: java.lang.ClassNotFoundException:
Didn't find class "com.android.boot.App"
on path: DexPathList[[zip file "/data/app/~~W6mjZeLN-UnIJxZJb7wgMg==/com.primer.hello.world.gamecenter-Bem74GRkWNj-5Qcy_nln7A==/base.apk"],
nativeLibraryDirectories=[/data/app/~~W6mjZeLN-UnIJxZJb7wgMg==/com.primer.hello.world.gamecenter-Bem74GRkWNj-5Qcy_nln7A==/lib/arm64,
/data/app/~~W6mjZeLN-UnIJxZJb7wgMg==/com.primer.hello.world.gamecenter-Bem74GRkWNj-5Qcy_nln7A==/base.apk!/lib/arm64-v8a,
/system/lib64, /system_ext/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:218)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at android.app.AppComponentFactory.instantiateApplication(AppComponentFactory.java:76)
at androidx.core.app.CoreComponentFactory.instantiateApplication(SourceFile:1)
at android.app.Instrumentation.newApplication(Instrumentation.java:1177)
at android.app.LoadedApk.makeApplication(LoadedApk.java:1369)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:7029)
at android.app.ActivityThread.access$1600(ActivityThread.java:274)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2128)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:210)
at android.os.Looper.loop(Looper.java:299)
at android.app.ActivityThread.main(ActivityThread.java:8258)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:556)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1045)
Suppressed: java.lang.NoClassDefFoundError: Failed resolution of: Lo0o0O0o/OOO0oo/Ooo0oo/Ooo0oo/o0OOo0oo/oOo0o;
at java.lang.VMClassLoader.findLoadedClass(Native Method)
at java.lang.ClassLoader.findLoadedClass(ClassLoader.java:738)
at java.lang.ClassLoader.loadClass(ClassLoader.java:363)
Caused by: java.lang.ClassNotFoundException: o0o0O0o.OOO0oo.Ooo0oo.Ooo0oo.o0OOo0oo.oOo0o
分析
反编译查看安装包,上述两个日志说不存在的类,包里面确实是都存在
的,那很奇怪为什么还报错找不到类?
仔细查看日志发现这么一条日志:
java
15:22:18.220 17555-17555 arme.gamecente
com...earme.gamecenter Zip open failed:
Failure to verify dex file
'/data/app/~~NiJHoKmY37f-XK_bubBobg==
/com.primer.hello.world.gamecenter-HWN-Qr8S9Owht9MQ9453lA==
/base.apk!classes2.dex':
Method 62683(Lcom/unity3d/player/ReflectionHelper;.OOO)
has code, but is marked native or abstract
这条日志有两点:
好巧不巧,上述日志两个找不到的类刚好都在 classes2.dex 这个文件中
- Failure to verify dex file ... classes2.dex
因为这个是 unity 引擎导出的 Android 工程,所以有 ReflectionHelper 这个类
- Lcom/unity3d/player/ReflectionHelper;.OOO) has code, but is marked native or abstract
解决
误打误撞,一番搜索看到了希望,竟没想到闪退和 AGP 版本有关系,就此记录下(其实具体原因我也还没搞清楚)。
说明一下情况,unity 导出的 Android 工程默认是 APG7+
,那么用这个刚打出的 Android 工程打包得到的安装包运行是正常的
;
因出包需求,我们会把 Android 工程相关的 unity 部分(比如 assets/bin/data)导单独抽出来放到另外的 Android 工程(集成了自定义混淆插件等的 Android 模板工程
,主要负责出线上包),这个模板工程一只使用的是 AGP4+
,在这个模板工程打包得到的安装包运行是闪退的
。
一开始还怀疑过是自定义混淆导致的闪退,可能混淆了 unity 相关的某些类或资源导致,但是经测试似乎和混淆并无关系。
问题解决了
第二天在 GitHub 看到了这个 issue,跟着操作问题得到了解决。
Failure to verify dex file #1404
模板工程升级到 AGP7+ 再打包运行不闪退了。
你别说,你还真别说,让我想起了 unity 导出时就是 AGP7+
这里的报错日志也是相似的
Method 56370(Lorg/webrtc/PeerConnectionFactory;.
-$ N e s t Nest NestsmnativeCreatePeerConnectionFactory) has code, but is marked native or abstract
我对字节码也不是很熟悉,还是没搞清楚这个报错日志是啥意思,先记录下以后再说吧。