打包系列教程目录:
纯ant命令行打包android apk之图文从原理角度完全详解android打包过程(打包系列教程之一)
用ant的build.xml构建自动化打包android apk 完全详解(打包系列教程之二)
Android 多渠道打包之混淆文件ProGuard技术详解-特别篇(打包系列教程之三)
android studio gradle 多渠道打包之完全详解(打包系列教程之四)
android studio gradle 多版本多apk打包(打包系列教程之五)
详解高速神器python脚步打包android apk,超级快!!(打包系列教程之六)
通过上一篇gradle多渠道打包的介绍后,本篇我们就来介绍一下多版本apk的打包。在项目的开发过程,有可能我们会有需要打包多种版本apk的需求,比如当测试部门在测试需要我们提供两种当前正在开发的apk的版本,而且这两种版本都必须安装在同一台手机上,这时我们就需要在打包时打出两种不同包名的apk去满足能在同一台手机上安装;再比如我们开发的apk需要在不同的平台上运行,什么意思?假如我们的apk集成了百度地图,而百度地图提供的sdk中含有的so包会提供2种类型的平台,arm,x86等,这时我们需要根据不同平台打出2种类型的apk;还有的时候不同的版本apk中使用到的不同的服务端api域名也不相同。 比如 beta_api.com,release_api.com等等.......当这些情况出现时,我们就需要使用到多版本apk打包啦。当然我们不可能每次都手动去更改,这样的人力成本太高,也无法忍受,这时就需要gradle为我们排忧解难了。
在本篇中,我们主要介绍两种方法也就是多版本apk安装在同一手机上和集成第3方sdk需要提供多版本apk的情况。
1.多版本apk安装在同一手机上
这种情况只需要我们提供不同包名的apk即可完成。因为只要应用包名不一样即使签名信息一样还是可以同时安装在同一台手机上的,因此我们应该在打包成apk时修改应用的包名就可以达到目的啦。接下来我们进入实际操作过程。这里我们先介绍一个知识点,请直接看下图:
当然从截图也可以看出,配置多apk打包和上一篇文章配置多渠道打包是一样的,都是在productFlavors中配置的。如上图,我们在productFlavors中配置了两种flavor的apk信息一种是Beta版,一种是Releases版,同时每个flavor中我们都重新配置applicationId这个属性,通过这个属性我们就可以使打包出来的apk包名产生对应的变化啦。至于为什么重新配置了applicationId就行呢,原因图已经说明啦,就是因为defaultConfig是Beta版和Releases版flavor的基础配置,只要我们重写了applicationId这个属性就会覆盖defaultConfig中相对应属性的信息,从而使打包出来的两种apk的包名不一样,达到在同一台手机上安装的目的。那么applicationId又是什么呢?看下图(因此我们更改其实就是package属性)
这里还有点要说明的就是为了在java代码中可以方便获取到gradle配置文件的数据,我们可以通过以下在gradle文件中配置,在java 代码中使用方式为:context.getResources().getString(R.string.strKey);
当然还有可能会有别的需求,比如说不同版本要使用不同的icon,这时该如何做呢?实际上还是在productFlavors的每个flavor中通过manifestPlaceholders属性配置即可,还是记得我们在上一篇文章说过manifestPlaceholders是一个类似HashMap的容器,因此在manifestPlaceholders可以配置多个属性,以便在AndroidManifest.xm中使用,比如我们需要为每种版本的apk替换特定的icon和appName这时我们可以这样如下配置:
然后在AndroidManifest.xm中这样使用即可:
这样我们在打包apk时就可以根据特定需求获取到不同版本的apk啦,当然也可以把渠道配置上去哈,配置方式同上。这里我们给出完整的gradle文件:
apply plugin: 'com.android.application' android { signingConfigs { debug4zj { keyAlias 'debug4zj' keyPassword 'debug4zj' storeFile file('/Users/zejian/Documents/android-studio-workplace/debug4zj.jks') storePassword 'debug4zj' } } compileSdkVersion 23 buildToolsVersion "23.0.2" defaultConfig { applicationId "com.zejian.multi_versionapk" minSdkVersion 10 targetSdkVersion 23 versionCode 1 versionName "1.0" } buildTypes { release { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' signingConfig signingConfigs.debug4zj minifyEnabled true zipAlignEnabled true } } //配置多版本的apk productFlavors{ Beta{ applicationId "com.zejian.multi_versionapk.beta" manifestPlaceholders = [app_name:"multi_versionapk.beta" ,icon: "@mipmap/ic_launcher_beta"] //在java代码中具体的使用方式为:context.getResources().getString(R.string.strKey); resValue("string" , "strKey","beta版本") } Releases{ applicationId "com.zejian.multi_versionapk.release" manifestPlaceholders = [app_name:"multi_versionapk.release",icon: "@mipmap/ic_launcher_releases"] resValue("string" , "strKey","release版本") } } } dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.2.0' }接下来在命令行输入 ./gradlew assembleRelease,回车,开始打包,打包结果如下:
很显然成功了,然后我们在反编译一下apk,查看一下AndroidManifest.xml文件,主要观察一下包名是否发生变化了,结果如下:
到此多版本apk安装同一手机测试成功,告一段落,接下来继续研究一下不同平台的多版本apk。
2.多平台多版本apk
通过上面的分析,这个就显得比较简单了,首先我们以百度地图为例,导入百度地图的so包,这里仅做演示,不真正集成百度地图哈。
接下来我们要打2种版本的包,分别是arm平台,x86平台,下面我们直接在gradle中配置:
这里一定要注意so包文件夹名称一定要对应!还有这里使用的老版的ndk配置方式,as好像不通过,因我对ndk还没太多研究,而且这里我们主要是讲解apk的打包过程,所以还是决定使用老式配置,不过我们需要在gradle.properties文件中配置一句话,那就是android.useDeprecateNdk=true,即允许使用过时的ndk配置,这样才能编译通过哈。接下来就直接运行打包吧,./gradlew assembleRelease,回车运行,把打包好的apk修改后缀为zip,并解压,查看lib目录是否分类了so文件即可:
很明显也成功了吧,到此多平台多apk打包也就完成啦。本篇也完结了哈。献上gradle文件内容:
apply plugin: 'com.android.application' android { signingConfigs { debug4zj { keyAlias 'debug4zj' keyPassword 'debug4zj' storeFile file('/Users/zejian/Documents/android-studio-workplace/debug4zj.jks') storePassword 'debug4zj' } } compileSdkVersion 23 buildToolsVersion "23.0.2" defaultConfig { applicationId "com.zejian.multi_versionapk" minSdkVersion 10 targetSdkVersion 23 versionCode 1 versionName "1.0" } buildTypes { release { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' signingConfig signingConfigs.debug4zj minifyEnabled true zipAlignEnabled true } } //多平台apk productFlavors{ arm{ ndk{ abiFilters "arm64-v8a" , "armeabi" , "armeabi-v7a" } } x86{ ndk{ abiFilters "x86" , "x86_64" } } } } dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.2.0' }