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

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

相关推荐
LuXi_foryou28 分钟前
【2025深夜随笔】简单认识一下Android Studio
android·ide·android studio
缘来的精彩30 分钟前
Android Studio Gradle 8.0 适配指南
android·ide·android studio
星仔_X32 分钟前
Android Studio安装配置
android·ide·android studio
驜鸈1 小时前
MySQL 的EXPLAIN 计划 type 字段详细说明
android·数据库·mysql
二流小码农1 小时前
鸿蒙开发:wrapBuilder传递参数
android·ios·harmonyos
ljx14000525502 小时前
推荐一个基于Koin, Ktor & Paging等组件的KMM Compose Multiplatform项目
android·kotlin
lrydnh3 小时前
数据库语句
android·数据库
去看全世界的云3 小时前
【Kotlin】Kotlin基础笔记
android·java·笔记·kotlin
tangweiguo030519873 小时前
Android打造易用的 WiFi 工具类:WifiUtils 封装实践
android·java·wifi
Legendary_0084 小时前
LDR6500:革新手机OTG充电体验的关键芯片
android·智能手机