需求
目標(biāo):一套代碼分成不同的分支版本毫玖,在同一個(gè)工程下管理這幾個(gè)版本掀虎。
多個(gè)分支版本之間,通常有以下異同:
- 不同版本之間大部分代碼相同付枫,如果分成多個(gè)工程烹玉,修改一處功能就要多個(gè)工程同時(shí)修改,不便于管理及多人協(xié)作阐滩。
- 不同版本的UI樣式不同二打,包括顏色、圖標(biāo)等資源掂榔、部分頁面的代碼等继效。
- 不同版本的manifest元素有不同,比如部分key值等装获。
- 不同版本包名不同瑞信。
解決方案:Android Studio中使用Gradle編譯多種apk包依靠productFlavors功能實(shí)現(xiàn)。
步驟
-
準(zhǔn)備好原始工程穴豫,在工程的build.gradle中定義productFlavors凡简。
效果圖在這個(gè)主工程下面定義了兩個(gè)分支版本,edition1和edition2精肃,包名分別為com.clj.edition1和com.clj.edition2潘鲫。還可以為其指定不同的版本號及proguardFiles等。其他沒有特別指定的值肋杖,會默認(rèn)為主工程defaultConfig中的值溉仑,相當(dāng)于在productFlavors中重寫了主工程的默認(rèn)值,類似于Java中的Override状植。
-
在src目錄下新建相對應(yīng)的文件夾存放每個(gè)分支與主版本之間不同的代碼及資源浊竟。
效果圖 -
分支版本的目錄需要和main的目錄保持一致。
效果圖edition1和edition2中的MainActivity代碼不同津畸,所以從main中抽離出來振定。PublicActivity1和PublicActivity2是不同版本之間一樣的,所以仍然放在main中肉拓。兩個(gè)版本的ic_launcher啟動圖標(biāo)不同后频,所以都覆蓋了main中的ic_launcher。需要注意的是,java文件夾中的文件卑惜,在分支版本和main中不能同事存在膏执;而res中可以同時(shí)存在,分支會覆蓋mian中的文件露久。
-
manifest中的元素并不是覆蓋的關(guān)系更米,而是合并的關(guān)系。
效果圖
效果圖示例中毫痕,edition2的manifest并沒有對main的manifest中的application元素節(jié)點(diǎn)進(jìn)行復(fù)寫征峦,假如在edition2的application元素添加
android:supportsRtl="false"
就會和main中的android:supportsRtl="true"
的沖突。另外edition2針對PublicActivity1添加了android:screenOrientation="portrait"
屬性消请,則會和main中的publicActivity的屬性進(jìn)行合并栏笆。