上篇文章梳理了下打包流程,本文从实践的角度教你怎么打包?
Android应用的编译和构建是基于Gradle,我们只需要在主Module的build.gradle中进行一些配置即可。
如下是楼主的配置文件,每个参数都进行了很详细的说明。
这里梳理出来,也是便于自己知识管理。
//应用Android插件 apply plugin: 'com.android.application' android { //指定用来编译的Android API版本号 compileSdkVersion COMPILE_SDK_VERSION as int //指定sdk构建工具版本号 buildToolsVersion BUILD_TOOLS_VERSION defaultConfig {//默认配置 //唯一标识一个app applicationId "com.mouxuejie.fun" //指定运行需要的最小API版本 minSdkVersion MIN_SDK_VERSION //指定用来测试的API版本 targetSdkVersion TARGET_SDK_VERSION //app版本号 versionCode VERSION_CODE as int //app 版本名字 versionName VERSION_NAME //分包 multiDexEnabled true } lintOptions { //忽略Lint错误 abortOnError false } signingConfigs {//签名 release { keyAlias KEY_ALIAS keyPassword KEY_PASSWORD storeFile file(STORE_FILE) storePassword STORE_PASSWORD } } buildTypes { debug { //debug } release { //启用代码混淆 minifyEnabled true //代码混淆使用的配置文件 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' //签名 signingConfig signingConfigs.release //移除无用的Resource shrinkResources true //资源文件对齐 zipAlignEnabled true } } productFlavors {//多渠道打包 dev { // applicationId不同,认为是两个不同的app,可以同时安装在一台设备上, // 因此为便于调试,通过修改applicationId或者后缀可以同时安装线上包和开发包 applicationIdSuffix ".debug" } googlepay {} baidu {} qihoo360 {} xiaomi {} tencent {} anzhi {} } // 指定apk名字输出格式 applicationVariants.all { variant -> variant.outputs.each { output -> output.outputFile = new File( output.outputFile.parent, "techexplore-${variant.buildType.name}-${variant.versionName}-$ {variant.productFlavors[0].name}.apk".toLowerCase()) } } } dependencies {//指定依赖 compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:23.1.0' compile 'io.reactivex:rxjava:1.1.0' compile 'io.reactivex:rxandroid:1.1.0' compile 'com.jakewharton.rxbinding:rxbinding:0.4.0' compile 'com.squareup.retrofit:retrofit:1.9.0' compile 'com.squareup.okhttp:okhttp:2.4.0' }
这里有几点说明:
gradle.properties
文件,然后在 build.gradle
中直接引用即可,这样便于集中管理。 productFlavors
设置渠道号,可以实现多渠道打包,通过修改 applicationId
可以让同个app的不同构建包同时安装在一台设备上。 gradle.properties
文件中常量配置如下:
VERSION_NAME=1.0.0 VERSION_CODE=1 COMPILE_SDK_VERSION=23 BUILD_TOOLS_VERSION=23.0.1 TARGET_SDK_VERSION=23 MIN_SDK_VERSION=14 KEY_ALIAS=mouxuejie KEY_PASSWORD=****** STORE_FILE=/Users/wangxinghe/Works/Github_Mine/com.mouxuejie.jks STORE_PASSWORD=******
前面已经提到,任何一个安装包都需要有签名。为App签名的本质是说明这个App是我开发的,不是别人。通过签名可以在应用和开发者之间建立可信任的关联。
通过签名,Android系统可以保证如下:
因此如果签名发生变化,是没办法升级安装的。
从上面的配置文件,我们知道Android签名需要配置4个参数:
通过Run按钮或命令行生成debug包时,Gradle会自动使用debug证书进行签名。debug证书的keystore默认存储在 $HOME/.android/debug.keystore
目录下。这个debug证书是首次运行应用程序时产生的。
由于debug证书安全性较差,正常情况下渠道包都需要使用release签名。
通常一个公司或部门使用同一个证书。
有2种方式来生成数字证书:
打开Android Studio,点击Build -> Generate Signed APK -> Create new…,弹出New Key Store窗口。
如上图所示,输入相关信息,然后点击OK即可生成数字证书。
$ keytool -genkey -v -keystore com.mouxuejie.jks -alias mouxuejie -keyalg RSA -keysize 2048 -validity 10000
各个参数含义:
具体执行结果如下:
我们可以使用图形界面方式进行多渠道打包。不过这里就只介绍使用 gradle
命令行打包方式。
那么到底怎么使用的呢?
我们执行 gradle tasks
命令,可以得到如下task:
这些task的含义如下:
gradle assemble
产生所有渠道的Debug和Release包
gradle assembleAndroidTest
产生所有渠道的测试包
gradle assembleDebug
产生所有渠道的Debug包
gradle assembleRelease
产生所有渠道的Release包
gradle assembleAnzhi
产生某个渠道(如anzhi)的Debug和Release包
这里并没有出现 stormzhang
的文章中说的形如 gradle assembleWandoujiaRelease
的写法。
执行 gradle assemble
后,在app/build/outputs/apk下面会生成一堆文件,如下图所示:
关注互联网技术开发或人才相关,请扫码关注某学姐的公众号:学姐的IT专栏