前几天项目闲暇之余看了一下同事做的这个功能,之前没做过,学习了一下,现总结如下:

主要分为三部曲:

一、在AndroidManifest.xml中定义渠道,代码如下,这里的name值随意定义:

<meta-data
    android:name="APP_CHANNEL"
    android:value="${APP_CHANNEL_VALUE}" />

二、app的Gradle中定义渠道以及其他信息

1、定义渠道签名

signingConfigs {

    App1 {
        storeFile file("keystore/t.jks")
        storePassword "***"
        keyAlias "***"
        keyPassword "***"
    }

    App2 {
        storeFile file("keystore/t1.jks") 
        storePassword "***" 
        keyAlias "***" 
        keyPassword "***"
    }

    App3 {
        storeFile file("keystore/t2.jks")
        storePassword "***"
        keyAlias "***"
        keyPassword "***"
    }
}

2、定义各渠道applicationId,版本、appName、logo等等信息,这里定义不同的applicationId也就可以同一个包生成不同的app,在同一个手机上安装了,这里的resValue "string", "mapp_name", "测试App1"  ,就是定义app name,在AndroidManifest.xml中对应 android:label="@string/mapp_name" ,这样就可以更改app name,这里的resValue常用于设置string.xml中的一些值,比如定义 string resValue "string", "mapp_name", "测试App1" ,定义 boolean  resValue "bool", "debug", "true"  ,

定义int  resValue "integer", "number", "1"  manifestPlaceholders 对应AndroidManifest.xml中定义的值,下面代码的APP_CHANNEL_VALUE就是meta-data里面定义的,在这里动态赋值。这里的app_icon就是android:icon="${app_icon}" ,

这里的buildConfigField对应BuildConfig文件里的常量,比如如果我们的不同包的api的host不同的话,就可以在这里为不同包设置不同的host,比如这里的buildConfigField "String", "HOST", '"http://www.jd.com"'就是为app1设置的host,然后编译一下就可使用,然后使用的时候就是 BuildConfig.HOST + "api/product",然后就是设置每个不同包的签名 signingConfig signingConfigs.App1就是对应signingConfigs定义的App1。app_icon资源文件应该在main的同级目录创建不同的包,命名应该和signingConfigs中定义的一样,然后再放对应的res资源,如下图:

Gradle 一套代码编译成不同的包,不同的名字和logo

productFlavors {
    app1 {
        applicationId "com.news.star.news1"
        versionCode 1
        versionName "1.0.0"
        resValue "string", "mapp_name", "测试App1"

        manifestPlaceholders = [APP_CHANNEL_VALUE: "app1",
                                app_icon         : "@mipmap/logo_desk"]
        buildConfigField "String", "HOST", '"http://www.jd.com/"'
        signingConfig signingConfigs.App1
    }

    app2 {
        applicationId "com.news.star.news2"
        versionCode 2
        versionName "1.0.1"
        resValue "string", "mapp_name", "测试App2"

        manifestPlaceholders = [APP_CHANNEL_VALUE: "app2",
                                app_icon         : "@mipmap/logo_desk"]
        buildConfigField "String", "HOST", '"http://www.tm.com/"'
        signingConfig signingConfigs.App2
    }

    app3 {
        applicationId "com.news.star.news3"
        versionCode 3
        versionName "1.1.0"
        resValue "string", "mapp_name", "测试App3"

        manifestPlaceholders = [APP_CHANNEL_VALUE: "app3",
                                app_icon         : "@mipmap/logo_desk"]
        buildConfigField "String", "HOST", '"http://www.xm.com/"'
        signingConfig signingConfigs.App3
    }
}

经过以上的配置基本都已完成,编译的时候应该会提示如下错误:

All flavors must now belong to a named flavor dimension. 

需要我们配置flavorDimensions

Gradle 一套代码编译成不同的包,不同的名字和logo

温馨提示:

做了不同包以后本地更新下载的代码一般情况下需要更改一下了,在7.0的下载权限定义APP_File_Provider的时候,就需要利用上面说过的BuildConfig的方式去为不同的包配置了,用法是

FileProvider.getUriForFile(mContext, BuildConfig.APP_FILE_PROVIDER, apkfile);

以上纯属自我总结,如有错误请大佬指正,多谢。

 

相关文章:

  • 2021-04-12
  • 2022-12-23
  • 2022-12-23
  • 2021-06-26
  • 2021-11-28
  • 2021-04-13
  • 2021-07-31
  • 2021-09-17
猜你喜欢
  • 2021-08-12
  • 2022-12-23
  • 2021-03-30
  • 2021-10-31
  • 2021-08-07
  • 2022-01-21
  • 2022-12-23
相关资源
相似解决方案