此處示例的目標是將相同的代碼打包到兩個包名不同的apk中:com.example.android.newsreader和com . example . Android . news reader dev。
1.首先,將以下代碼添加到build.gradle的android節點中
產品風味{
口味_發布{
manifest placeholders =[str:" release str ",package _ name:" com . example . Android . news reader "]
application id " com . example . Android . news reader "
}
口味_開發{
manifest placeholders =[str:" devStr ",package _ name:" com . example . Android . newsreaderdev "]
application id " com . example . Android . newsreaderdev "
}
}
productFlavors的作用是參數化打包,flavors_release和flavors_dev可以看作是自己定義的兩組變量,在實際操作中可以自定義。
註意有壹個manifestPlaceholders的參數,它實際上提供了幾個參數變量和值,這裏的所有參數都可以通過${name}的方式在AndroidManifest.xml中使用。本來想在AndroidManifest中參數化manifest的節點中的包,達到用不同的包名播放apk的目的,即:
& lt清單xmlns:Android = "/apk/RES/Android "
程序包= " $ {程序包名稱} "
android:versionCode="1 "
Android:version name = " 1.0 " & gt;
& lt用途-SDK Android:minSdkVersion = " 11 " Android:targetSdkVersion = " 14 "/& gt;
...
結果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應該是and這兩個,所以雙擊它們等待各自的進程生成apk。
3.檢查下面項目面板中的內容。
當我們打開項目面板時,我們發現實際上有幾個apk:
可以看到,每雙擊其中壹個gradle,就會生成三個apk。讓我們取出news reader-flavors _ dev-debug . apk和news reader-flavors _ release-debug . apk,用aapt命令檢查它們的包名(命令是aapt dump badging {filename.apk})。
果然包名不壹樣。
那麽可以同時安裝嗎?這裏,可以在模擬器中安裝兩個apk:
可以看到有兩個新聞閱讀器,完全壹樣,只是包名不同。
4.包裝時如何指定簽名?
輸入Build-& gt;在Android Studio的菜單欄裏。生成簽名的Apk:
指定您的密鑰庫,然後單擊下壹步:
在這裏,妳會發現flavors中有兩個項目,即我們在gradle中配置的兩個Flavors參數集。分別選擇它們,點擊完成,生成需要的apk。
5.有個問題,為什麽可以通過修改applicationId來修改包名?applicationID和packagename是什麽關系?
事實上,package在java代碼中表示包名。applicationId表示應用程序中的唯壹標識。與應用程序簽名壹起使用,以區別於其他應用程序。我想這就是為什麽Google market可以允許同壹個應用有不同的應用id。
最後壹個提示:打包後,最好在發布前進行全面測試,以免出現問題。