Android之ApplicationId 與 PackageName

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中指定的包完全相同鼻忠。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末涵但,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子帖蔓,更是在濱河造成了極大的恐慌矮瘟,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件塑娇,死亡現(xiàn)場(chǎng)離奇詭異澈侠,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)埋酬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)哨啃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人写妥,你說(shuō)我怎么就攤上這事拳球。” “怎么了珍特?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵祝峻,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我扎筒,道長(zhǎng)呼猪,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任砸琅,我火速辦了婚禮宋距,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘症脂。我一直安慰自己谚赎,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布诱篷。 她就那樣靜靜地躺著壶唤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪棕所。 梳的紋絲不亂的頭發(fā)上闸盔,一...
    開(kāi)封第一講書(shū)人閱讀 51,573評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音琳省,去河邊找鬼迎吵。 笑死躲撰,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的击费。 我是一名探鬼主播拢蛋,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蔫巩!你這毒婦竟也來(lái)了谆棱?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤圆仔,失蹤者是張志新(化名)和其女友劉穎垃瞧,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體坪郭,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡皆警,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了截粗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片信姓。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖绸罗,靈堂內(nèi)的尸體忽然破棺而出意推,到底是詐尸還是另有隱情,我是刑警寧澤珊蟀,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布菊值,位于F島的核電站,受9級(jí)特大地震影響育灸,放射性物質(zhì)發(fā)生泄漏腻窒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一磅崭、第九天 我趴在偏房一處隱蔽的房頂上張望儿子。 院中可真熱鬧,春花似錦砸喻、人聲如沸柔逼。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)愉适。三九已至,卻和暖如春癣漆,著一層夾襖步出監(jiān)牢的瞬間维咸,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留癌蓖,地道東北人瞬哼。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像费坊,于是被迫代替她去往敵國(guó)和親倒槐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子旬痹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,139評(píng)論 25 707
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理附井,服務(wù)發(fā)現(xiàn),斷路器两残,智...
    卡卡羅2017閱讀 134,657評(píng)論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,811評(píng)論 6 342
  • 寫(xiě)作打卡第20天人弓,之前三天沼死,對(duì)前十五天的寫(xiě)作進(jìn)行了總結(jié),小有收獲崔赌。寫(xiě)作打卡第二階段為期30天意蛀,5天一個(gè)周期,重點(diǎn)為...
    小米屋閱讀 628評(píng)論 0 48
  • 最可怕的不是沒(méi)有上進(jìn)心 而是永遠(yuǎn)藕斷絲連地同情自己 心里是沖勁十足有毅力 可到了實(shí)踐這方面卻變成了 手機(jī)離身不能活...
    不一樣的徐小劍閱讀 363評(píng)論 0 1