gradle applicationId應(yīng)用 ID ,包名(清單文件中 package) 說明

gradle 設(shè)置應(yīng)用 ID,包名說明

參考:設(shè)置應(yīng)用 ID

小結(jié):
pagename包名與 生成的R文件,文件目錄有關(guān)聯(lián)。如果有子軟件包,但是這些文件必須從 package 屬性導(dǎo)入使用命名空間的 R.java 類,而且清單中聲明的任何應(yīng)用組件都必須添加缺失的子軟件包名稱(或者使用完全限定軟件包名稱)。打包完成后,applicationId 會(huì)替換包名。
應(yīng)用的appid 是發(fā)布應(yīng)用的唯一標(biāo)識(shí),appid 不同就是兩個(gè)應(yīng)用。構(gòu)建不同的appid 的時(shí)候,最終結(jié)果是 風(fēng)味+debug 的形式。Context.getPackageName() 方法會(huì)返回您的應(yīng)用 ID

每個(gè) Android 應(yīng)用均有一個(gè)唯一的應(yīng)用 ID,像 Java 軟件包名稱一樣,例如 com.example.myapp。此 ID 可以在設(shè)備上和 Google Play 商店中對(duì)您的應(yīng)用進(jìn)行唯一標(biāo)識(shí)。如果您要上傳新版本的應(yīng)用,應(yīng)用 ID(以及用于為其簽名的證書)必須與原始 APK 相同。如果您更改了應(yīng)用 ID,Google Play 商店會(huì)將該 APK 視為完全不同的應(yīng)用。因此,發(fā)布您的應(yīng)用后,絕不應(yīng)更改應(yīng)用 ID。

您的應(yīng)用 ID 通過模塊的 build.gradle 文件中的 applicationId 屬性定義,如下所示:

android {
    defaultConfig {
        applicationId "com.example.myapp"
        minSdkVersion 15
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
    }
    ...
}

當(dāng)您在 Android Studio 中創(chuàng)建新項(xiàng)目時(shí),applicationId 與您在設(shè)置期間選擇的 Java 樣式軟件包名稱完全一致。不過,除了這一點(diǎn),應(yīng)用 ID 和軟件包名稱彼此無關(guān)。您可以更改代碼的軟件包名稱(代碼命名空間),這不會(huì)影響應(yīng)用 ID,反之亦然(但同樣,發(fā)布您的應(yīng)用后,不得更改應(yīng)用 ID)。不過,更改軟件包名稱會(huì)產(chǎn)生其他影響,您應(yīng)了解這一點(diǎn),因此請(qǐng)參閱有關(guān)如何更改軟件包名稱的部分。

雖然應(yīng)用 ID 看起來就像傳統(tǒng)的 Java 軟件包名稱一樣,但應(yīng)用 ID 的命名規(guī)則限制性更強(qiáng)一些:

  • 必須至少包含兩段(一個(gè)或多個(gè)圓點(diǎn))。
  • 每段必須以字母開頭。
  • 所有字符必須為字母、數(shù)字或下劃線 [a-zA-Z0-9_]。

注意:應(yīng)用 ID 過去直接關(guān)聯(lián)到代碼的軟件包名稱;所以,有些 Android API 會(huì)在其方法名稱和參數(shù)名稱中使用“package name”一詞,但這實(shí)際上是您的應(yīng)用 ID。例如,Context.getPackageName() 方法會(huì)返回您的應(yīng)用 ID。無論何時(shí)都不需要在應(yīng)用代碼以外分享代碼的真實(shí)軟件包名稱。

注意:如果您使用的是 WebView,不妨考慮在您的應(yīng)用 ID 中將您的軟件包名稱用作前綴;否則,您可能會(huì)遇到如問題 211768 中所述的問題。

更改用于構(gòu)建變體的應(yīng)用 ID

當(dāng)您為應(yīng)用構(gòu)建 APK 時(shí),構(gòu)建工具會(huì)使用 build.gradle 文件的 defaultConfig 塊中定義的應(yīng)用 ID 標(biāo)記 APK(如下所示)。不過,如果您要?jiǎng)?chuàng)建不同版本的應(yīng)用,讓其在 Google Play 商店中顯示為單獨(dú)的詳情(如“free”和“pro”版本),則需要?jiǎng)?chuàng)建單獨(dú)的構(gòu)建變體,這些變體各自具有不同的應(yīng)用 ID。

在這種情況下,每個(gè)構(gòu)建變體應(yīng)定義為單獨(dú)的產(chǎn)品變種。對(duì)于 productFlavors 塊中的每個(gè)變種,您可以重新定義 applicationId 屬性,也可以使用 applicationIdSuffix 在默認(rèn)的應(yīng)用 ID 上追加一段,如下所示:

android {
    defaultConfig {
        applicationId "com.example.myapp"
    }
    productFlavors {
        free {
            applicationIdSuffix ".free"
        }
        pro {
            applicationIdSuffix ".pro"
        }
    }
}

這樣,“free”產(chǎn)品變種的應(yīng)用 ID 就是“com.example.myapp.free”。
您也可以根據(jù)自己的構(gòu)建類型使用 applicationIdSuffix 追加一段,如下所示:

android {
    ...
    buildTypes {
        debug {
            applicationIdSuffix ".debug"
        }
    }
}

由于 Gradle 會(huì)在產(chǎn)品變種后面應(yīng)用構(gòu)建類型配置,因此“free debug”構(gòu)建變體的應(yīng)用 ID 現(xiàn)在是“com.example.myapp.free.debug”。如果您希望同一設(shè)備上同時(shí)具有調(diào)試版本和發(fā)布版本,這會(huì)很有用,因?yàn)閮蓚€(gè) APK 不能具有相同的應(yīng)用 ID。

請(qǐng)注意,具有不同應(yīng)用 ID 的 APK 在 Google Play 商店中會(huì)被視為不同的應(yīng)用。所以如果您想要改用相同的應(yīng)用詳情分發(fā)多個(gè) APK,每個(gè) APK 以不同設(shè)備配置(如 API 級(jí)別)為目標(biāo),那么您必須對(duì)每個(gè)構(gòu)建變體使用相同的應(yīng)用 ID,但為每個(gè) APK 提供不同的 versionCode。如需了解詳情,請(qǐng)參閱多 APK 支持。

注意:為了與以前的 SDK 工具兼容,如果您未在 build.gradle 文件中定義 applicationId 屬性,構(gòu)建工具會(huì)將 AndroidManifest.xml 文件中的軟件包名稱用作應(yīng)用 ID。在這種情況下,重構(gòu)您的軟件包名稱也會(huì)更改您的應(yīng)用 ID。

提示:如果需要在清單文件中引用應(yīng)用 ID,您可以在任何清單屬性中使用 ${applicationId} 占位符。在構(gòu)建期間,Gradle 會(huì)將此標(biāo)記替換為實(shí)際的應(yīng)用 ID。如需了解詳情,請(qǐng)參閱將構(gòu)建變量注入清單。

更改用于測試的應(yīng)用 ID

默認(rèn)情況下,構(gòu)建工具會(huì)將應(yīng)用 ID 應(yīng)用到您的插樁測試 APK,該 APK 將應(yīng)用 ID 用于給定的構(gòu)建變體,同時(shí)追加 .test。例如,com.example.myapp.free 構(gòu)建變體的測試 APK 的應(yīng)用 ID 為 com.example.myapp.free.test

您可以通過在 defaultConfigproductFlavor 塊中定義 testApplicationId 屬性來更改應(yīng)用 ID,不過應(yīng)該沒有必要這樣做。

注意:為了避免與受測應(yīng)用發(fā)生名稱沖突,構(gòu)建工具會(huì)為您的測試 APK 生成 R 類,其命名空間基于測試應(yīng)用 ID,而不是清單文件中定義的軟件包名稱

更改軟件包名稱

默認(rèn)情況下,項(xiàng)目的軟件包名稱與應(yīng)用 ID 匹配,但您可以更改軟件包名稱。不過,如果您要更改軟件包名稱,需要注意的是,軟件包名稱(由項(xiàng)目目錄結(jié)構(gòu)定義)應(yīng)始終與 AndroidManifest.xml 文件中的 package 屬性匹配,如下所示

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp"
    android:versionCode="1"
    android:versionName="1.0" >

Android 構(gòu)建工具使用 package 屬性來發(fā)揮兩種作用:

  • 它將此名稱用作應(yīng)用生成的 R.java 類的命名空間。

    示例:對(duì)于上面的清單,R 類將為 com.example.myapp.R。

  • 它會(huì)使用此名稱解析清單文件中聲明的任何相關(guān)類名。

    示例:對(duì)于上面的清單,聲明為 <activity android:name=".MainActivity"> 的 Activity 將解析為 com.example.myapp.MainActivity

因此,package 屬性中的名稱應(yīng)始終與項(xiàng)目的基礎(chǔ)軟件包名稱匹配,基礎(chǔ)軟件包中保存著您的 Activity 及其他應(yīng)用代碼。當(dāng)然,您的項(xiàng)目中可以包含子軟件包,但是這些文件必須從 package 屬性導(dǎo)入使用命名空間的 R.java 類,而且清單中聲明的任何應(yīng)用組件都必須添加缺失的子軟件包名稱(或者使用完全限定軟件包名稱)。

如果您要完全重構(gòu)您的軟件包名稱,請(qǐng)確保也更新 package 屬性。只要您使用 Android Studio 的工具重命名和重構(gòu)您的軟件包,那么這些屬性就會(huì)自動(dòng)保持同步。(如果它們未保持同步,您的應(yīng)用代碼將無法解析 R 類,因?yàn)樗辉傥挥谕卉浖校⑶仪鍐螣o法識(shí)別您的 Activity 或其他組件。)

您必須始終在項(xiàng)目的主 AndroidManifest.xml 文件中指定 package 屬性。如果您有其他清單文件(如產(chǎn)品變種或構(gòu)建類型的清單文件),請(qǐng)注意,優(yōu)先級(jí)最高的清單文件提供的軟件包名稱始終用于最終合并的清單。如需了解詳情,請(qǐng)參閱合并多個(gè)清單文件

還有一點(diǎn)需要了解:盡管清單 package 和 Gradle applicationId 可以具有不同的名稱,但構(gòu)建工具會(huì)在構(gòu)建結(jié)束時(shí)將應(yīng)用 ID 復(fù)制到 APK 的最終清單文件中。所以,如果您在構(gòu)建后檢查 AndroidManifest.xml 文件,發(fā)現(xiàn) package 屬性發(fā)生更改就不足為奇了。實(shí)際上,Google Play 商店和 Android 平臺(tái)會(huì)查看 package 屬性來識(shí)別您的應(yīng)用。所以,構(gòu)建系統(tǒng)利用原始值(設(shè)置 R 類的命名空間并解析清單類名稱)后,它會(huì)舍棄該值并將其替換為應(yīng)用 ID。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容