上篇文章梳理了下打包流程,本文从实践的角度教你怎么打包?
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专栏