Android Studio中的package name和application ID
在Eclipse
中只有package name
的概念,沒有application ID
。而在Android Studio
中把package name
拆分為了兩部分package name
和application ID
。
Android Studio
中的application ID
和Eclipse
中的package name
在手機裝置中和市場中代表了應用的唯一性,如果在裝置中和市場中已安裝過應用,下次升級安裝時application ID
必須保持一致,如果更換了application ID
,裝置和市場會認為該應用為一個新的應用。
在Module的build.gradle
檔案中可以看到application ID
defaultConfig { applicationId "com.android.app" minSdkVersion 15 targetSdkVersion 23 versionCode 1 versionName "1.0" }
只要修改了這裡的applicationId
,就代表這是一個新的應用了。
在開發專案中可能需要在一個手機上同時安裝測試版和正式版,這時就可以通過簡單修改applicationId
來實現。
預設情況下android studio
中的package name
和applicationId
是一樣的,在AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.app">
這裡package
必須和專案中的包名一致,應用生成的R.java
類的名稱空間與此對應,比如上面的AndroidManifest.xml
的R類名稱是com.android.app.R
,另外manifest
檔案中宣告的類名也與此對應,android:name=".MainActivity"
android:name="com.android.app.MainActivity"
如果要修改
package name
(一般不會遇到這種情況),最好的方法是在AndroidManifest.xml
檔案用快捷鍵shift+f6
來修改package
。
總的來說,在Android Studio
中修改applicationId
更簡單,使用起來也更方便。
BuildType
中所設定的『applicationIdSuffix
』屬性,按照這個屬性的字面翻譯為:『applicationId
的字尾』
Android 應用都有自己的包名。包名是裝置上每個應用程式的唯一標識,同樣也是 Google Play
商店裡的唯一標識。就是說,假如你已經使用某個包名來發布應用,就不能再去改變應用的包名,因為這樣做會導致你的應用被視為一個全新的應用,你現有的使用者也不會收到應用的更新通知。
舊版(不推薦)
舊版的 Android Gralde
構建系統中,應用的包名由 manifest
中根節點的 package
屬性決定:
AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.my.app"
android:versionCode="1"
android:versionName="1.0" >12345
然而,這裡所定義的 package 還有另一個作用:用來命名資源類 R
(以及用於解析相關的 Activity
)。在上面的示例中,最終生成的 R
類為 com.example.my.app.R
,所以如果你在其他包中的程式碼需要引用資源,對應的 .java
檔案需要匯入 com.example.my.app.R
。
新版(推薦)
新的 Android Gradle
構建系統中,你可以輕鬆地構建多個不同版本的應用。例如,你可以同時構建免費版和專業版的應用(使用 productFlavors
),並且它們在 Google Play
上也應該要有不同的包名,這樣它們就能夠在同一裝置上安裝並且能夠單獨購買使用等等。同樣的,你也可以構建 “debug
”、“alpha
”、“beta
” 版的應用(使用 build type
),它們也同樣可以有唯一的包名。
同時,程式碼中引用的 R 類要保持不變;在構建不同版本的應用時,對應的(引用了 R 的) .java 原始檔也不能改動。
因此,我們將包名的兩種作用解耦:
“application id
” 對應 apk
中 manifest
定義的應用包名,同時用於裝置以及 Google Play
的應用唯一標識。
“package
” 用於在原始碼中引用 R
類以及解析註冊相關的 activity/service
,對應 Java
的包名概念。
你可以在 Gradle
檔案中指定 application id
,如下所示:
app/build.gradle:
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"
}
像以前一樣,你需要像前面的 AndroidManifest.xml
示例在 Manifest
中指定給程式碼用的 “package
”。
關鍵部分:參照上面的做法,即能解耦 applicationId
和 package
。意思是你能夠完全自由地重構你的程式碼,改變用於 Activity
和 Service
的內部包,改變 Manifest
的 package
,重構匯入語句。這都不會影響到 app
的最終 id
,app
的 id
對應 Gradle
檔案中 applicationId
的值。
你可以通過以下的 Gradle DSL
方法來為不同的 flavor
和 build type
定義不同的 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
中,你可以通過 Project Structure
圖形化介面來進行這些配置。)
注意:出於相容性考慮,如果沒有在 build.gradle
檔案中定義 applicationId
,那麼 applicationId
將預設為 AndroidManifest.xml
中所指定的 package
的值。在這種情況下,applicationId
和 package
顯然未解耦,此時重構程式碼也將會更改應用的 id
!在 Android Studio 中
,新建的專案會指定這兩個值。
注意:package
始終必須在預設 AndroidManifest.xml
檔案中指定。如果存在多個 manifest
(例如一個 flavor
有特定的 manifest
或一個 buildType
有特定的 manifest
),package
可不指定,但如果被指定,必須和主 manifest
中指定的 package
完全相同。