packageName和ApplicationId的區別

AndroidManifest.xml中有一個package屬性
build.gradle中defaultConfig下有一個applicationId
這兩者有什么區別呢?

在老版本的Eclipse中做android開發程序的包名是一樣的。而在android studio中做android開發則會有兩個類別,一個是 PackageName,是我們項目中指定資源的包名。一個是ApplicationId 是用作發布的時候和引用第三方項目作為識別的包名。

所有的 Android 應用程序都有一個包名。包名是設備上的這個應用程序的唯一標識,也是在谷歌Play商店上的唯一標識。這意味著,一旦你已發布的程序使用了這個包名, 你就永遠都無法改變它;如果修改了就會導致你的應用程序被當作是一個全新的應用程序,你之前的應用程序的用戶也不能更新到使用了新的包名的安裝包。

在此前的 Android Gradle 構建系統中,您的應用程序的包名由你的manifest文件的根元素里的package屬性決定:

AndroidManifest.xml:

<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”。
你可以在你 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"
    }
    ... 

像以前一樣,你需要在 Manifest 文件中指定用于代碼的包,就如上面的Andr??oidManifest.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"
        }
    }
    ....

注意:出于兼容性原因,如果您沒有在您的 build.gradle 文件中定義 applicationId,這個applicationId 將默認為 AndroidManifest.xml 中所指定的相同的值。在這種情況下,這兩個顯然未解耦,并且如果你試圖重構您的代碼也將會意外地更改您的應用程序的 id !在 Android Studio 中,新建的項目始終會指定這兩個值。

整理自:http://blog.csdn.net/maosidiaoxian/article/details/41719357

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,556評論 25 708
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,991評論 19 139
  • Gradle對于很多開發者來說有一種既熟悉又陌生的感覺,他是離我們那么近,以至于我每天做項目都需要他,但是他又是離...
    阿_希爸閱讀 9,606評論 10 199
  • 一丶介紹 自動回復機器人;裝逼用; 二丶準備階段 1.使用模塊:https://github.com/pandol...
    丶納涼閱讀 2,193評論 2 0
  • 規則:1.必須以"data-"開頭2.wxml中的data-PostId屬性會轉化為js中的Postid屬性(P保...
    余生筑閱讀 782評論 0 0