每一個 Android 應用均有一個惟一的應用 ID,像 Java 軟件包名稱同樣,如 com.example.myapp。 此 ID 能夠在設備上和 Google Play 商店中對您的應用進行惟一標識。 若是您想要上傳新版本的應用,應用 ID(以及使用它簽署的證書)必須與原始 APK 相同 - 若是您更改應用 ID,Google Play 商店會將 APK 視爲徹底不一樣的應用。因此您發佈應用後,毫不應更改應用 ID。html
您的應用 ID 經過模塊的 build.gradle
文件中的 applicationId
屬性定義,以下面所示:java
android { defaultConfig { applicationId "com.example.myapp" minSdkVersion 15 targetSdkVersion 24 versionCode 1 versionName "1.0" } ... }
當您在 Android Studio 中建立新項目時,applicationId
會徹底匹配您在設置時選擇的 Java 風格軟件包名稱。 不過,除了這一點,應用 ID 和軟件包名稱彼此無關。您能夠更改代碼的軟件包名稱(代碼命名空間),這不會影響應用 ID,反之亦然(但一樣,您發佈應用後不該再更改應用 ID)。android
儘管應用 ID 看起來像傳統的 Java 軟件包名稱,但應用 ID 的命名規則有更多限制:web
注: 應用 ID 用於直接關聯到代碼的軟件包名稱;因此有些 Android API 會在其方法名稱和參數名稱中使用術語「軟件包名稱」,但這其實是您的應用 ID。例如,Context.getPackageName()
方法會返回您的應用 ID。 不管什麼時候都不須要在應用代碼之外分享代碼真實的軟件包名稱。app
注意:若是您使用的是 WebView
,請考慮在您的應用 ID 中將您的軟件包名稱用做前綴;不然,您可能會遇到如問題 211768 中所述的問題。工具
當您爲應用構建 APK 時,構建工具會使用 build.gradle
文件的 defaultConfig
塊中定義的應用 ID 標記 APK(以下所示)。不過,若是您想要建立不一樣版本的應用以在 Google Play 商店上顯示爲單獨詳情,如「免費版」和「專業版」,您須要建立單獨的構建變體,每一個構建變體具備不一樣的應用 ID。測試
這種狀況下,每一個構建變體應定義爲單獨的app。 對於 productFlavors {}
塊中的每種風味,您能夠從新定義 applicationId
屬性,或者改用 applicationIdSuffix
在默認的應用 ID 上追加一段,以下所示:gradle
android { defaultConfig { applicationId "com.example.myapp" } productFlavors { free { applicationIdSuffix ".free" } pro { applicationIdSuffix ".pro" } } }
這樣,「免費」產品風味的應用 ID 就變爲「com.example.myapp.free」。ui
您也能夠根據本身的構建類型使用 applicationIdSuffix
追加一段,以下所示:google
android { ... buildTypes { debug { applicationIdSuffix ".debug" } } }
由於 Gradle 會在產品風味後面應用構建類型配置,「免費調試」構建變體的應用 ID 如今爲「com.example.myapp.free.debug」。若是您想要在同一個設備上建立調試和發佈構建,這會十分有用,由於兩個 APK 不會具備相同的應用 ID。
注意:對於與以前的 SDK 工具的兼容性,若是您不在 build.gradle
文件中定義 applicationId
屬性,構建工具會將 AndroidManifest.xml
文件中的軟件包名稱用做應用 ID。這種狀況下,重構您的軟件包名稱也會更改您的應用 ID。
提示:若是您須要在清單文件中引用應用 ID,能夠在任何清單屬性中使用 ${applicationId}
佔位符。構建時,Gradle 會將此標記替換爲實際的應用 ID。
默認狀況下,構建工具會將應用 ID 應用到您的 APK,該 APK 將應用 ID 用於給定的構建變體,同時追加 .test
。例如,com.example.myapp.free
構建變體的測試 APK 的應用 ID 爲 com.example.myapp.free.test
。
儘管沒必要需,您也能夠經過在 defaultConfig
或productFlavor
塊中定義 testApplicationId
屬性來更改應用 ID。
注:爲了不與受測應用的名稱衝突,構建工具會根據測試應用 ID(而不是清單文件中定義的軟件包名稱)經過命名空間爲您的測試 APK 生成 R
類。
默認狀況下,您項目的軟件包名稱會匹配應用 ID,但您也能夠更改軟件包名稱。 不過,若是您想要更改軟件包名稱,請注意軟件包名稱(由您的項目目錄結構定義)應始終匹配 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 構建工具會將 package
屬性用於下面兩方面:
R.java
類的命名空間。 示例:對於上面的清單,R
類將爲 com.example.myapp.R
。
示例:對於上面的清單,聲明爲 <activity android:name=".MainActivity">
的 Activity 將解析爲 com.example.myapp.MainActivity
。
一樣,package
屬性中的名稱應始終匹配您項目的基礎軟件包名稱,軟件包中保存着您的 Activity 和其餘應用代碼。 固然,您的項目中能夠包含子軟件包,可是這些文件必須從 package
屬性導入使用命名空間的 R.java
類,並且清單中聲明的任何應用組件均必須添加缺失的子軟件包名稱(或者使用徹底限定軟件包名稱)。
若是您想要徹底重構您的軟件包名稱,請確保也更新 package
屬性。 只要您使用 Android Studio 的工具重命名和重構您的軟件包,那麼這些屬性就會自動保持同步。 (若是這些屬性未保持同步,您的應用代碼將沒法解析 R
類,由於它不在相同的軟件包內,且清單不會標識您的 Activity 或其餘組件。)
您必須始終在項目的主 AndroidManifest.xml
文件中指定 package
屬性。 若是您有附加的清單文件(例如用於產品風味或構建類型),請注意優先級最高的清單文件提供的軟件包名稱始終用於最終合併的清單中。
您還須要瞭解如下內容:儘管清單 package
和 Gradle applicationId
能夠具備不一樣的名稱,但構建工具會在構建結束時將應用 ID 複製到 APK 的最終清單文件中。因此,若是您在構建後檢查 AndroidManifest.xml
文件,package
屬性發生更改就不足爲奇。實際上,Google Play 商店和 Android 平臺會注意 package
屬性來標識您的應用;因此構建利用原始值後(用做 R
類的命名空間並解析清單類名稱),它將會捨棄此值並將其替換爲應用 ID。