AGP4+ 打包运行闪退,AGP7+ 正常(has code but is marked native or abstract)

问题

安装应用,点击图标启动立马闪退!

诡异的闪退: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

我对字节码也不是很熟悉,还是没搞清楚这个报错日志是啥意思,先记录下以后再说吧。

相关推荐
七月.末1 小时前
安卓aab包的安装教程,附带adb环境的配置
android·adb
SRC_BLUE_177 小时前
SQLI LABS | Less-39 GET-Stacked Query Injection-Intiger Based
android·网络安全·adb·less
无尽的大道10 小时前
Android打包流程图
android
镭封11 小时前
android studio 配置过程
android·ide·android studio
夜雨星辰48711 小时前
Android Studio 学习——整体框架和概念
android·学习·android studio
邹阿涛涛涛涛涛涛12 小时前
月之暗面招 Android 开发,大家快来投简历呀
android·人工智能·aigc
IAM四十二12 小时前
Jetpack Compose State 你用对了吗?
android·android jetpack·composer
奶茶喵喵叫12 小时前
Android开发中的隐藏控件技巧
android
Winston Wood14 小时前
Android中Activity启动的模式
android
众乐认证14 小时前
Android Auto 不再用于旧手机
android·google·智能手机·android auto