安卓AndroidAndroid知识梳理

Android gradle 动态设定App包名,logo,名称

2019-12-11  本文已影响0人  鹅鹅鹅曲项向天歌呀

前提:公司需求,有两个客户的 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 个包名.点击下图,就可以看到不同包名的项目了.运行哪一个选哪一个咯.

image.png

修改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
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

上一篇下一篇

猜你喜欢

热点阅读