Android项目升级AGP至8.0.2后因arm64-v8.2-a ABI构建失败求助
解决AGP 8.0.2下arm64-v8.2-a ABI识别报错问题
核心原因
AGP 8.x版本对JNI目录的检查逻辑更严格,会扫描依赖AAR中的所有JNI子目录,而arm64-v8.2-a并非Android官方定义的标准ABI(官方标准ABI包括arm64-v8a、armeabi-v7a等),因此触发报错。旧版AGP会自动忽略非标准ABI目录,所以之前的abiFilters或abi splits配置只控制最终打包的ABI范围,无法跳过AGP 8.x的前置扫描检查。
解决方案1:用packagingOptions排除非标准ABI目录
直接在app模块的build.gradle(或build.gradle.kts)中添加打包排除规则,让AGP跳过对arm64-v8.2-a目录的扫描:
android { packagingOptions { // 排除AAR中的arm64-v8.2-a目录及所有子文件 exclude "jni/arm64-v8.2-a/**" } }
这个配置是最简洁的解决方案,直接在打包阶段过滤掉有问题的目录,避免AGP触发检查报错。
解决方案2:自定义Gradle Transform移除非标准ABI目录
如果packagingOptions无法生效(比如依赖的AAR被其他插件提前处理),可以自定义Transform在依赖处理阶段就移除目标目录:
在app模块的build.gradle中添加如下代码:
android { // 注册自定义Transform project.android.registerTransform(new RemoveUnsupportedAbiTransform()) } // 自定义Transform类,移除arm64-v8.2-a目录 class RemoveUnsupportedAbiTransform extends com.android.build.api.transform.Transform { @Override String getName() { return "RemoveUnsupportedAbiTransform" } @Override Set<com.android.build.api.transform.QualifiedContent.ContentType> getInputTypes() { return Collections.singleton(com.android.build.api.transform.QualifiedContent.DefaultContentType.CLASSES) } @Override Set<? super com.android.build.api.transform.QualifiedContent.Scope> getScopes() { return Collections.singleton(com.android.build.api.transform.QualifiedContent.Scope.PROJECT_LOCAL_DEPS) } @Override boolean isIncremental() { return false } @Override void transform(com.android.build.api.transform.Context context, Collection<com.android.build.api.transform.TransformInput> inputs, Collection<com.android.build.api.transform.TransformInput> referencedInputs, com.android.build.api.transform.TransformOutputProvider outputProvider, boolean isIncremental) throws IOException, TransformException, InterruptedException { inputs.each { input -> // 处理JAR格式的依赖(AAR会被解压为JAR或目录) input.jarInputs.each { jarInput -> def dest = outputProvider.getContentLocation( jarInput.name, jarInput.contentTypes, jarInput.scopes, com.android.build.api.transform.Format.JAR) // 临时解压JAR,排除目标目录后重新打包 def tempDir = File.createTempDir() project.copy { from project.zipTree(jarInput.file) into tempDir exclude "jni/arm64-v8.2-a/**" } project.copy { from tempDir into dest } tempDir.deleteDir() } // 处理目录格式的依赖 input.directoryInputs.each { dirInput -> def dest = outputProvider.getContentLocation( dirInput.name, dirInput.contentTypes, dirInput.scopes, com.android.build.api.transform.Format.DIRECTORY) project.copy { from dirInput.file into dest exclude "jni/arm64-v8.2-a/**" } } } } }
解决方案3:直接修改AAR文件(一次性操作)
如果不想修改Gradle配置,可以手动修复AAR文件:
- 解压目标AAR:
unzip armnn.delegate-23.05.aar -d temp_aar - 删除非标准ABI目录:
rm -rf temp_aar/jni/arm64-v8.2-a - 重新打包为AAR:
cd temp_aar && zip -r ../armnn.delegate-23.05-fixed.aar . - 将项目中依赖的AAR替换为修复后的
armnn.delegate-23.05-fixed.aar
内容的提问来源于stack exchange,提问作者Burton2000
相关产品推荐
相关产品推荐

