Android arm64打包支持

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 armeabi_v7a = []
            List 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 armeabi_v7a, List 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;
    }

你可能感兴趣的:(Android,android)