ApplicationId 與 PackageName
所有的 Android 應(yīng)用程序都有一個(gè)包名。包名是設(shè)備上的這個(gè)應(yīng)用程序的唯一標(biāo)識(shí)醋拧,也是在應(yīng)用商店上的唯一標(biāo)識(shí)。這意味著,一旦你已發(fā)布的程序使用了這個(gè)包名鬼悠, 你就永遠(yuǎn)都無(wú)法改變它;如果修改了就會(huì)導(dǎo)致你的應(yīng)用程序被當(dāng)作是一個(gè)全新的應(yīng)用程序亏娜,你之前的應(yīng)用程序的用戶(hù)也不能更新到使用了新的包名的安裝包厦章。
老的構(gòu)建系統(tǒng)
在此前的 Android Gradle 構(gòu)建系統(tǒng)中,你的應(yīng)用程序的包名由你的manifest文件的根元素里的package屬性決定:
AndroidManifest.xml:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.test.packagename">
然而照藻,這里所定義的包也有第二個(gè)目的:它被用來(lái)命名你的資源類(lèi)的包(以及解析任何相關(guān)的Activity的類(lèi)名)袜啃。在上面的示例中,生成的 R 類(lèi)將會(huì)是com.test.app.packagename.R幸缕,因此如果其他包里面的代碼需要引用這些資源群发,就需要導(dǎo)入com.test.app.packagename.R。
新的構(gòu)建系統(tǒng)
使用新的 Android Gradle 構(gòu)建系統(tǒng)发乔,你可以輕松構(gòu)建多個(gè)不同版本的應(yīng)用程序熟妓;例如,你可以構(gòu)建一個(gè)“full”版本和“sunmi”版本的應(yīng)用程序 (通過(guò)使用flavors)栏尚,并且這些不同版本的程序在 應(yīng)用商店上應(yīng)該有不同的包起愈,這樣他們可以被單獨(dú)安裝和購(gòu)買(mǎi),或者是同時(shí)安裝兩個(gè)译仗,等等抬虽。同樣,你還可以同時(shí)創(chuàng)建“debug”纵菌、“release”版本的應(yīng)用程序 (使用build types)阐污,而這些版本的程序同樣可以使用唯一的包名。
同時(shí)咱圆,你想要在代碼中導(dǎo)入的 R 類(lèi)必須在這段時(shí)間內(nèi)保持不變 笛辟;在你正在構(gòu)建的應(yīng)用程序的不同版本時(shí)你的.java 源文件不應(yīng)該被更改功氨。
因此,我們解耦了包名稱(chēng)的兩種用法:
最終的方案是手幢,在你生成的.apk 的manifest 中捷凄,并且用于在你的設(shè)備和 應(yīng)用商店來(lái)標(biāo)識(shí)你的應(yīng)用的包,叫做“application id”围来。
用于在源代碼中來(lái)引用你的R類(lèi)的纵势,并且是解析任何相關(guān)的Activity/Service 注冊(cè)的包,繼續(xù)被稱(chēng)為“package”管钳。
你可以在你 gradle 文件中钦铁,指定application id,如下所示:
app/build.gradle:
defaultConfig {
applicationId "com.test.packagename"
}
像以前一樣才漆,你需要在 Manifest 文件中指定用于代碼的包牛曹,就如上面的Andr??oidManifest.xml示例一樣。
這里說(shuō)到了最關(guān)鍵的部分:當(dāng)你像上面那樣做時(shí)醇滥,這兩個(gè)包是互相獨(dú)立的黎比。你能夠完全自由地重構(gòu)代碼——更改用于Activity和Service的內(nèi)部包,更新你的Manifest里的包鸳玩,和重構(gòu)你的import語(yǔ)句阅虫。這都不會(huì)影響到你的程序的最終id,這個(gè)最終的id的值總是為你的Gradle文件中指定的applicationId的值不跟。(注:packageName在代碼中使用颓帝,通常在AndroidManifest.xml中指定,applicationId則只是用于程序的標(biāo)識(shí)窝革,通常在build.gradle中指定购城。這樣有一個(gè)好處,假如你想發(fā)布一個(gè)full版虐译,一個(gè)sunmi版瘪板,你只需要在build.gradle中把a(bǔ)pplicationId后面加上sunmi的后綴包名(如".sunmi"),full版加上full版的后綴即可漆诽,而不需要修改你的其他代碼侮攀。)
你可以通過(guò)使用以下的 Gradle DSL 方法,為不同的flavors和構(gòu)建類(lèi)型修改你的應(yīng)用程序的 applicationId:
productFlavors {
full {
applicationId "com.test.packagename.full"
}
sunmi {
applicationId "com.test.packagename.sunmi"
}
注1: 出于兼容性原因厢拭,如果沒(méi)有在 build.gradle 文件中定義 applicationId兰英,這個(gè)applicationId 將默認(rèn)為 AndroidManifest.xml 中所指定的相同的值。在這種情況下蚪腐,這兩個(gè)顯然未解耦箭昵,并且如果你試圖重構(gòu)你的代碼也將會(huì)意外地更改你的應(yīng)用程序的 id 税朴!在 Android Studio 中回季,新建的項(xiàng)目始終會(huì)指定這兩個(gè)值家制。
注 2: 包名稱(chēng)必須始終在默認(rèn) AndroidManifest.xml 文件中指定。如果你有多個(gè)manifest (例如一個(gè) flavor 的特定的manifest或一個(gè) buildType 的特定的manifest)泡一,該包名是可選的颤殴,但如果它被指定了,它必須和主manifest中指定的包完全相同鼻忠。