Androidstudio 多渠道打包apk

时间:2021-10-05 09:28:07

由于国内的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>

Androidstudio 多渠道打包apk

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]
}
}
Androidstudio 多渠道打包apk
3.我们来写一坨代码验证一下

public class MainActivity extends AppCompatActivity {

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;
}
}
添加完这坨代码,我们来点击右边的Gradle看一下,就可以看到我们刚才添加的渠道了

Androidstudio 多渠道打包apk
4.我们双击一下installBaiduDebug,它就会运行安装到手机上了

Androidstudio 多渠道打包apk

就可以获取到相对应的渠道了,点击其他的渠道包安装也会获取到相应的渠道包

5.我们要打包正式版本就要生成jks签名文件,并且打包渠道包

Androidstudio 多渠道打包apkAndroidstudio 多渠道打包apk

Androidstudio 多渠道打包apk

Androidstudio 多渠道打包apk

Androidstudio 多渠道打包apk

然后点击Next,去到下面那个页面,可就可以选取相应的渠道了,也可以一次性选择全部的渠道

Androidstudio 多渠道打包apk

然后点击finish,喝杯茶等待完成就可以了

Androidstudio 多渠道打包apk

安装之后就可以验证了

6.以上是手动打包操作的,下面来一点自动化的操作

在build.gradle,哪里添加

signingConfigs {
debug {
// No debug config
}

release {
storeFile file("../yourapp.keystore")
storePassword "your password"
keyAlias "your alias"
keyPassword "your password"
}
}
可能这样直接暴露出来密码什么的不安全,现在采用下面的方法改成:

relealse {
storeFile file(RELEASE_STORE_FILE)
storePassword RELEASE_STORE_PASSWORD
keyAlias RELEASE_KEY_ALIAS
keyPassword RELEASE_KEY_PASSWORD
}
然后在gradle.properties文件上加上

RELEASE_KEY_PASSWORD= "your password"
RELEASE_KEY_ALIAS= "your alias"
RELEASE_STORE_PASSWORD= "your password"
RELEASE_STORE_FILE= "../yourapp.keystore"
7.然后就可以用Androidstudio下的Terminal进行assemble命令来操作了

./gradlew assembleDebug    // debug的
./gradlew assembleRelease // Release的

然后就可以喝咖啡等待打包成功了

在Terminal下面会出现BUILD SUCCESSFUL就是成功了,然后在这里就可以看到打包成功的apk了

Androidstudio 多渠道打包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版本。

给整个gradle文件看看

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'
}

然后就可以用这样的方法来做多渠道打包了