由于国内的android市场渠道很多,为了统计每个渠道的下载和它的数据统计,我们开发人员就需要针对每个渠道打包,如果一个个打包这显然不是开发人员愚蠢的行为,Androidstudio上有了Gradle,这就很简单了,当然用eclipse的也有它多渠道打包的方法,这些说的是AS的打包方法。
这里以友盟统计作为实例:
1.在AndroidManifest.xml里面添加一句:
<span style="font-size:18px;"><meta-data android:value="${UMENG_CHANNEL_VALUE}" android:name="UMENG_CHANNEL"/></span>
2.在build.gradle设置productFlavors
android {或者一次性修改
productFlavors {
xiaomi {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
}
baidu {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"]
}
wandoujia {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
}
}
}
android {
productFlavors {
xiaomi {}
baidu {}
wandoujia {}
}
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
}
3.我们来写一坨代码验证一下
public class MainActivity extends AppCompatActivity {添加完这坨代码,我们来点击右边的Gradle看一下,就可以看到我们刚才添加的渠道了
private TextView mChannel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mChannel = (TextView) findViewById(tv_channel);
mChannel.setText(getApplicationMetaValue("UMENG_CHANNEL"));
}
private String getApplicationMetaValue(String name) {
String value= "";
try {
ApplicationInfo appInfo =getPackageManager()
.getApplicationInfo(getPackageName(),
PackageManager.GET_META_DATA);
value = appInfo.metaData.getString(name);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return value;
}
}
4.我们双击一下installBaiduDebug,它就会运行安装到手机上了
就可以获取到相对应的渠道了,点击其他的渠道包安装也会获取到相应的渠道包
5.我们要打包正式版本就要生成jks签名文件,并且打包渠道包
然后点击Next,去到下面那个页面,可就可以选取相应的渠道了,也可以一次性选择全部的渠道
然后点击finish,喝杯茶等待完成就可以了
安装之后就可以验证了
6.以上是手动打包操作的,下面来一点自动化的操作
在build.gradle,哪里添加
signingConfigs {可能这样直接暴露出来密码什么的不安全,现在采用下面的方法改成:
debug {
// No debug config
}
release {
storeFile file("../yourapp.keystore")
storePassword "your password"
keyAlias "your alias"
keyPassword "your password"
}
}
relealse {然后在gradle.properties文件上加上
storeFile file(RELEASE_STORE_FILE)
storePassword RELEASE_STORE_PASSWORD
keyAlias RELEASE_KEY_ALIAS
keyPassword RELEASE_KEY_PASSWORD
}
RELEASE_KEY_PASSWORD= "your password"7.然后就可以用Androidstudio下的Terminal进行assemble命令来操作了
RELEASE_KEY_ALIAS= "your alias"
RELEASE_STORE_PASSWORD= "your password"
RELEASE_STORE_FILE= "../yourapp.keystore"
./gradlew assembleDebug // debug的
./gradlew assembleRelease // Release的
然后就可以喝咖啡等待打包成功了
在Terminal下面会出现BUILD SUCCESSFUL就是成功了,然后在这里就可以看到打包成功的apk了
除此之外 assemble 还能和 Product Flavor 结合创建新的任务,其实 assemble 是和 Build Variants 一起结合使用的,而 Build Variants = Build Type + Product Flavor , 举个例子大家就明白了:
如果我们想打包wandoujia渠道的release版本,执行如下命令就好了:
- ./gradlew assembleWandoujiaRelease
如果我们只打wandoujia渠道版本,则:
- ./gradlew assembleWandoujia
此命令会生成wandoujia渠道的Release和Debug版本
同理我想打全部Release版本:
- ./gradlew assembleRelease
这条命令会把Product Flavor下的所有渠道的Release版本都打出来。
总之,assemble 命令创建task有如下用法:
**assemble**: 允许直接构建一个Variant版本,例如assembleFlavor1Debug。
**assemble**: 允许构建指定Build Type的所有APK,例如assembleDebug将会构建Flavor1Debug和Flavor2Debug两个Variant版本。
**assemble**: 允许构建指定flavor的所有APK,例如assembleFlavor1将会构建Flavor1Debug和Flavor1Release两个Variant版本。
apply plugin: 'com.android.application'
def releaseTime() {
return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}
android {
compileSdkVersion 24
buildToolsVersion "24.0.3"
defaultConfig {
applicationId "com.multi_channel_study.demo"
minSdkVersion 15
targetSdkVersion 24
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
// 输出apk名称为Multi-Channel_v1.0_2016-11-04_wandoujia.apk
def fileName = "Multi-Channel_v${defaultConfig.versionName}_${releaseTime()}_${variant.productFlavors[0].name}.apk"
output.outputFile = new File(outputFile.parent, fileName)
}
}
}
}
signingConfigs {
debug {
// No debug config
}
relealse {
storeFile file(RELEASE_STORE_FILE)
storePassword RELEASE_STORE_PASSWORD
keyAlias RELEASE_KEY_ALIAS
keyPassword RELEASE_KEY_PASSWORD
}
}
productFlavors {
xiaomi {}
baidu {}
wandoujia {}
}
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:24.2.1'
testCompile 'junit:junit:4.12'
}
然后就可以用这样的方法来做多渠道打包了