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


前言:

     關於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包。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM