Android 多包名打包應用

XiaoChen發表於2018-03-06

簡介: 公司的新需求:同一份程式碼打出另一個包名的apk,即包名不同、名稱不同的兩個apk。

我經過多方渠道發現大致有一下三種方法:

  • 通過ant打多包名應用
  • 建立多個與“main”同級的資料夾,修改清單檔案及build.gradle以達到打多包名效果
  • 通過修改build.gradle檔案的applicationId達到打多包名的效果,原理與第二種方法但比較簡單

因為是新手,對ant並不太瞭解,原理也不太清楚,為了趕時間所以直接選擇了第二種與第三種方法,經過測試發現第三種方法要更加簡單的多,所以最後直接使用了第三種方法,以下為詳解。


因為要修改的是build.gradle檔案而該檔案一經修改就要重新編譯,用過史丟丟的童鞋應該都清楚等待編譯完成是是件多麼蛋疼的事情所以建議大家一次性修改完成以便節約開發時間。

上面已經說過該方法主要是通過修改build.gradle檔案的applicationId達到打多包名的效果的,下面便粘出本人程式碼供大家參考。

  productFlavors {
        app_one {
            applicationId "com.example.app1"
            manifestPlaceholders = [
                    app_name:"測試-1"
            ]
        }
        app_two {
            applicationId "com.example.app2"
            manifestPlaceholders = [
                    app_name:"測試-2"
            ]
        }
        app_three {
            applicationId "com.example.app3"
            manifestPlaceholders = [
                    app_name:"測試-3"
            ]
        }
    }
複製程式碼

是不是感覺這個方法很眼熟? 沒錯就是多渠道打包的地方,通過新增這段程式碼後需要用到gradle皮膚進行打包,得到app_one 通過檢視包名發現它的包名為 com.example.app1 顯示的名稱也為 測試-1,app_two 與 app_three 效果等同,至此已經完成多包名打包,且通過同一份程式碼打出了不同包名、不同名稱的三個應用,而需求也達到了。

可能有的朋友會問如果還需要其他的渠道包怎麼辦,如果有10的渠道而又要打包兩個不同的應用那豈不是要寫20個類似於app_one的東西,那不是要很麻煩?沒錯我正好也碰到了這種情況,經過多次研究測試發現並沒有那麼麻煩,只需設定一個預設的包名、應用名即可,廢話不多說,直接貼程式碼。

 defaultConfig {
        if (PACKAGE == "one") {
            applicationId "com.example.app1"
            manifestPlaceholders = [
                    app_name:"測試-1"
            ]
        } else {
            applicationId "com.example.app2"
            manifestPlaceholders = [
                    app_name:"測試-2"
            ]
        }
        minSdkVersion 14
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"

    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    productFlavors {
        app_one {}
        app_two {}
        app_three {}
    }
複製程式碼

嗯,就是這樣,在defaultConfig裡面設定一個預設的包名與應用名就可以了。

好了,到了這一步我們就要用到另一個神奇的檔案了

工程目錄下配置檔案

看看你的工程根目錄下得這個東西,沒錯就是它,這裡我設定了一個欄位“PACKAGE”,即告訴Studio我想要什麼包,到這裡相信大家也就明白我寫的判斷的目的了。

PACKAGE=one
複製程式碼

只要通過修改這一欄位為“one”,然後通過打包後就可以得到三個“測試-1”的app_one、app_two、app_three的apk檔案了,同理將其修改為其他欄位即可打出其他包名、應用名的應用了。 但是轉到本人公司專案後發現這種方法竟然失靈了,即修改 properties 檔案內的欄位後得不到我想要的包,經過探索發現可能是與專案工程的大小有關,改完重啟後就可以了。 當然還有另一個最重要的地方

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.morepackagenametest">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="${app_name}"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
複製程式碼

就是這裡了,即之前定義的名字賦給應用了,在這裡大家要注意一下在該專案的其他 model 內的清單檔案裡最好不要寫 android:label 這句了,否則會報錯的,至於是什麼錯一眼就可以看到了,當然如果報錯了有兩個方法:

  1. 刪掉其他 model 內清單檔案下applicationlabel 屬性
  2. 通過在 application 下新增 tools:replace="android:label" 屬性解決

好了,打完收工。期待大神的批評指導。

最後附上資源下載地址 Android 多包名打包應用 供各位參考

更多內容請移駕我的部落格

相關文章