gradle多渠道打包攻略
随着android开发的日益成熟,以及国内应用市场的复杂化。应对每个市场独立发布单独渠道的APP的需求显然是当下每个andorid开发人员必备的一项技能。
defaultConfig {
applicationId "com.xue.gradledemo"
minSdkVersion 23
targetSdkVersion 26
versionCode 1
versionName "1.0"
}
这是一个默认的build.gradle中每个android app的默认属性。
现在我们希望在debug和release中修改相应的默认属性则需要修改成这样
buildTypes {
release {
versionCode 2
versionName "2.0"
}
debug{
versionCode 3
versionName "3.0"
}
}
这样我们再打包就会发现release的APP版本是2.0 而debug的版本是3.0。这只是一个最简单的情况,但实际中我们可能要打很多个上线的release版本这时我们就需要增加一个productFlavors
productFlavors {
haha {
flavorDimensions "default"
applicationId "com.xue.haha"
versionCode 2
versionName "2.0"
resValue 'string', 'channel_value', 'HAHA'
buildConfigField('String','channel_name','"haha"')
manifestPlaceholders.put("META_CHANNEL","haha")
}
keke {
flavorDimensions "default"
applicationId "com.xue.keke"
versionCode 3
versionName "3.0"
resValue 'string', 'channel_value', 'KEKE'
buildConfigField('String','channel_name','"keke"')
manifestPlaceholders.put("META_CHANNEL","keke")
}
}
我分别解释一下每一行带表的意思,首先productFlavors里有 keke 和 haha两个对象,那就代表我们现在对应要打两个渠道的包。他们有各自的appid versioncode versonname 其中 resValue 方法代表的意思是自定义xml熟悉它会在/build/generate/对应渠道/values/ 下建立一个generate.xml文件
gradle1.jpeg
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Automatically generated file. DO NOT MODIFY -->
<!-- Values from product flavor: haha -->
<string name="s" translatable="false">HAHA</string>
</resources>
buildConfigField则是对应在BuildConfig.java中增加对应的静态变量
public final class BuildConfig {
public static final boolean DEBUG = Boolean.parseBoolean("true");
public static final String APPLICATION_ID = "com.xue.haha";
public static final String BUILD_TYPE = "debug";
public static final String FLAVOR = "haha";
public static final int VERSION_CODE = 2;
public static final String VERSION_NAME = "2.0";
// Fields from build type: debug
public static final boolean Build_Type_Release = false;
// Fields from product flavor: haha
public static final String channel_name = "haha";
}
manifestPlaceholders.put是在AndroidManifest.xml中修改对应的<meta-data>
<meta-data android:value="${META_CHANNEL}" android:name="META_CHANNEL"></meta-data>
${}表示一个占位符
其中manifestPlaceholders.put,buildConfigField,resValue也可以在buildTypes里对应debug release里进行配置,相同属性的优先级
buildTypes> productFlavors>defaultConfig
好了上面介绍的方法已经能基本满足我们的多渠道需求。但是我们想要更高级的定制比如我想每个渠道的appname也不一样要怎么做?
那么我们就需要在main的同级目录下创建对应的渠道并创建与main相同的目录层级
gradle2.jpeg
然后再修改strings里对应的app_name就行了。
gradle3.jpeg同样想修改Java文件也是一样的做法,这里我就不再给出例子。
怎么样是不是很简单,希望这篇攻略能给你带来收获!