1、如果是在小米、OPPO、VIVO、腾讯应用宝和百度手机助手五大应用商店上架的App,无论是新上架/升级的应用都需要在2021年12月底前上传包含64位包体的APK包,不再接受仅有32位版本的应用。
2、而在华为应用市场新上架/升级的应用,可在2022年1月完成上传包含 64 位版本的APK包。
首先要检查你的项目中是否都包含支持64位的so库,可以在app的build.gradle中添加如下代码,最后会输出不包含arm64位的so库
tasks.whenTaskAdded { task ->
if (task.name.startsWith("merge") && task.name.endsWith("NativeLibs")) {
task.doFirst {
def startTime = System.currentTimeMillis()
println "Support 64-bit => abi start."
List<String> armeabi_v7a = []
List<String> arm64_v8a = []
it.inputs.files.each { file ->
findSoFile(file, armeabi_v7a, arm64_v8a)
}
println("v7a size: ${armeabi_v7a.size()}")
println("arm64 size: ${arm64_v8a.size()}")
println("so in v7a, but not in arm64:")
armeabi_v7a.each {
if (!arm64_v8a.contains(it)) {
println("$it")
}
}
def endTime = System.currentTimeMillis()
println("${task.name} cost time ${endTime - startTime}ms")
}
}
}
def findSoFile(File file, List<String> armeabi_v7a, List<String> arm64_v8a) {
if (null == file) {
return
}
if (file.isDirectory()) {
file.listFiles().each {
findSoFile(it, armeabi_v7a, arm64_v8a)
}
} else if (file.absolutePath.endsWith(".so")) {
def soPath = file.absolutePath
def soName = file.name
println "Support 64-bit => so: ${file.absolutePath} ${file.name}"
// 如果你的so库存放文件夹名字不是这个,修改成你的文件夹名字
if (soPath.contains("armeabi-v7a")) {
armeabi_v7a.add(soName)
} else if (soPath.contains("arm64-v8a")) {
arm64_v8a.add(soName)
}
}
}
接着全局搜索,替换相关ndk配置
ndk {
abiFilters "armeabi-v7a", "arm64-v8a"
}
如果项目打包是本地打包不牵扯流水线,参考安卓AS 打包时分开生成32位和64位包 - 简书
我们项目中采用的方法是分开打包的方式,在app.gradle中修改
android{
// ......
flavorDimensions "ndk.abiFilters"
productFlavors {
arm32 {
ndk {
abiFilters 'armeabi-v7a'
}
}
if (isSupportArm64()) {
arm64 {
ndk {
abiFilters 'arm64-v8a'
}
manifestPlaceholders += [
CPU_ABI : 'arm64-v8a'
]
}
}
}
// ......
}
def isSupportArm64() {
def supportDualArch = project.hasProperty("SUPPORT_ARM64") ? SUPPORT_ARM64 : "0" // 通过 -P 设置
return supportDualArch == '1'
}
现在运行gradle assembleRelease
只会打32位的包,运行gradle assembleRelease -P SUPPORT_ARM64=1
会同时打32和64位的包
应用内检查更新的话可以参考Android判断应用是32位还是64位以及虚拟机类型 - 掘金 判断应该升级32位还是64位安装包,我是这样做的
/**
* 系统是否支持64位
* @return
*/
public static boolean isSupportArch64() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (Process.is64Bit()) {
return true;
}
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
String[] abis = Build.SUPPORTED_64_BIT_ABIS;
if (abis != null && abis.length > 0) {
return true;
}
}
return false;
}