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

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

相关推荐
怪兽20142 分钟前
Android View, SurfaceView, GLSurfaceView 的区别
android·面试
龚礼鹏37 分钟前
android 图像显示框架二——流程分析
android
消失的旧时光-194344 分钟前
kmp需要技能
android·设计模式·kotlin
帅得不敢出门1 小时前
Linux服务器编译android报no space left on device导致失败的定位解决
android·linux·服务器
雨白2 小时前
协程间的通信管道 —— Kotlin Channel 详解
android·kotlin
TimeFine4 小时前
kotlin协程 容易被忽视的CompletableDeferred
android
czhc11400756635 小时前
Linux1023 mysql 修改密码等
android·mysql·adb
GOATLong6 小时前
MySQL内置函数
android·数据库·c++·vscode·mysql
onthewaying7 小时前
Android SurfaceTexture 深度解析
android·opengl
茄子凉心7 小时前
Android Bluetooth 蓝牙通信
android·蓝牙通信·bluetooth通信