转载请注明出处: http://blog.csdn.net/a992036795/article/details/52095036
假如我们使用了友盟sdk或者别的sdk,我们需要在androidMainifest 填写一个渠道号,来帮助我们统计。也就说app发布之后需要每个应用市场对应着唯一的渠道号。如果我们不使用自动化打包的话,就非常的麻烦,需要自己去改Mainifest.xml中的渠道号。还好,我们可以使用gradle来帮我们完成这个过程。
我目前的一个项目使用了友盟统计,我需要在AndroidMainifest.xml中写入渠道号
<meta-data
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}" />
我使用${UMENG_CHANNEL_VALUE} 来代替渠道号,最终中使用gradle会将它替换成真正的渠道号。
我们在app 的build.gradle文件中android{}中,这样写:
productFlavors {
wandoujia {
}
qihu360 {
}
baidu {
}
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
}
这样在打包之后他就会使用 wandoujia ,qihu360,baidu来替换UMENG_CHANNEL_VALUE 完成渠道号的填写
然后我们在命令行输入 gradle assemble 来完成打包。
如果不出问题,它将会在app/build/outputs/apk 文件夹下生成打包好的文件 类似 app-wandoujia-realease.apk 这种apk文件。
当然如果我们希望在 apk文件命中加入 版本信息,和时间信息的话,我们可以更改这个apk的文件名,我们只需在 android{} 中加入:
android.applicationVariants.all { variant ->
def file = variant.outputs[0].outputFile
variant.outputs[0].outputFile = new File(file.parent,
file.name.replace(".apk", "-" + defaultConfig.versionName +"-"+releaseTime()+ ".apk"))
}
其中releaseTime()是自己定义的一个函数:
def releaseTime(){
return new Date().format("yyyy-MM-dd")
}
这样我们继续运行打包命令,就会在build/outputs/apk/得到 如 app-wandoujia-debug-1.0.0-2016-08-02.apk这样的文件。
如果不使用命令行,也可以使用android studio 右边的快捷方式
根据需要单机即可,如果想只打包release版,就点击 assembleRelease
最终会根据不同的渠道生成渠道包:
这样就完成了自动化打包。
接下来我们说话一下 签名的配置,以及一些打包的选项。
我们配置签名的话,可以在android{ signingConfigs{} } 中进行配置,例如:
android {
signingConfigs {
release {
keyAlias 'xxxx'
keyPassword 'xxxx'
storeFile file('/xxxx.jks')
storePassword 'xxx'
}
debug {
keyAlias 'androiddebugkey'
keyPassword 'android'
storeFile file('/debug.keystore')
storePassword 'android'
}
}
然后在android{ buildTypes{}} 中写:
release {
minifyEnabled false
buildConfigField("boolean", "LOG_DEBUG", "false")
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig = signingConfigs.release
}
debug {
buildConfigField("boolean", "LOG_DEBUG", "true")
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig = signingConfigs.debug
}
他们分别用来打包release版和debug版
其中有一些选项可以设置:
minifyEnabled 这个选项决定是否混淆
proguardFiles 这个指定了混淆的配置文件路径,默认是app目录下的 proguard-rules.pro
shrinkResources 可以移除无用资源
….
buildConfigField 这个属性可以在 java代码包名地下的 BuildConfig中加入字段
这句代码 buildConfigField(“boolean”, “LOG_DEBUG”, “true”)作用是在BuildConfig
中加入了一个域 public static final boolean LOG_DEBUG = true;
这样我们就可以在 java代码中判断,是否为debug版本了。
最后我附上我的配置:
apply plugin: 'com.android.application'
apply plugin: 'android-apt'
android {
signingConfigs {
release {
keyAlias 'xxx'
keyPassword 'xxxxxx'
storeFile file('/xxx.jks')
storePassword 'xxxxx'
}
debug {
keyAlias 'androiddebugkey'
keyPassword 'android'
storeFile file('/debug.keystore')
storePassword 'android'
}
}
compileSdkVersion 23
buildToolsVersion "23.0.3"
defaultConfig {
applicationId "xxxxxx"
minSdkVersion 14
targetSdkVersion 23
versionCode 1
versionName "1.0.0"
}
buildTypes {
release {
minifyEnabled false
buildConfigField("boolean", "LOG_DEBUG", "false")
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig = signingConfigs.release
}
debug {
buildConfigField("boolean", "LOG_DEBUG", "true")
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig = signingConfigs.debug
}
}
sourceSets {
main {
jniLibs.srcDirs = ['libs']
java.srcDirs = ['src/main/java', 'src/main/java-gen']
}
}
productFlavors {
wandoujia {
}
qihu360 {
}
baidu {
}
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
}
android.applicationVariants.all { variant ->
def file = variant.outputs[0].outputFile
variant.outputs[0].outputFile = new File(file.parent,
file.name.replace(".apk", "-" + defaultConfig.versionName +"-"+releaseTime()+ ".apk"))
}
}
def releaseTime(){
return new Date().format("yyyy-MM-dd")
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
testCompile 'junit:junit:4.12'
}