失踪人口回归~
最近在研究游戏在安卓平台的打包,遇到了不少坑,特此写个文章记录下~
1.Unity与安卓的交互
虽然Unity可以直接导出apk安装包,但由于有些方法,比如读取手机相册图片,获取权限等,或者是添加SDK都不能直接通过Unity实现。我们一般用Unity导出安卓工程,再通过Android Studio修改之后打出apk包。
通常情况下每次打包都需要修改,为了偷懒~
这里提供个堪称一劳永逸的解决办法,请看文章~
https://www.jianshu.com/p/86b275da600e
2.Android aar文件修改
今天刚踩得坑,麻蛋!
不同于jar包只能包含java代码,aar包还可以保存贴图等资源,相当于一个后缀是aar的压缩包。有时候第三方sdk提供的也是aar文件,当需要修改里面的东西时,比如删掉里面一个jar。切记不能采取先解压,删除完毕再压缩回去,后缀改成aar的操作。这样修改后Android Studio用不了!!!
正确方法是以解压的形式打开(不是解压压缩包),一般Windows平台的压缩软件都可以,然后在压缩软件里增加或删除文件操作。
3.Android aar文件读取
同上,又是个巨坑,匪夷所思!
我目前的项目在安卓端是这样的,把用到的sdk和需要在安卓端才能调用的方法打成aar包,然后添加到Unity导出的安卓工程里,但是不知道为什么在运行的时候会报以下的错误;
说的是BGPlayerService类重复,可是我的找遍了真个项目和aar包也只有一个类,根本没有重复的地方。研究了很久都无解,就在准备放弃治疗的时候顺便改了下build.gradle的dependencies里的语句,从
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation project(':localizedappnamelib')
implementation 'com.android.support:support-core-utils:24.2.0'
implementation (name:'findingparadiselib-debug',ext:'aar')
}
改成了
dependencies {
implementation (name:'findingparadiselib-debug',ext:'aar')
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation project(':localizedappnamelib')
implementation 'com.android.support:support-core-utils:24.2.0'
}
然后特么问题解决了!
???
我怀疑可能是implementation fileTree(include: [‘*.jar’], dir: ‘libs’)把aar包里的jar也算进去了_(:з」∠)_
4.生成签名安装包的时候报错
在第一次生成签名安装包的时候可能提示缺少xxx.pom(忘了是不是pom后缀了,反正差不多)和xxx.jar组件,这个报错在生成debug包的时候是不出现的。具体原因我不清楚,我猜是打包的时候需要这样依赖包,但是谷歌的官方站点没有(Android Studio提供的链接点进去404)。
两个解决办法,一是手动下载这些依赖包并放到指定的目录中去,不过不建议这样做,一个一个下载再放到指定目录太麻烦了。
第二中解决方法是使用阿里提供的站点,具体操作是将以下的代码方放到安卓工程的build.gradle文件的repositories代码块中去:
maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter' }
maven { url 'http://maven.aliyun.com/nexus/content/repositories/google' }
maven { url 'http://maven.aliyun.com/nexus/content/repositories/gradle-plugin' }
这样打包的时候Android Studio会自动去这些站点下载需要的依赖包,问题解决。
5.Execution failed for task ‘:app:ndkBuild’.
该问题是在对一个老游戏升级的时候出现的,表现为无法打包,报错:
Process 'command 'D:\SDK\***/ndk-build.cmd'' finished with non-zero exit value 2
上网搜索,普遍的解决方式是使用低版本的NDK,又或者是删除src/main/obj文件夹里的内容,尝试无果。
最终发现是build.gradle版本较老,且使用ndkBuild的方式打包,不适用于新版的Android Studio,修改之后问题解决
修改前:
android {
signingConfigs {
}
compileSdkVersion 26
buildToolsVersion '23.0.3'
defaultConfig {
applicationId "com.xd.swords.and"
minSdkVersion 19
targetSdkVersion 26
versionCode 18
versionName "1.1.7"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
sourceSets.main.jni.srcDirs = []
// disable automatic ndk-build call, which ignore our Android.mk
sourceSets.main.jniLibs.srcDir 'src/main/libs'
// call regular ndk-build(.cmd) script from app directory
task ndkBuild(type: Exec) {
workingDir file('src/main')
commandLine getNdkBuildCmd()
}
tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn ndkBuild
}
task cleanNative(type: Exec) {
workingDir file('src/main')
commandLine getNdkBuildCmd(), 'clean'
}
clean.dependsOn cleanNative
}
修改后:
android {
signingConfigs {
}
compileSdkVersion 26
buildToolsVersion '23.0.3'
defaultConfig {
applicationId "com.xd.swords.and"
minSdkVersion 19
targetSdkVersion 26
versionCode 18
versionName "1.1.7"
ndk {
abiFilters 'armeabi-v7a'
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
externalNativeBuild {
ndkBuild {
path "src/main/jni/Android.mk"
}
}
// 下面部分代码应该也可以删掉。
sourceSets.main.jni.srcDirs = []
// disable automatic ndk-build call, which ignore our Android.mk
sourceSets.main.jniLibs.srcDir 'src/main/libs'
// call regular ndk-build(.cmd) script from app directory
}
对比前后,主要是删除了旧的ndkBuild代码,然后设置abiFilters等。
1 comment
😎