android 多渠道打包 變種打包(variant)方式

由于android應(yīng)用分發(fā)渠道無(wú)數(shù),很多時(shí)候需要對(duì)應(yīng)不同的渠道做相應(yīng)的資源文件上甚至功能上的定制,比如上360首發(fā)需要在launcher頁(yè)上面加上360logo,有些應(yīng)用市場(chǎng)是禁止應(yīng)用的自動(dòng)更新功能還有之前上百度市場(chǎng)需要集成sdk,幸好gradle提供應(yīng)對(duì)這個(gè)情況的解決方案,輕松應(yīng)對(duì)這個(gè)dirty work。

Build Variants

假設(shè)我們需要打三個(gè)不同的版本的apk,一個(gè)供自己官網(wǎng)下載,一個(gè)百度市場(chǎng),一個(gè)小米市場(chǎng)。我們?cè)诠こ蘠uild.gradle文件增加如下配置

android {
    ....


    productFlavors {
        baidu {
        }

        xiaomi {
        }
        
        other {
        }
    }
}

然后Build->Generate Signed Apk

genapk.jpeg

最后生成了3個(gè)apk


2.genapk.jpeg

*在Android Studio調(diào)試時(shí)切換不同的Variants

在Android Studio的最右邊靠下有個(gè)Build Variants點(diǎn)開(kāi),然后就可以選擇想調(diào)試的Variant

3.variant.jpeg

二 對(duì)于不同渠道不同資源的處理

假設(shè)小米應(yīng)用市場(chǎng)和百度應(yīng)用市場(chǎng)都需要在某個(gè)頁(yè)面打上各自獨(dú)家logo,就是需要將drawable/lily_lake.png 在不同渠道打上不同渠道的logo

1. 在src文件創(chuàng)建和上面配置相同的名字的文件夾,具體如下

res.jpeg

2. 在與原資源類(lèi)似的目錄下添加打上logo的圖片,如下圖,gradle在打包的時(shí)候就會(huì)根據(jù)不同的Variant提取相應(yīng)的資源。

4.jpeg

3. 不僅圖片,字符資源也是可以定制的

假設(shè)我們?cè)诎俣葢?yīng)用市場(chǎng)首發(fā),我們的應(yīng)用名改成 “百度首發(fā)XXX”。同樣的我們?cè)赽aidu的資源文件夾下添加一個(gè)string資源文件,然后添加:

<resources>
    <string name="app_name">百度首發(fā)XXX</string>
</resources>
C8FA4DDE-E3C5-4A11-8CB3-B1A9CE3DB954.png

三 AndroidManifest.xml 以及 BuildCofig.java

1. 在AndroidManifest.xml添加

     <meta-data
            android:name="UMENG_CHANNEL"
            android:value="${UMENG_CHANNEL_VALUE}" />

UMENG_CHANNEL_VALUE 可以在打包的時(shí)候根據(jù)不同的variant然后賦值

productFlavors{
        baidu{
            manifestPlaceholders = [UMENG_CHANNEL_VALUE:"baidu"]
        }

        other{
              manifestPlaceholders = [UMENG_CHANNEL_VALUE:"other"]
        }

        xiaomi{
            manifestPlaceholders = [UMENG_CHANNEL_VALUE:"xiaomi"]
        }
    }

或這么寫(xiě)

    productFlavors.all { flavor ->
        flavor.manifestPlaceholders = [ UMENG_CHANNEL_VALUE:name ]
    }
應(yīng)用場(chǎng)景:不同渠道需要建立不同的數(shù)據(jù)統(tǒng)計(jì)(使用友盟之類(lèi)也會(huì)用到),那么我們可以讀取AndroidManifest該應(yīng)用的分發(fā)渠道。
ApplicationInfo appInfo = null;
        try {
            appInfo = getPackageManager()
                    .getApplicationInfo(getPackageName(),
                            PackageManager.GET_META_DATA);
            String msg=appInfo.metaData.getString("UMENG_CHANNEL");
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }

2. BuildCofig.java 可以通過(guò)gradle增加其字段

    android{
        defaultConfig {
        ...
        //添加配置文件字段  
        buildConfigField "boolean", "AUTO_UPDATES", "true"
    }
    }

    productFlavors{
        baidu{
            //賦值
            buildConfigField "boolean", "AUTO_UPDATES", "false"
        }
    }

應(yīng)用場(chǎng)景:有的應(yīng)用市場(chǎng)不允許應(yīng)用自動(dòng)更新,那么我們BuildCofig.java增加一個(gè)字段判斷是否需要增加自動(dòng)更新功能
        if(BuildConfig.AUTO_UPDATES){
         //   更新
        }else {
         //  不自動(dòng)更新
        }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,872評(píng)論 25 709
  • 目錄一、Python打包及優(yōu)化(美團(tuán)多渠道打包)二、Gradle打包三、其他打包方案:修改Zip文件的commen...
    守望君閱讀 5,930評(píng)論 4 17
  • 這一章主要針對(duì)項(xiàng)目中可以用到的一些實(shí)用功能來(lái)介紹Android Gradle,比如如何隱藏我們的證書(shū)文件,降低風(fēng)險(xiǎn)...
    acc8226閱讀 7,965評(píng)論 3 25
  • 1.介紹 如果你正在查閱build.gradle文件的所有可選項(xiàng),請(qǐng)點(diǎn)擊這里進(jìn)行查閱:DSL參考 1.1新構(gòu)建系統(tǒng)...
    Chuckiefan閱讀 12,356評(píng)論 8 72
  • IO/NIO/AIO 的區(qū)別: IO和NIO 又稱(chēng)為Blocking IO 和 No Blocking IO 即為...
    maven_hz閱讀 1,639評(píng)論 0 5

友情鏈接更多精彩內(nèi)容