使用as+gradle 到现在,多多少少也用到了一些gradle的打包技巧,现在总结一下,备忘。。。
首先看一下一般的gradle文件
apply plugin: 'com.android.application'
//定义一个获取时间的方法,下面用到
def releaseTime() {
return new Date().format("yyyy_MM_dd", TimeZone.getTimeZone("UTC"))
}
//定义一个获取名字的方法,下面用到
def appName(){
return "contra"
}
android {
compileSdkVersion 22
buildToolsVersion "22.0.1"
//指定程序签名
signingConfigs {
release {
storeFile file("../app/special.jks")
storePassword "storePassword "
keyAlias "app"
keyPassword "keyPassword "
}
debug {
storeFile file("../app/special.jks")
storePassword "storePassword "
keyAlias "app"
keyPassword "keyPassword "
}
}
//缺省配置,gradle找不到符合的资源之后就在使用缺省的配置
defaultConfig {
applicationId "com.jadyn.chan"
minSdkVersion 14
targetSdkVersion 22
versionCode 2
versionName "1.0.2"
//BuildConfig类的常量值
buildConfigField 'boolean', 'HAS_SPLASH', 'Boolean.parseBoolean("false")'
buildConfigField 'String', 'GAME_URL', '"file:///android_asset/index.html"'
//TODO 配置友盟app_key
manifestPlaceholders = [UMENG_CHANNEL_VALUE: '55d6c92fe0f55a473b0ccccc']
}
//执行lint检查,有任何的错误或者警告提示,都会终止构建,我们可以将其关掉。
lintOptions {
abortOnError false
}
buildTypes {
release {
//不显示Log
buildConfigField "boolean", "LOG_DEBUG", "false"
//不混淆
minifyEnabled false
//zipalign优化
zipAlignEnabled true
//移除无用的resource文件
shrinkResources false
//使用该目录下的混淆文件proguard-rules.pro'
proguardFiles 'proguard-rules.pro'
//应用上面写的签名
signingConfig signingConfigs.release
}
debug {
//显示Log
buildConfigField("boolean", "LOG_DEBUG", "true")
//不混淆
minifyEnabled false
//zipalign优化
zipAlignEnabled true
//移除无用的resource文件
shrinkResources false
//使用系统默认的android程序混淆文件,该文件已经包含基本的混淆声明
proguardFiles 'proguard-rules.pro'
//应用上面写的签名
signingConfig signingConfigs.debug
}
}
//渠道Flavors ,配置不同渠道的app
productFlavors {
//百度,针对该渠道的apk设置特定的值
baidu{
manifestPlaceholders = [CLIENT_ID: "ccxzc"]
applicationId 'com.ss'
versionCode 1
versionName '1'
}
//小米,没有针对apk设置特定的值,故使用defaultConfig 里面的声明值
xiaomi{}
}
//批量配置,这里的意思是为productFlavors 的所有渠道包设置meta_umeng_channel,
//name为渠道包名字(上面的baidu,xiaomi),UMENG_CHANNEL_VALUE在AndroidManifest.xml文件声明了,见下文
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
//打包后应用名称,这里实现对打包出来的apk重命名
//appName(),releaseTime()已经在上面声明了
applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
//命名根据applicationId
def fileName = "${appName()}_v${defaultConfig.versionName}_${releaseTime()}_${variant.productFlavors[0].name}.apk"
output.outputFile = new File(outputFile.parent, fileName)
}
}
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:appcompat-v7:22.2.0'
compile project(':x_Project2')
}
下面解释下几个主要的参数
buildConfigField
当你声明了之后,gradle build之后会生成一个BuildConfig类,大概如下
public final class BuildConfig {
public static final boolean DEBUG = Boolean.parseBoolean("true");
public static final String GAME_URL = "file:///android_asset/index.html";
public static final boolean HAS_SPLASH = Boolean.parseBoolean("false");
}
可以在defaultConfig声明通用常量或者在productFlavors针对某个特定的渠道声明一个常量
productFlavors {
//阿里巴巴
ali{
buildConfigField 'boolean', 'HAS_SPLASH', 'Boolean.parseBoolean("true")'
}
}
然后在实现类中调用
insertSplashView(BuildConfig.HAS_SPLASH);
private void insertSplashView(boolean hasSplash) {
...
}
就可以实现针对不同渠道配置不同参数
productFlavors
在里面声明多个渠道,打包的时候生成多个apk
productFlavors {
baidu {
manifestPlaceholders = [ UMENG_CHANNEL_VALUE: "百度", UMENG_APPKEY_VALUE: "dasd", GAME_URL: "file:///android_asset/index.html", GAME_ORIENTATION: "0"]
applicationId 'com.baidu.chan'
versionCode 1
versionName '1'
}
xiaomi {
manifestPlaceholders = [ UMENG_CHANNEL_VALUE: "xiaomi", UMENG_APPKEY_VALUE: "dasd", GAME_URL: "file:///android_asset/index.html", GAME_ORIENTATION: "0"]
applicationId 'com.xiaomi.chan'
versionCode 1
versionName '1'
}
}
manifestPlaceholders 里面的声明的值是在AndroidManifest.xml定义的
<meta-data
android:name="UMENG_APPKEY"
android:value="${UMENG_APPKEY_VALUE}" />
<meta-data
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}" />
<meta-data
android:name="GAME_URL"
android:value="${GAME_URL}" />
<meta-data
android:name="GAME_ORIENTATION"
android:value="${GAME_ORIENTATION}" />
通过这种方法实现多渠道配置。
某些时候每个渠道都要一些不同的图片或者代码,比如,小米市场打开的时候要小米的欢迎界面,360要360的欢迎界面。可以在代码src目录下新建想要渠道的文件,注意文件名要与productFlavors 下声明的渠道名相同,这样打包小米的渠道包时,就优先加载这个渠道包的文件
如上,小米需要特定的图片,故只需要重写ic_launch.png图片,就可以简单实现了