Android Studio 多渠道打包,打不同包名,不同图标的apk
最近遇到这样一个需求:一套代码需要给不同的公司打包,需要修改App icon,ic_launcher,欢迎页背景图,登录按钮颜色,第三方的不同的key,包名,applicationId等
作为一个懒得不想动的程序员,是不可能去给每个公司打一个包的,所以把精力放到了多渠道打包的想法上。
经过研究最终实现思路是这样的。
在app的model下创建了几个不同的文件夹。层级如下:

flavor_xxx为新建的目录,每个目录下包括一些资源,资源的相同点(不同apk下不同的东西:比如App icon,背景图等),它们必须是与app的model下资源的名字是相同的,如下图:(res->mipmap-hdpi->ic_launcher.phg与app model下的资源路径是相同的)

values下的strings.xml里的内容是不同的App名称,公司名称,电话号码等

第一步完成,接下来需要在app.build 中配置一下。
android {
compileSdkVersion 25
buildToolsVersion '25.0.0'
signingConfigs {
def alias = 'keystory alias'
def password = 'keystory possword'
def filePath = 'keystore/xxx.jks'
debug {
keyAlias alias
keyPassword password
storeFile file(filePath)
storePassword(password)
}
1{
storeFile file(filePath)
keyAlias alias
keyPassword password
storePassword(password)
}
2{
keyAlias alias
keyPassword password
storeFile file('keystore/xxx.jks')
storePassword(password)
}
3{
keyAlias alias
keyPassword password
storeFile file('keystore/xxx.jks')
storePassword(password)
}
4{
keyAlias alias
keyPassword password
storeFile file('keystore/xxx.jks')
storePassword(password)
}
5{
keyAlias alias
keyPassword password
storeFile file('keystore/xxx.jks')
storePassword(password)
}
}
defaultConfig {
applicationId "com.lesoft.wuye"
minSdkVersion 15
targetSdkVersion 23
versionCode 255
versionName "2.5.5"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
multiDexEnabled true
ndk {
abiFilters "armeabi-v7a"
}
}
productFlavors {
flavor_1 {
applicationId = "com.xxx"
// manifestPlaceholders中写到的『BAIDU_KEY』 // 这里所设置的变量可以直接使用在『AndroidManifest.xml』中,使用方式为:${package_name} // android:name="${HOST}.permission.JPUSH_MESSAGE"// <meta-data
// android:name="com.baidu.lbsapi.API_KEY"
// android:value="${BAIDU_KEY}"/>
manifestPlaceholders = [BAIDU_KEY : "",
JPUSH_APPKEY: "",
UMENG_APPKEY: "", HOST: applicationId]
}
// flavor_2 {
// applicationId = "com.xxx"
// manifestPlaceholders = [BAIDU_KEY : "百度key",
// JPUSH_APPKEY: "极光推送key",
// UMENG_APPKEY: "友盟", HOST: applicationId]
// }
// flavor_3 {
// applicationId = "com.xxx"
// manifestPlaceholders = [BAIDU_KEY : "",
// JPUSH_APPKEY: "",
// UMENG_APPKEY: "", HOST: applicationId]
//
// }
//
// flavor_4 {
// applicationId = "com.xxx"
// manifestPlaceholders = [BAIDU_KEY : "",
// JPUSH_APPKEY: "",
// UMENG_APPKEY: "", HOST: applicationId]
// }
//
// flavor_5 {
// applicationId = "com.xxx"
// manifestPlaceholders = [BAIDU_KEY : "",
// JPUSH_APPKEY: "",
// UMENG_APPKEY: "", HOST: applicationId]
// }
}
buildTypes {
debug {
// 如果 debug 包需要测试诸如微信、地图等第三方 sdk ,则可以指定 debug 包使用 release 包的签名
//debug 并不能设置多个签名
debuggable true
minifyEnabled false
productFlavors.flavor_1.signingConfig signingConfigs.1
// //为已经存在的applicationId添加后缀
// applicationIdSuffix ".debug"
// // 为版本名添加后缀
// versionNameSuffix "-debug"
}
release {
minifyEnabled false
// shrinkResouse ture 移除无用资源
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
// productFlavors.flavor_1.signingConfig signingConfigs.1
// productFlavors.flavor_2.signingConfig signingConfigs.2
// productFlavors.flavor_3.signingConfig signingConfigs.3
// productFlavors.flavor_4.signingConfig signingConfigs.4
// productFlavors.flavor_5.signingConfig signingConfigs.5
applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
//输出apk名称为:渠道名_版本名_时间.apk
def fileName = "${variant.productFlavors[0].name}_v${defaultConfig.versionName}_${releaseTime()}.apk"
output.outputFile = new File(outputFile.parent, fileName)
}
}
}
}
}
}
最后在AndroidManifest.xml 中加入 <application
android:replace="icon,lable,theme">
如果没有会在编译中报错,错误如下:


到现在多渠道打包就已经配置完成,使用方法:点assembleRelease即可打包,运行速度有点慢。

踩过的坑:在rearelease{
shrinkResources true //移除无用资源
}
如果存在这个配置,会导致把我们的无用资源给移除,会导致编译不通过。
在java代码中需要改的内容是不能在我们flaflavor_xxx的文件下修改的,需要我们在代码中根据App name或者package name来自动判断。如修改一个登陆按钮的颜色:
/**
* 根据App的名字,如果是xxx公司:登录按钮颜色要变
*/
private void setLoginBtnColor(){
String app_name = getResources().getString(R.string.app_name);
if (app_name.equals("app name")) {
mLoginBtn.setBackgroundColor(getResources().getColor(R.color.gaodi_login_btn));
ivPhoto.setImageResource(R.mipmap.ic_launcher_trans);
}
}
浙公网安备 33010602011771号