把一个32位的APP改成兼容64位APP
一个象棋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吧。
更多推荐
所有评论(0)