android studio多渠道多包名多apk打包


轉自  利用 Android Studio 和 Gradle 打包多版本APK

  搬磚的道路上,經常會有各種不同的需求,比如今天就碰到過一個打包版本的apk的要求,

比如一個apk給多個客戶使用,如張三公司 ,李四集團,而我們的服務端的api域名以及處理方式也不一樣,

苦逼的方式是一個一個修改包名,代碼,但如果我們使用了Android Studio 和 Gradle,似乎變得許多了很多,

不信,騎驢找馬,來一發:

   在 Android Studio 中打開 build.gradle(Module中)的 android 節點下添加如下代碼

 

buildTypes {

    //這里的名字自定義,不要求大小寫
    release{
    
        // 這里是在 applicationId 中添加了一個后綴。所以『.』要加上
        applicationIdSuffix ".release" 
        
        // 這里的作用是選擇是否混淆代碼
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }

    dev{
        applicationIdSuffix ".dev"
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

    }
}

// 這里是為了不同過的版本設置一些特殊的參數,並不直接和 buildType 關聯。
//例如:使用 buildType 中的 dev 版本,也可以使用 flavors_release 里面設置的自定義參數。這需要自己按照需求制定。
productFlavors{

//自定義名字不過不能和上面buildType中相同,不然Gradle編譯會不通過。在這里使用了『flavors_』前綴以便區分。
    flavors_release{
    
    // manifestPlaceholders中寫到的『str』,『package_name』不支持用大寫,否則Gradle編譯會不通過。
    // 這里所設置的變量可以直接使用在『AndroidManifest.xml』中,使用方式為:${package_name}
    // android:label="${package_name}" 
        manifestPlaceholders = [str:"releaseStr",package_name:"com.sunhz.mvptest.release"]

        // 這里的參數是為了在 java 代碼中使用,具體的使用方式為:context.getResources().getString(R.string.strKey);
        resValue("string" , "strKey","releaseStrValue")
    }

    flavors_dev{
        manifestPlaceholders = [str:"devStr",package_name:"com.sunhz.mvptest.dev"]

        resValue("string" , "strKey","devStrValue")
    }
}

上面設置完成后,我們要在哪里使用它?

使用方式如下: 在 Android Studio 的工具欄中,找到『Build』項,找到『Generate Signed APK…』,如下圖。

選擇 Module -> 創建 APK key,或者輸入 APK key密碼 -> 關鍵來了!如下圖。

在『BuildType』處,選擇我們在 build.gradle 中設置的兩個 BuildType,分別是releas,dev,debug。其中『debug』為 Android Studio 自帶的。

在『Flavors』處,選擇我們在 build.gradle 中設置的兩個Flavors,以方便直接使用定義在 build.gradle 中自定義的參數。

所以! 上面我有提到說,buildType 和 Flavors 並沒有直接的聯系。 他們可以根據用戶需求互相配合使用。如上圖,BuildType 選擇了 release,但 Flavors 選擇的卻是 flavors_dev。

到此基本的使用就全部說完了。

這里有一個問題,打出來的不同版本的包,全部都能夠在同一部手機上安裝,且能夠將兩個包全都發布到 Google 的市場上去這是為什么呢?

這里就要提到在 BuildType 中我們所設置的『applicationIdSuffix』屬性了,按照這個屬性的字面翻譯為:『applicationId 的后綴』,那這里又來了一個問題,『applicationId』是什么? 其實這個『applicationId』屬性,實際上在項目創建完成后就存在於 build.gradle 中。在 android 節點下的 defaultConfig 節點中。而且默認的 applicationId 和 AndroidManifest.xml 中的 package 屬性相同。

如下圖:

 

我們能夠看到,這兩個屬性的默認值是相同的。

applicationId 和 packageName 它們是什么關系?

默認創建項目后,兩者相同。如果需要根據不同的需求構建不同版本的APK,這時我們通過設置『applicationIdSuffix』可以做到。

這里有一個值得注意的現象。

舉個例子,我們在打包時使用了 dev 類型,將打包出來的 APK 軟件安裝到手機中。

使用如下代碼,獲取我們手機上所有程序的packageName。

PackageManager packageManager = mContext.getPackageManager();
List<PackageInfo> packageInfoList = packageManager.getInstalledPackages(PackageManager.GET_PERMISSIONS);
List<String> packageNameList = new ArrayList<String>();
for (PackageInfo packageInfo : packageInfoList) {
    packageNameList.add(packageInfo.packageName);
}

  這樣就能獲取到我們的包名了,然后可以

 

我們打印出來的包名信息中,會出現 com.spencer_dev.test.dev 。並沒有出現 com.spencer_dev.test 。

但是! 如果通過反編譯工具,將 APK 包進行反編譯直接查看源代碼,在 java 代碼所在的 src 目錄中的包名,還和我們設置的一樣,為 com.spencer_dev.test 。可 AndroidManifest.xml 中的 package 和 BuildConfig 類中的 APPLICATION_ID 已經變成了 com.spencer_dev.test.dev 。

applicationId 和 packageName 它們各自代表什么?

按照上面的結果來說, package 代表了 java 代碼中的包名。 applicationId 代表了應用中的唯一標識。和應用簽名一起用來區別和其他應用不同。我想這也就是為什么 Google 市場能夠允許相同應用不同 applicationId 的原因。

當我們獲取到applicationId 以及包名后可以在每次請求服務端api時傳遞這個值,以實現服務端的一些功能!


免責聲明!

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



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