Android Gradle 相同应用多包名打包,实现测试发布包分离,不同服务器地址以生成不同安装包
简介:
公司的新需求:同一份代码打出另一个包名的apk,即包名不同、名称不同的两个apk。因为市场是识别包名的,所有可以相同的代码可以发布多个APP,以便于测试什么样的名字被用户接受(本人不太认同这种观点,这里只谈技术),可以在同一个手机同时安装测试包和发布包(大部分测试的接口地址与发布的接口地址是不一样的,还有一些公司还有开发的接口),方便测试
我经过多方渠道发现大致有一下三种方法:
- 通过ant打多包名应用
- 建立多个与“main”同级的文件夹,修改清单文件及build.gradle以达到打多包名效果
- 通过修改build.gradle文件的applicationId达到打多包名的效果,原理与第二种方法但比较简单
因为是新手,对ant并不太了解,原理也不太清楚,为了赶时间所以直接选择了第二种与第三种方法,经过测试发现第三种方法要更加简单的多,所以最后直接使用了第三种方法,以下为详解。
因为要修改的是build.gradle文件而该文件一经修改就要重新编译,用过史丢丢的童鞋应该都清楚等待编译完成是是件多么蛋疼的事情所以建议大家一次性修改完成以便节约开发时间。
上面已经说过该方法主要是通过修改build.gradle文件的applicationId达到打多包名的效果的,下面便粘出本人代码供大家参考。
productFlavors {
app_one {
applicationId "com.example.app1"
manifestPlaceholders = [
app_name:"测试-1"
]
}
app_two {
applicationId "com.example.app2"
manifestPlaceholders = [
app_name:"测试-2"
]
}
app_three {
applicationId "com.example.app3"
manifestPlaceholders = [
app_name:"测试-3"
]
}
}
是不是感觉这个方法很眼熟?
没错就是多渠道打包的地方,通过添加这段代码后需要用到gradle面板进行打包,得到app_one 通过查看包名发现它的包名为 com.example.app1
显示的名称也为 测试-1
,app_two 与 app_three 效果等同,至此已经完成多包名打包,且通过同一份代码打出了不同包名、不同名称的三个应用,而需求也达到了。
可能有的朋友会问如果还需要其他的渠道包怎么办,如果有10的渠道而又要打包两个不同的应用那岂不是要写20个类似于app_one的东西,那不是要很麻烦?没错我正好也碰到了这种情况,经过多次研究测试发现并没有那么麻烦,只需设定一个默认的包名、应用名即可,废话不多说,直接贴代码。
defaultConfig {
if (PACKAGE == "one") {
applicationId "com.example.app1"
manifestPlaceholders = [
app_name:"测试-1"
]
} else {
applicationId "com.example.app2"
manifestPlaceholders = [
app_name:"测试-2"
]
}
minSdkVersion 14
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
productFlavors {
app_one {}
app_two {}
app_three {}
}
嗯,就是这样,在defaultConfig里面设置一个默认的包名与应用名就可以了。
好了,到了这一步我们就要用到另一个神奇的文件了
工程目录下配置文件看看你的工程根目录下得这个东西,没错就是它,这里我设置了一个字段“PACKAGE”,即告诉Studio我想要什么包,到这里相信大家也就明白我写的判断的目的了。
PACKAGE=one
只要通过修改这一字段为“one”,然后通过打包后就可以得到三个“测试-1”的app_one、app_two、app_three的apk文件了,同理将其修改为其他字段即可打出其他包名、应用名的应用了。
但是转到本人公司项目后发现这种方法竟然失灵了,即修改 properties 文件内的字段后得不到我想要的包,经过探索发现可能是与项目工程的大小有关,改完重启后就可以了。
当然还有另一个最重要的地方
<?xml version="1.0" encoding="utf-8"?>
<manifest
package="com.example.morepackagenametest">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="${app_name}"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
不同服务器地址以生成不同安装包方法类似,我这里不细说,有问题请留言
就是这里了,即之前定义的名字赋给应用了,在这里大家要注意一下在该项目的其他 model 内的清单文件里最好不要写 android:label
这句了,否则会报错的,至于是什么错一眼就可以看到了,当然如果报错了有两个方法:
- 删掉其他 model 内清单文件下
application
的label
属性 - 通过在
application
下添加tools:replace="android:label"
属性解决
好了,打完收工。期待大神的批评指导。
- 欢迎关注
- 转载请注明出处,谢谢
此文同事编写,此后会增加不同服务器地址以生成不同安装包的demo
全科龙婷▼升职加薪
image