1. 程式人生 > >android 多渠道打包的應用

android 多渠道打包的應用

我們知道現在Android開發現在一般用gradle進行專案管理,所以這裡就說說怎麼麼通過gradle配置來實現多渠道打包的問題。在講怎麼實現多渠道打包之前,先說說為什麼要使用多渠道打包。比如我們開發一款app,有兩個版本一個是付費版本,一個是免費的版本,這個兩個個版本實現的大部分功能都是一樣的但是有部分功能不一樣,這時該怎麼辦呢,當然我們可以建兩個android專案,一個付費專案,一個免費的專案,但是這個就複雜了,因為大部分的功能都是一樣的啊,那我麼怎麼在一個專案中進行差異化的開發呢,這時就可以用到多渠道打包了。所謂的多渠道打包,說到底就是在一個專案中,通過配置gradle來實現通過不同的打包命令,編譯出包含不同res和java的apk。

這裡可以通過三種方式來實現差異化打包,一是BuildConfig,再就是多版本res,或者是多版本java,這裡先從總得角度來看看如何在gradle中進行配置。

flavorDimensions("money")

productFlavors{
    free{
        //android:app_name="${app_name}"
        manifestPlaceholders = [app_name: "@string/app_name"]
        //getResources().getString(R.string.flovor_log)
        resValue("string"
,"flovor_log","this is free log") //下面的常亮會被加到BuildConfig中 buildConfigField("String", "HTTP_BASE", '"https://www.baidu.com/api/release/"') } vip{ manifestPlaceholders = [app_name: "@string/app_name"] resValue("string","flovor_log","this is vip log") } } sourceSets{ main{ res.srcDirs = ['res'
] assets.srcDirs = ['assets'] jniLibs.srcDirs = ['libs'] manifest.srcFile 'AndroidManifest.xml' } free{ java.srcDirs = ["money/free/src"] } vip{ java.srcDirs = ["money/vip/src"] res.srcDirs = ["money/vip/res"] } }

以上程式碼由三個模組組成,一個是flavorDimensions模組,二是productFlavors模組,三是sourceSets模組,下面就分別針對這幾個配置模組來說說。

1、flavorDimensions模組

這個模組定義多渠道的維度,所謂的委屈就是版本是根據什麼區分的,比如這裡是根據是否收錢來區分,如果再有在不同app store釋出版本也有區別的話,就得再多定義一個維度了,關於維度的理解可以可以看看 Android Gradle(3)— FlavorDimensions,構建變體 這篇文章。

2、productFlavors模組

上面通過flavorDimensions模組定義個一個money維度,然後再這個模組定義了money維度下的兩個渠道,一個是收費的vip渠道一個是免費的free渠道。

如果vip和free兩個版本差異不大,就是改改不同欄位的值什麼的,或者小範圍的程式碼差異,那麼既可以在這一模組解決這些差異,由以上程式碼可以看出,有三種方式可以實現小範圍的程式碼差異化。

2.1、manifestPlaceholders

由manifestPlaceholders定義的關鍵字,能夠去替換manifest.xml中的對應值,如程式碼中定義的

manifestPlaceholders = [app_name: "@string/app_name"]

這裡的app_name可以替換manifest.xml中的,如下配置中的app_name中的值

android:app_name="${app_name}"

2.2、resValue

由resValue中定欄位,可以再java程式碼中使用,去替換對應資源欄位的值

resValue("string","flovor_log","this is free log")

這個定義,在java程式碼中通過一下程式碼,便能夠獲取“this is free log”的值。

getResources().getString(R.string.flovor_log)

2.3、BuildConfig

BuildConfig的配置,通過buildConfigField這個欄位來實現

buildConfigField("String", "HTTP_BASE", '"https://www.baidu.com/api/release/"')

這個配置,會在編譯的時候生成一個BuildConfig.java的檔案,其中就包含了一個名為HTTP_BASE的公共靜態欄位,其值就是這裡配置的”https://www.baidu.com/api/release/
,於是乎我們能夠在java程式碼中通過不同渠道的BuildConfig中配置的值不一樣來獲取不同的值。

這個小節基本就對應著上面我們說的實現多渠道的BuildConfig方式了(雖然不僅僅是BuildConfig方式哈)。

3、sourceSets模組

如果版本之間的差異化太大了,我們總不能匯出通過manifestPlaceholders 、resValue以及BuildConfig來實現,我們就希望能夠有寫在一個專案中寫多個版本的res或者多個版本的java程式碼,這樣以後維護程式碼也會容易的多,這就是我們在sourceSets模組中,乾的事情了。

3.1、多res版本

實現多res版本比較簡單,只需要在對應渠道中進行一下配置

res.srcDirs = ["money/vip/res"]

根據配置的路徑在src同級目錄下,建立money/vip/res的目錄,因為在主程式碼中存在一套res程式碼,於是我們實現多渠道的時候,只需要在對應渠道資源目錄中放需要同主程式碼不一樣的res資源就行了。

3.2、多java版本

實現多res版本也是比較簡單的,同樣通過以下配置

java.srcDirs = ["money/vip/src"]

這個同樣需要在src同級目錄下建立money/vip/src目錄,然後按照主分支中的對應java檔案的路徑繼續建立對應包名路徑,然後再包名路徑下放對應的java檔案。

這和多res版本還有差別,多res版本多渠道打包的時候會檢查渠道res目錄下是否有對應資源,如果有則優先使用渠道資源,沒有的話就會去主專案中res目錄下找資源。而多java版本在打包的時候則只會去對應渠道中找java檔案,如果發現主專案中也存在同名java檔案就會報錯,所以多java版本的多渠道實現,如果一個版本的java檔案要差異化則每個渠道的對應目錄下都得放一個對應的改java檔案(因為主專案中沒有改java檔案公用)。

這第三節就說清楚了,多渠道打包的多res版本方式和多java版本方式。

參考文獻