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

2024-06-09 01:44

本文主要是介绍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;
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

分析

反编译查看安装包,上述两个日志说不存在的类,包里面确实是都存在的,那很奇怪为什么还报错找不到类?

仔细查看日志发现这么一条日志:

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

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

这篇关于AGP4+ 打包运行闪退,AGP7+ 正常(has code but is marked native or abstract)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1043912

相关文章

Python如何精准判断某个进程是否在运行

《Python如何精准判断某个进程是否在运行》这篇文章主要为大家详细介绍了Python如何精准判断某个进程是否在运行,本文为大家整理了3种方法并进行了对比,有需要的小伙伴可以跟随小编一起学习一下... 目录一、为什么需要判断进程是否存在二、方法1:用psutil库(推荐)三、方法2:用os.system调用

将Java程序打包成EXE文件的实现方式

《将Java程序打包成EXE文件的实现方式》:本文主要介绍将Java程序打包成EXE文件的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录如何将Java程序编程打包成EXE文件1.准备Java程序2.生成JAR包3.选择并安装打包工具4.配置Launch4

Python运行中频繁出现Restart提示的解决办法

《Python运行中频繁出现Restart提示的解决办法》在编程的世界里,遇到各种奇怪的问题是家常便饭,但是,当你的Python程序在运行过程中频繁出现“Restart”提示时,这可能不仅仅是令人头疼... 目录问题描述代码示例无限循环递归调用内存泄漏解决方案1. 检查代码逻辑无限循环递归调用内存泄漏2.

PyInstaller打包selenium-wire过程中常见问题和解决指南

《PyInstaller打包selenium-wire过程中常见问题和解决指南》常用的打包工具PyInstaller能将Python项目打包成单个可执行文件,但也会因为兼容性问题和路径管理而出现各种运... 目录前言1. 背景2. 可能遇到的问题概述3. PyInstaller 打包步骤及参数配置4. 依赖

Flutter打包APK的几种方式小结

《Flutter打包APK的几种方式小结》Flutter打包不同于RN,Flutter可以在AndroidStudio里编写Flutter代码并最终打包为APK,本篇主要阐述涉及到的几种打包方式,通... 目录前言1. android原生打包APK方式2. Flutter通过原生工程打包方式3. Futte

Java终止正在运行的线程的三种方法

《Java终止正在运行的线程的三种方法》停止一个线程意味着在任务处理完任务之前停掉正在做的操作,也就是放弃当前的操作,停止一个线程可以用Thread.stop()方法,但最好不要用它,本文给大家介绍了... 目录前言1. 停止不了的线程2. 判断线程是否停止状态3. 能停止的线程–异常法4. 在沉睡中停止5

在VSCode中本地运行DeepSeek的流程步骤

《在VSCode中本地运行DeepSeek的流程步骤》本文详细介绍了如何在本地VSCode中安装和配置Ollama和CodeGPT,以使用DeepSeek进行AI编码辅助,无需依赖云服务,需要的朋友可... 目录步骤 1:在 VSCode 中安装 Ollama 和 CodeGPT安装Ollama下载Olla

解读docker运行时-itd参数是什么意思

《解读docker运行时-itd参数是什么意思》在Docker中,-itd参数组合用于在后台运行一个交互式容器,同时保持标准输入和分配伪终端,这种方式适合需要在后台运行容器并保持交互能力的场景... 目录docker运行时-itd参数是什么意思1. -i(或 --interactive)2. -t(或 --

pycharm远程连接服务器运行pytorch的过程详解

《pycharm远程连接服务器运行pytorch的过程详解》:本文主要介绍在Linux环境下使用Anaconda管理不同版本的Python环境,并通过PyCharm远程连接服务器来运行PyTorc... 目录linux部署pytorch背景介绍Anaconda安装Linux安装pytorch虚拟环境安装cu

linux打包解压命令方式

《linux打包解压命令方式》文章介绍了Linux系统中常用的打包和解压命令,包括tar和zip,使用tar命令可以创建和解压tar格式的归档文件,使用zip命令可以创建和解压zip格式的压缩文件,每... 目录Lijavascriptnux 打包和解压命令打包命令解压命令总结linux 打包和解压命令打