Android gradle 动态设定App包名,logo,名称
前提:公司需求,有两个客户的 app 的功能是一样,但是 logo,名字,包名等吧等不一样.公共操作逻辑是一样的,大量的资源文件不一样.(string,color,value....).
先放一个 build.gradle 文件代码,可以抄.下面说每一步的详细操作
apply plugin: 'com.android.application'
android {
compileSdkVersion 29
buildToolsVersion "29.0.2"
defaultConfig {
applicationId "com.mcy.dev"
minSdkVersion 21
targetSdkVersion 29
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
flavorDimensions "app"//gradle 3.0.0 以上 ("app"是 AS 默认创建的文件夹名字,当然也可以自己改的,随意)
}
// 签名文件
signingConfigs {
config {
keyAlias 'mcy1'
keyPassword '123456'
storeFile file('../mcy.jks')
storePassword '123456'
}
}
productFlavors {
dev1 {
dimension "app"//gradle 3.0.0 以上
applicationId "com.csc.cpmobile2"//包名
resValue "string", "app_name", "dev1_11111"////app名字
resValue "color", "color_01", '#ff0000'//颜色值
manifestPlaceholders = [ app_icon: "@drawable/guide1"]//app图标
}
dev2 {
dimension "app"//gradle 3.0.0 以上
applicationId "com.mcy.dev2"//包名
resValue "string", "app_name", "dev2_22222"//app名字
resValue "color", "color_01", '#ffff00'//颜色值
manifestPlaceholders = [ app_icon: "@drawable/guide2"]//app图标
}
dev3 {
dimension "app"
applicationId "com.mcy.dev3"//包名
resValue "string", "app_name", "dev3_33333"//app名字
resValue "color", "color_01", '#ff00ff'//颜色值
manifestPlaceholders = [ app_icon: "@drawable/guide3"]//app图标
}
}
buildTypes {
debug {
signingConfig signingConfigs.config
}
release {
minifyEnabled false
zipAlignEnabled true
//移除无用的resource文件
shrinkResources false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.config
// 批量打包
applicationVariants.all { variant ->
variant.outputs.all {
outputFileName = "${variant.productFlavors[0].name}.apk"//生成 apk 的名字
}
}
// 批量打包(gradle 3.0.0 以上)
android.applicationVariants.all { variant ->
variant.outputs.all {
outputFileName = "${variant.productFlavors[0].name}.apk"//生成 apk 的名字
}
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test:runner:1.2.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}
}
先了解一个关键字,一切都明了了. productFlavors 贼拉拉关键,看下面的文章吧
大概意思就是,就是用于定义产品的特性,这是每个产品不同的地方,,在最终编译的时候(终端运行gradle build命令),就会编译出多个产品的APK出来,平时调试的时候,设置一个产品来调试 .
友情链接:https://www.jianshu.com/p/fe39658ca14e
修改包名:
productFlavors {
dev1 {
applicationId "com.mcy.dev1"
}
dev2 {
applicationId "com.mcy.dev2"
}
dev3 {
applicationId "com.mcy.dev3"
}
}
defaultConfig 有一个 applicationId "com.mcy.dev"
,但是运行的时候productFlavors会覆盖defaultConfig,好了,包名修改成功,其余代码都是一样的,目前这一步,只是包名改了,我的代码中,写了 3 个包名.点击下图,就可以看到不同包名的项目了.运行哪一个选哪一个咯.
修改logo:
productFlavors {
dev1 {
manifestPlaceholders = [app_icon: "@drawable/guide1"]//app图标 (自己定义用的,可随意改)
}
dev2 {
manifestPlaceholders = [app_icon: "@drawable/guide2"]//app图标
}
dev3 {
manifestPlaceholders = [app_icon: "@drawable/guide3"]//app图标
}
}
这个修改清单文件里面的内容,在清单文件里面设置 logo 的代码如下:
android:icon="${app_icon}"
修改app 名字:
productFlavors {
dev1 {
resValue "string", "app_name", "dev1_11111"//app名字
}
dev2 {
resValue "string", "app_name", "dev2_22222"//app名字
}
dev3 {
resValue "string", "app_name", "dev3_33333"//app名字
}
}
这里是添加,会自动在 string.xml 里面添加了一个字段 app_name,虽然不在string.xml显示.但是一定要把<string name="app_name">My Application</string>
删掉,否则会报错!!!
清单文件引用:
android:label="@string/app_name"
所以呢, color、dimen 也可以通过类似的方法添加。
如果在代码中使用 app_name,用 R.string.app_name 来引用。color , dimen 同理可得
引用不同的资源 module
如果,两个项目,只有公共的逻辑是一样的话,大量的资源文件不一样,可以用这种方法.
首先创建资源 module,这个不多说了.不会的自行百度.
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
//下面 3 行是重点
dev1Implementation project(':dev1module')
dev2Implementation project(':dev2module')
dev3Implementation project(':dev3module')
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test:runner:1.2.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}
xxxImplementation 代表 各个渠道的名称,把需要分渠道的文件,放到不同的 module 里面,把主项目的文件删掉。等你运行的时候,选择哪一个项目,就使用哪个项目的资源 module.
我创建了 3 个 module,这个3 个 module 里面的 string 和 color 和 drawable 都是一样的,包括文件的名字.比如 logo,如下图.图片的内容不一样,但是名字是一样的.
image.png
image.png
这样,在主 module 里面的清单文件引用 logo,就和正常项目一样啦
android:icon="@drawable/logo"
app_name 以及 color 啥啥啥的同理可得.
精简后的 build.gradle,logo,名字,color,value....都在各个module设置了.
apply plugin: 'com.android.application'
def releaseTime() {
return new Date().format("yyyy-MM-dd hh:mm")
}
android {
compileSdkVersion 29
buildToolsVersion "29.0.2"
defaultConfig {
applicationId "com.mcy.dev"
minSdkVersion 21
targetSdkVersion 29
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
flavorDimensions "app"//gradle 3.0.0 以上
}
// 签名文件
signingConfigs {
config {
keyAlias 'mcy1'
keyPassword '123456'
storeFile file('../mcy.jks')
storePassword '123456'
}
}
productFlavors {
dev1 {
dimension "app"
applicationId "com.mcy.dev1"//包名
}
dev2 {
dimension "app"
applicationId "com.mcy.dev2"//包名
}
dev3 {
dimension "app"
applicationId "com.mcy.dev3"//包名
}
}
buildTypes {
debug {
signingConfig signingConfigs.config
}
release {
minifyEnabled false
zipAlignEnabled true
//移除无用的resource文件
shrinkResources false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.config
// 批量打包
applicationVariants.all { variant ->
variant.outputs.all {
outputFileName = "${variant.productFlavors[0].name}_${releaseTime()}.apk"
}
}
// 批量打包(gradle 3.0.0 以上)
android.applicationVariants.all { variant ->
variant.outputs.all {
outputFileName = "${variant.productFlavors[0].name}_${releaseTime()}.apk"
}
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
dev1Implementation project(':dev1module')
dev2Implementation project(':dev2module')
dev3Implementation project(':dev3module')
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test:runner:1.2.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}
}
还有一种办法
就是下面的友情链接2,写的老详细了,还很简单.我就放个截图.
image.png
END
友情连接1 : https://www.jianshu.com/p/533240d222d3
友情链接2 : https://blog.csdn.net/qq_36674248/article/details/83751293
这个写的比较好,还有定义变量,我没用到,所以我没写.
如有侵权或有问题,请联系Q:1032528317