我在 gradle 中使用以下拆分代码来减小 APK 大小:
splits {
abi {
// Enable ABI split
enable true
// Clear list of ABIs
reset()
// Specify each architecture currently supported by the Video SDK
include "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
// Specify that we do not want an additional universal SDK
universalApk false
}
}
当我运行应用程序时,APK 生成良好,尺寸减小并在模拟器上运行。
但是当我尝试从“构建”>“构建捆绑包/apk”构建 APK 文件时,例如
我收到此错误:
Execution failed for task ':app:packageAbcDebug'.
> A failure occurred while executing com.android.build.gradle.tasks.PackageAndroidArtifact$IncrementalSplitterRunnable
> Could not find EOCD in '....apk'
Possible solution:
- Declare repository providing the artifact, see the documentation at https://docs.gradle.org/current/userguide/declaring_repositories.html
我只想排除“x86”架构,以减少 APK 大小并需要将 APK 发送给我的客户。我该如何解决这个问题?
我在构建过程中遇到了类似的问题,尽管我没有启用拆分。你想怎样就怎样吧。
在深入研究 PackageAndroidArtifact 的源代码包和 Android 中的其他源代码后,我发现“EOCD”意味着“中央目录结束”。也就是说,它与构建输出时构建的 zip 文件的结束标记相关。 (Android 源工具包中注释的链接。)
就我自己而言,我发现即使我要求 Android Studio 彻底清理我的构建目录,它也会留下 app-debug.apk 构建工件文件。 (出于某种原因,我正在尝试打包 APK 的调试版本以进行内部测试。)不知何故该文件已损坏,这完全混淆了构建过程。
解决方案是在运行构建过程之前手动删除 apk 文件。 (就我而言,它位于我的构建的 app/debug 目录中,位于 app/build 目录旁边。)
G'图...
可能已经晚了,但这是解决方案及其起作用的理由。
由于我们使用拆分为每个架构创建 apk,因此构建系统需要为每个生成的 apk 使用不同的名称。
最好的解决方案是提供动态生成 apk 名称的方法。
只需转到应用程序级别的 build.gradle 文件 在 android 块内的 buildTypes 块中添加发布/调试构建变体的规则,如下所示
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
applicationVariants.all { variant ->
variant.outputs.all { output ->
project.ext { appName = 'YourApkName' }
outputFileName = "${appName}-${output.getFilter(OutputFile.ABI)}-${variant.name}-${variant.versionName}.apk"
}
}
}
}
说明: 这里的 apk 名称附加了 ABI 名称,有助于构建系统识别每个架构的 apk。
如果您开发 flutter 应用程序,您应该打开终端并输入:
flutter clean && flutter pub get