1. 程式人生 > >AndroidStudio同一套程式碼打出不同包名的應用

AndroidStudio同一套程式碼打出不同包名的應用

今天遇到了一個問題:

之前公司申請軟著的應用名字和現在上架的應用並不是同一個,所以在上架應用商店的時候遇到了問題

老闆的意思是:我們兩個都要做,一個是給企業使用者用的,一個是給個人使用者用的

香鍋騷話Buff大龍全都要 F6不敢要?

那我們也不可能另開一個專案了,所以我們只能是:一套程式碼,打兩個包,同時維護。

搜了搜有gradle配置方案來做這件事,我們需要設定的是app的build.gradle

android {
 productFlavors {
        app1 {
            applicationId "com.xx.xx1"
            // 自動生成@string/app_name為demo
            resValue "string","app_name","第一個app的名字"
            buildConfigField "int", "TYPE", "1"
            manifestPlaceholders = [app_icon : "@mipmap/ic_launcher",
                                    provider_name:"com.xx.xx1.fileprovider",
                                    app_round:"@mipmap/ic_launcher_round"]
        }
        app2 {
            applicationId "com.xx.xx2"
            resValue "string","app_name","第二個app的名字"
            resValue "string","provider_name","com.xx.xx2.fileprovider"
            buildConfigField "int", "TYPE", "2"
            manifestPlaceholders = [app_icon : "@mipmap/ic_launcher2",
                                    provider_name : "com.xx.xx2.fileprovider",
                                    app_round:"@mipmap/brand_value_icon_round"]
        }
    }
}

首先是在android{}這個層級下增加productFlavors{},然後如圖所示

這裡注意:我們的目的是要把AndroidManifest.xml中的app_name 和app_icon都放到gradle中,類似於資原始檔的指向,所以在清單檔案裡,要這麼寫:

由於之前,app_name指向了strings.xml檔案中的值,我們要把這個值刪掉,指向gradle檔案中的值。

這裡要注意:由於我們的專案適配了8.0的圖示,因此你需要再做一套圖示,詳見

https://blog.csdn.net/LXStrt01/article/details/83868923

注意第二個應用的圖示叫什麼都行,但是不能叫做ic_launcher了,因為會把第一個的圖示給覆蓋掉。

然後我在這裡遇到了一個坑,就是雖然兩個應用都用了不同的圖示了,但是跑起來結果並不是。找了一番之後發現問題還是在Manifest檔案裡,

這裡也需要配置不同的圓角圖示,因此又要指向gradle檔案。

manifestPlaceholders的值是一個[]陣列,我們用逗號隔開即可定義app_icon或者是自己想定義的名字,只要和清單檔案裡寫的一樣就好了

在這些配置後,我們打包可以得到兩個app,包名不同,圖示也不同,但是仍然不能安裝到同一個手機裡,這是因為它們使用了相同的provider.不清楚這個操作的同學可以去搜一下。

好吧,我們又要提出來一個值,老規矩,gradle檔案,manifestPlaceholders,逗號隔開

這樣配置完之後,我們就可以得到兩個圖示、包名完全不同,也可以在一個手機上共存的app了。當然,如果你的專案內建了自動更新等功能,還是要考慮區分的。