android-applicationId和package name
阿新 • • 發佈:2018-12-30
1)applicationID
applicationId在Android系統中是作為應用的唯一標識,即在一個Android裝置中所有的應用程式的applicationId都是唯一的。這意味著,一旦你已釋出的程式使用了這個applicationId,你就無法再修改它。如果修改了,那麼這個應用程式就會被系統當作是一個全新的應用程式,和你之前的應用程式是相互獨立的。如果兩個applicationid一直的話,新安裝的版本就會覆蓋原來的版本。
applicationid是在Module的build.gradle中指定,預設是和package name一樣的,一個package name可以對應多個applicatonid,類似debug版本,或者release版本。
2)package name
所有的 Android 應用程式都有一個包名。包名是裝置上的這個應用程式的唯一標識,也是在谷歌Play商店上的唯一標識。這意味著,一旦你已釋出的程式使用了這個包名, 你就永遠都無法改變它;如果修改了就會導致你的應用程式被當作是一個全新的應用程式,你之前的應用程式的使用者也不能更新到使用了新的包名的安裝包。
在此前的 Android Gradle 構建系統中,您的應用程式的包名由你的manifest檔案的根元素裡的package屬性決定:
AndroidManifest.xml:
了包名稱的兩種用法:
像以前一樣,你需要在 Manifest 檔案中指定用於程式碼的包,就如上面的AndroidManifest.xml示例一樣。 這裡說到了最關鍵的部分:當你像上面那樣做時,這兩個包是互相獨立的。你能夠完全自由地重構您的程式碼——更改用於Activity和Service的內部包,更新你的Manifest裡的包,和重構您的匯入語句。這都不會影響到你的程式的最終id,這個最終的id的值總是為你的Gradle檔案中指定的applicationId的值。(筆者注:packageName在程式碼中使用,通常在AndroidManifest.xml中指定,applicationId則只是用於程式的標識,通常在build.gradle中指定。這樣有一個好處,假如你想釋出一個免費版,一個收費版,你只需要在build.gradle中把applicationId後面加上免費版的字尾包名(如".free"),收費版加上收費版的字尾即可,而不需要修改你的其他程式碼。) 你可以通過使用以下的 Gradle DSL 方法,為不同的flavors和構建型別修改您的應用程式的 applicationId: app/build.gradle:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.my.app"
android:versionCode="1"
android:versionName="1.0" >
然而,這裡所定義的包也有第二個目的:它被用來命名你的資源類的包(以及解析任何相關的Activity的類名)。在上面的示例中,生成的 R 類將會是com.example.my.app.R
,因此如果您其他包裡面的程式碼需要引用這些資源,就需要匯入com.example.my.app.R。
使用新的 Android Gradle 構建系統,你可以輕鬆構建多個不同版本的應用程式;例如,您可以構建一個“free”版本和“pro”版本的應用程式 (通過使用flavors),並且這些不同版本的程式在 Google Play 商店上應該有不同的包,這樣他們可以被單獨安裝和購買,或者是同時安裝兩個,等等。同樣,您還可以同時建立“debug”、“alpha”和“beta”版本的應用程式 (使用build types),而這些版本的程式同樣可以使用唯一的包名。
同時,您想要在程式碼中匯入的 R 類必須在這段時間內保持不變 ;在您正在構建您的應用程式的不同版本時您的.java 原始檔不應該被更改。
因此,我們解耦- 最終的方案是,在您生成的.apk 的manifest 中,並且用於在你的裝置和 Google Play 商店來標識你的應用的包,叫做“application id”。
- 用於在原始碼中來引用您的R類的,並且是解析任何相關的Activity/Service 註冊的包,繼續被稱為“package”。
apply plugin: 'com.android.application'
android {
compileSdkVersion 19
buildToolsVersion "19.1"
defaultConfig {
applicationId "com.example.my.app"
minSdkVersion 15
targetSdkVersion 19
versionCode 1
versionName "1.0"
}
...
像以前一樣,你需要在 Manifest 檔案中指定用於程式碼的包,就如上面的AndroidManifest.xml示例一樣。 這裡說到了最關鍵的部分:當你像上面那樣做時,這兩個包是互相獨立的。你能夠完全自由地重構您的程式碼——更改用於Activity和Service的內部包,更新你的Manifest裡的包,和重構您的匯入語句。這都不會影響到你的程式的最終id,這個最終的id的值總是為你的Gradle檔案中指定的applicationId的值。(筆者注:packageName在程式碼中使用,通常在AndroidManifest.xml中指定,applicationId則只是用於程式的標識,通常在build.gradle中指定。這樣有一個好處,假如你想釋出一個免費版,一個收費版,你只需要在build.gradle中把applicationId後面加上免費版的字尾包名(如".free"),收費版加上收費版的字尾即可,而不需要修改你的其他程式碼。) 你可以通過使用以下的 Gradle DSL 方法,為不同的flavors和構建型別修改您的應用程式的 applicationId: app/build.gradle:
productFlavors {
pro {
applicationId = "com.example.my.pkg.pro"
}
free {
applicationId = "
com.example.my.pkg
.free"
}
}
buildTypes {
debug {
applicationIdSuffix ".debug"
}
}
....
(在 Android Studio 中,您也可以在專案結構對話方塊中圖形化地進行這些配置。)
注意: 出於相容性原因,如果您沒有在您的 build.gradle 檔案中定義 applicationId,這個applicationId 將預設為 AndroidManifest.xml 中所指定的相同的值。在這種情況下,這兩個顯然未解耦,並且如果你試圖重構您的程式碼也將會意外地更改您的應用程式的 id !在 Android Studio 中,新建的專案始終會指定這兩個值。
注 2: 包名稱必須始終在預設 AndroidManifest.xml 檔案中指定。如果您有多個manifest (例如一個 flavor 的特定的manifest或一個 buildType 的特定的manifest),該包名是可選的,但如果它被指定了,它必須和主manifest中指定的包完全相同。