1. 程式人生 > 實用技巧 >Gradle 一套程式碼編譯成不同的包,不同的名字和logo

Gradle 一套程式碼編譯成不同的包,不同的名字和logo

前幾天專案閒暇之餘看了一下同事做的這個功能,之前沒做過,學習了一下,現總結如下:

主要分為三部曲:

一、在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",定義 booleanresValue "bool", "debug", "true",

定義intresValue "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資源,如下圖:

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

溫馨提示:

做了不同包以後本地更新下載的程式碼一般情況下需要更改一下了,在7.0的下載許可權定義APP_File_Provider的時候,就需要利用上面說過的BuildConfig的方式去為不同的包配置了,用法是

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

以上純屬自我總結,如有錯誤請大佬指正,多謝。