几种打包方式
- Android Studio
- 美团 Walle(瓦力)
- 友盟 UMeng
ps: 本文目前介绍Android Studio用法,友盟类似,美团待完善
Android Studio用法
- 在AndroidManifest.xml -> manifest -> application中添加内容:
<meta-data
android:name="JOYO_CHANNEL"
android:value="${JOYO_CHANNEL}" />
2.在app -> build.gradle -> android中添加内容:
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
// 配置AndroidManifest.xml中的占位值
// manifestPlaceholders = [JOYO_CHANNEL: 'release']
}
debug {
// 配置AndroidManifest.xml中的占位值
// manifestPlaceholders = [JOYO_CHANNEL: 'debug']
}
}
build {
defaultConfig {
// Gradle后如果出现报错,需要配置flavor dimension的维度是该版本号,这样维度就是都是统一的了
// Error: All flavors must now belong to a named flavor dimension. Learn more at ...
flavorDimensions "versionCode"
}
// 各个渠道
productFlavors {
huawei {}
meizu {}
xiaomi {}
oppo {}
vivo {}
douyin {}
yingyongbao {}
baidu {}
}
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [JOYO_CHANNEL: name]
}
// 设置输出APK名称
// Android Studio 2.3版本
// applicationVariants.all { variant ->
// variant.outputs.each { output ->
// def outputFile = output.outputFile
// if (outputFile != null && outputFile.name.endsWith('.apk')) {
// def fileName = "app_${variant.productFlavors[0].name}_v${defaultConfig.versionName}.apk"
// output.outputFile = new File(outputFile.parent, fileName)
// }
// }
// }
// 设置输出APK名称
// Android Studio 3.0版本
applicationVariants.all { variant ->
variant.outputs.all {
def channelName = variant.productFlavors[0].name
// 自定义路径,Android Studio会默认在app目录下生成各渠道文件夹
// variant.getPackageApplicationProvider().get().outputDirectory = new File("${project.projectDir.absolutePath}/build/outputs/apk/${channelName}/${variant.buildType.name}")
outputFileName = "app-${channelName}-v${variant.versionName}.apk"
}
}
}
如图:
- 编译打包
Build -> Generate Signed Bundle / APK -> 选择Release或Debug
获取渠道信息
- Android Studio
通过读取AndroidManifest中<meta-data>标签
private String getChannel() {
try {
PackageManager pm = getPackageManager();
ApplicationInfo appInfo = pm.getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
// key为<meta-data>标签中的name
String channel = appInfo.metaData.getString(key);
if (!TextUtils.isEmpty(channel)) {
return channel;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}