Android Studio中的package name和application ID

風靈使發表於2018-10-09

Eclipse中只有package name的概念,沒有application ID。而在Android Studio 中把package name 拆分為了兩部分package nameapplication ID

Android Studio 中的application IDEclipse中的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 nameapplicationId是一樣的,在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” 對應 apkmanifest 定義的應用包名,同時用於裝置以及 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”。

關鍵部分:參照上面的做法,即能解耦 applicationIdpackage。意思是你能夠完全自由地重構你的程式碼,改變用於 ActivityService 的內部包,改變 Manifestpackage,重構匯入語句。這都不會影響到 app 的最終 idappid 對應 Gradle 檔案中 applicationId 的值。

你可以通過以下的 Gradle DSL 方法來為不同的 flavorbuild 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 的值。在這種情況下,applicationIdpackage 顯然未解耦,此時重構程式碼也將會更改應用的 id !在 Android Studio 中,新建的專案會指定這兩個值。

注意:package 始終必須在預設 AndroidManifest.xml 檔案中指定。如果存在多個 manifest(例如一個 flavor 有特定的 manifest 或一個 buildType 有特定的 manifest),package 可不指定,但如果被指定,必須和主 manifest 中指定的 package 完全相同。

相關文章