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<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打包支持

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android开发中,如果你想在64位设备上运行你的应用程序,你需要使用64位版本的NDK和相应的编译器进行打包。以下是一些步骤,可以帮助你打包出64位应用程序: 1. 在你的项目中,确保你使用的是64位版本的NDK。你可以在build.gradle文件中添加以下代码,来指定使用64位NDK: ``` android { ndk { abiFilters 'arm64-v8a', 'x86_64' } } ``` 这将指定使用arm64-v8a和x86_64架构的NDK,这些架构都是64位的。 2. 确保你使用的是64位版本的编译器。你可以在build.gradle文件中添加以下代码,来指定使用64位编译器: ``` android { compileOptions { targetCompatibility 1.8 sourceCompatibility 1.8 coreLibraryDesugaringEnabled true coreLibraryDesugaringConfiugration 'com.android.tools:desugar_jdk_libs:1.1.5' } } ``` 这将指定使用Java 8的64位版本编译器。此外,还需要启用核心库转换和相应的配置。 3. 在构建过程中,确保你使用的是64位版本的Gradle。你可以在gradle.properties文件中添加以下代码,来指定使用64位版本的Gradle: ``` org.gradle.jvmargs=-Xmx4g -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 ``` 这将配置Gradle的JVM参数,使其能够正确地运行64位版本的Gradle。 4. 最后,你需要使用64位版本的签名文件,来签署你的应用程序。你可以使用64位版本的keytool和jarsigner工具来创建和签署你的应用程序。 通过以上步骤,你就可以打包出64位应用程序,并在64位设备上运行你的应用程序了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值