0
点赞
收藏
分享

微信扫一扫

Android arm64打包支持

河南妞 2022-04-29 阅读 70
Androidarm64

首先要检查你的项目中是否都包含支持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;
    }

转自:Android arm64打包支持

举报

相关推荐

0 条评论