You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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文件:

  1. 解压目标AAR:unzip armnn.delegate-23.05.aar -d temp_aar
  2. 删除非标准ABI目录:rm -rf temp_aar/jni/arm64-v8.2-a
  3. 重新打包为AAR:cd temp_aar && zip -r ../armnn.delegate-23.05-fixed.aar .
  4. 将项目中依赖的AAR替换为修复后的armnn.delegate-23.05-fixed.aar

内容的提问来源于stack exchange,提问作者Burton2000

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 05:10:18