如何用Android Studio打多包名APK

來源:互聯網
上載者:User

標籤:android

問題:項目中不同的分發渠道可能需要打包多種APK(同樣的代碼),包名可能是不一樣的,如果一個一個修改包名重新編apk是很麻煩,可以參考下列步驟在Android Studio上操縱Gradle來打包不同包名的apk。

 

這裡例子的目標是,同樣的代碼,打包成com.example.android.newsreader和com.example.android.newsreaderdev兩個不同包名的apk

 

1. 首先在build.gradle的android節點中加入下列代碼

productFlavors{    flavors_release{        manifestPlaceholders = [str:"releaseStr",package_name:"com.example.android.newsreader"]        applicationId "com.example.android.newsreader"    }    flavors_dev{        manifestPlaceholders = [str:"devStr",package_name:"com.example.android.newsreaderdev"]        applicationId "com.example.android.newsreaderdev"    }}
這個productFlavors的功能即為打包的參數化而提供的,flavors_release和flavors_dev可以被視作自己定義的兩套變數集,實際操作中可以自訂注意到這裡有一個manifestPlaceholders的參數,裡面提供的實際上是幾個參數變數和值,這裡的參數都可以通過${name}的方式在AndroidManifest.xml中使用。原來是想在AndroidManifest中的manifest的節點將package給參數化來達到打不同包名的apk的目的,即:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"      package="${package_name}"      android:versionCode="1"      android:versionName="1.0">    <uses-sdk android:minSdkVersion="11" android:targetSdkVersion="14" />...

結果Android Studio的Lint自動給了我一個提示:


說明Android Studio推薦我採用設定applicationId的方式來將包名參數化 於是乎,我在flavors_release和flavors_dev中又加入了applicationId的設定,即:和

下面看看是否有作用

 

2.這一步需要操縱Gradle面板

此時我們在Android Studio的右側的gradle面板中點擊  按鈕重新整理下,於是在build子欄目中出現下列東西:


其中以assemble*打頭的都是產生apk的選項,產生的apk在build/outputs/apk中,這裡我們對任一項雙擊即可產生對應的apk

對應flavors_release和flavors_dev的apk應該就是和這兩個,於是分別雙擊他們等待各自產生apk的過程

 

3. 下面查看Project面板中的內容

開啟project面板,我們發現真的出現了幾個apk:


可以看出來每次雙擊gradle中的一條會產生三個apk,我們把newsreader-flavors_dev-debug.apk和newsreader-flavors_release-debug.apk拿出來,用aapt命令查看下他們的包名(命令為aapt dump badging {filename.apk})



果然,包名是不一樣的。那麼是否可以同時安裝呢,這裡把兩個apk都安裝到模擬器中,果然是可以的:

可以看到出現了兩個NewsReader,其實都是一模一樣的,只是包名不同

 

4. 如何在打包的時候指定簽名

在Android Studio功能表列進入Build->Generate Signed Apk:


指定你的keystore後點擊next:


這裡會發現在Flavors裡面有兩個項目,即我們在gradle裡面配置上的兩個flavors參數集,各自選上,點擊finish即可產生所需要的apk

 

5. 有個疑問,為什麼修改applicationId即可修改包名呢?applicationID和packagename到底是什麼關係

實際上, package 代表了 java 代碼中的包名。 applicationId 代表了應用中的唯一標識。和應用簽名一起用來區別和其他應用不同。我想這也就是為什麼 Google 市場能夠允許相同應用不同 applicationId 的原因。 最後一個提示: 打包出來後,發布前最好要全面測試下,以免出現問題

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

如何用Android Studio打多包名APK

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.