一个象棋APP,几年前写的,源代码可打包成32位APP,但是没有做成64位的APP,没有办法安装在64位手机上。

在网上搜索了一下,发现方法非常的简单。基本上就是在项目中的Gradle里改一些东西,也就是把.so文件加到apk文件里去。

在项目Build.Gradle里增加了如下代码:

project(":app") {
    apply plugin: "com.android.application"

    configurations { natives }
}

这个是把natives这个变量加进去,后面要用到。

在app的Build.Gradle里增加了如下五段代码:
代码一:

defaultConfig {
ndk.abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'

这个可以添加加.so文件,自动适应不同版本的安卓手机。

代码二:

task copyAndroidNatives {
    doFirst {
        file("libs/armeabi-v7a/").mkdirs()
        file("libs/arm64-v8a/").mkdirs()
        file("libs/x86_64/").mkdirs()
        file("libs/x86/").mkdirs()

        configurations.natives.copy().files.each { jar ->
            def outputDir = null
            if (jar.name.endsWith("natives-arm64-v8a.jar")) outputDir = file("libs/arm64-v8a")
            if (jar.name.endsWith("natives-armeabi-v7a.jar")) outputDir = file("libs/armeabi-v7a")
            if(jar.name.endsWith("natives-x86_64.jar")) outputDir = file("libs/x86_64")
            if(jar.name.endsWith("natives-x86.jar")) outputDir = file("libs/x86")
            if(outputDir != null) {
                copy {
                    from zipTree(jar)
                    into outputDir
                    include "*.so"
                }
            }
        }
    }
}

这个就能自动生成所需要的各种.so文件,并且把它放在libs文件夹里。

代码三:


sourceSets {
        main {
jniLibs.srcDirs = ['libs']
        }
    }

这个是照抄另一个兼容各种系统的APP的,具体就是设置一个文件夹libs,为代码四运行提供位置吧。我还没有清楚有什么用,暂时放这里吧。

代码四:


tasks.whenTaskAdded { packageTask ->
    if (packageTask.name.contains("merge") && packageTask.name.contains("JniLibFolders")) {
        packageTask.dependsOn 'copyAndroidNatives'
    }
}

代码五:

task run(type: Exec) {
    def path
    def localProperties = project.file("../local.properties")
    if (localProperties.exists()) {
        Properties properties = new Properties()
        localProperties.withInputStream { instr ->
            properties.load(instr)
        }
        def sdkDir = properties.getProperty('sdk.dir')
        if (sdkDir) {
            path = sdkDir
        } else {
            path = "$System.env.ANDROID_HOME"
        }
    } else {
        path = "$System.env.ANDROID_HOME"
    }

    def adb = path + "/platform-tools/adb"
    commandLine "$adb", 'shell', 'am', 'start', '-n', 'com.xxx/com.xxx.AndroidLauncher'
}


com.xxx就是项目的包名,改成你自己的。这个也是抄的。AndroidLauncher这个文件,我都没有。显然这段代码也许没有用。

总结:这些代码片断,前面两个是必须加的。后面三个可能用不到。暂时也放在这里吧。为什么要放在这里呢?因为这个过程远没有文章写的这么简单,中间出了很多问题,尤其是兼容问题。Android Studio、Gradle、JDK之间的配套,要让它们与源码中的依赖库兼容,真的需要自己去一个个试。太旧,没法打包成64位的。太新,部分不兼容。还有各个依赖库的AndroidManifest.xml文件中,有<intent-filter>这个标签的Activity和Service,必须设置android:exported=“true”。
最后发现打包后原本只有2.9M的APK文件,变成了4.9M了。如果单独打包成只适应64位版本,可能还是2.9M吧。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐