Android學習探索之App多渠道打包及動態新增修改資源屬性

總李寫程式碼發表於2017-06-01

前言:

     關於Android渠道打包是一個比較老的話題,今天主要記錄總結一下多渠道打包以及如果動態配置修改一些資源屬性。今天以公司實際需求為例進行演示,由於專案複用很多公共的業務元件,而且業務元件之間的跳轉採用Scheme協議,每個業務元件的host地址不變,所以需要在打包的時候動態修改scheme協議名字。為了方便舉例,首先我們這裡假設我們一個App要打出兩個不同的渠道,方便進行資料統計。

第一步宣告一個渠道引數 AndroidManifest.xml中

<meta-data
 android:name="APP_CHANNEL"
 android:value="external" />

為了方便通過gradle自動替換,value需要替換成標記位的方式

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

第二步在gradle中利用productFlavors宣告渠道型別,

  比如我們這裡宣告一個外部版本一個內部版本,manifestPlaceholders 替換AndroidManifest中的${APP_CHANNEL}值

    productFlavors {
        external {
            manifestPlaceholders = [APP_CHANNEL: "external"]
        }
        internal {
            manifestPlaceholders = [APP_CHANNEL: "internal"]
        }
    }

上面的也可以修改成批量處理方式

    productFlavors {
        external {}
        internal {}
        productFlavors.all { flavor ->
            flavor.manifestPlaceholders = [APP_CHANNEL: name]
        }
    }

第三步重新build專案會生成build選項,如下圖所示:

打包的話可以通過在android studio底欄中有個命令列工具Terminal,例如打包所有渠道可以執行下面的命令

gradlew assembleRelease

如果要打指定渠道的話,可以執行下面的命令,例如要打external外部版本

gradle assembleExternalRelease

也可以通過gradle projects裡面生成的命令選項進行打包,生成的選項如圖所示:

第四步修改生成渠道包檔名

buildTypes {
        release {
            //混淆
            minifyEnabled false
            //是否壓縮對齊
            zipAlignEnabled true
            //清除不用的資源
            shrinkResources false
            //混淆指令碼路徑
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'
            signingConfig signingConfigs.releaseConfig
            //自定義apk名字
            applicationVariants.all { variant ->
                variant.outputs.each { output ->
                    output.outputFile = new File(
                            output.outputFile.parent,
                            "${applicationId}-${variant.productFlavors[0].name}-${versionName}-${releaseTime()}.apk".toLowerCase())
                }
            }
        }
        debug {
            //debug時候也採用正式簽名檔案
            signingConfig signingConfigs.releaseConfig
        }
    }
}

第五步定製app scheme地址

 根據上面的渠道替換原理,只需新增一個scheme標記即可

<activity
            android:name=".GoodsDetailActivity"
            android:theme="@style/AppTheme">
            <!--要想在別的App上能成功調起App,必須新增intent過濾器-->
            <intent-filter>
                <!--協議部分,隨便設定-->
                <data
                    android:host="goods"
                    android:path="/goodsDetail"
                    android:port="8888"
                    android:scheme="${myScheme}"/>
                <!--下面這幾行也必須得設定-->
                <category android:name="android.intent.category.DEFAULT"/>
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.BROWSABLE"/>
            </intent-filter>
        </activity>

在gradle中新增替換

  manifestPlaceholders = [
                myScheme: "XApp",
        ]

替換指定屬性,比如顏色值,使用如下程式碼

  resValue  "color", "app_theme_color", "#283146"

總結:

    根據多渠道打包的原理來實現定製特定需要的app包。

 

相關文章