Android package屬性、package name和Application ID三者的聯絡及區別

來源:互聯網
上載者:User

標籤:block   工程   解析   複製   and   獨立   variables   markdown   nes   

名詞解釋
  1. package屬性:在AndroidManifest.xml檔案中。
  2. package name:應用程式的包名。
  3. Application ID:模組defaultConfig塊下的applicationId屬性。
設定Application ID

每個Android應用程式都有唯一一個類似Java包名的Application ID,比如com.example.myapp。在Android裝置和Google市集上,Application ID是您應用的唯一標識。如果您想上傳應用程式的新版本,那麼Application ID必須和原來相同。如果您改變了新版本應用程式的Application ID,那麼Goolge市集會認為這是個完全不同的應用程式。所以,從您第一次上傳應用程式開始,絕對不要更改Application ID

Application ID定義在模組build.gradle的applicationId屬性中,如下所示:

android {    defaultConfig {        applicationId "com.example.myapp"        minSdkVersion 15        targetSdkVersion 24        versionCode 1        versionName "1.0"    }    ...}

當您在Android Studio中建立新項目的時候,您可以設定applicationId屬性,這時,Application ID和package name是精確匹配的。除此之外,兩者是完全獨立的。當然,您可以更改package name,但是這不會影響到Application ID。反之亦然(再次提醒:在您上傳應用程式之後,不要修改Application ID,不要修改Application ID,不要修改Application ID)。然而,您應該意識到,修改package name 還有另一個後果。這部分詳見修改包名(下文有講)。

儘管Application ID看起來和傳統的Java包名很類似,但是Application ID的命名規則有更多的限制:

  • 最少有兩段(至少一個.隔開)
  • 每段開頭必須是字母
  • 所有的字元只能是字母、數字和底線

注意:在以前,Application ID 直接綁定package name。所以,有些Android APIs在方法名或者參數名中使用“package name”,但是實際上指的是Application ID。舉個栗子, Context.getPackageName()方法返回Application ID。所以沒必要在您應用程式代碼之外分享真正的package name。

警告:如果你使用WebView,考慮使用您的package name作為您Application ID的首碼,否則,您可能遇見

issue 211768。

修改構建版本的Application ID

當為您的應用程式構建APK時,構建工具使用build.gradle檔案中的defaultConfig塊中定義的Application ID標識APK(如下所示)。但是,如果你想建立不同版本的應用程式並且在Google市集中顯示不同的資訊,例如“免費版”和“專業版”。您需要構建擁有不相同Application ID的不同版本。

在這種情況下,每個構建版本應該定義不同的product flavor,且每個flavor都在productFlavors{}塊內部。對於每個flavor,您可以重新定義applicationId屬性,或者給預設的applicationId増加前尾碼,如下所示:

android {    defaultConfig {        applicationId "com.example.myapp"    }    productFlavors {        free {            applicationIdSuffix ".free"        }        pro {            applicationIdSuffix ".pro"        }    }}

這樣定義之後,“free”的Application ID是”com.example.myapp.free“。

在構建類型上,你也可以使用尾碼,如下所示:

android {    ...    buildTypes {        debug {            applicationIdSuffix ".debug"        }    }}

由於Gradle首先應用product flavor之後才應用build type,所以”free debug”版本現在的Application ID是”com.example.myapp.free.debug”。如果你想在同一部手機上同時安裝debug和release兩個版本,這將非常有用,因為沒有兩個應用程式可以擁有相同的Application ID。

記住一點,同一應用程式擁有不同的Application ID,Google應用市場將會認為這是兩個應用程式。所以,如果您為了適配不同的裝置配置(例如不同的API等級),並且想用相同資訊去分發多個應用程式。那麼對於每個版本,您必須使用相同的Application ID和不同的versionCode。

警告:為了相容先前的SDK工具,如果你沒有在build.gradle中定義applicationId屬性,那麼構建工具將使用AndroidManifest.xml中的package name作為Application ID。在這種情況下,重新命名package name意味著同時重新命名了Application ID。

提示:如果您需要在manifest檔案中引用Application ID,可以在manifest的屬性中使用${applicationId}預留位置。Gradle在構建時會自定替換這個標識為真正的Application ID。更多詳見 Inject Build Variables into the Manifest.

測試專用Application ID

預設情況下,構建工具會使用指定構建版本的Application ID(附加.test)將Application ID應用到您的instrumentation測試APK。例如,構建版本為”com.example.myapp.free”的測試應用程式真正的Application ID是“com.example.myapp.free.test“。

通常這不是必要的,你可以在defaultConfig或者productFlavor塊中定義testApplicationId屬性來修改Application ID。

注意:為了避免與測試應用程式命名衝突,構建工具為測試應用程式使用基於測試Application ID產生R.class的命名空間。

修改package name

雖然package name預設完全符合Application ID,但是您仍然可以修改它。如果您想修改package name,請留意package name(項目目錄結構)和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類的命名空間。

    例如:在上面的manifest檔案中。R類是“com.example.myapp.R”

  • 用於解析AndroidManifest.xml檔案中任何類的相對路徑。

    例如:在上面的manifest檔案中。一個activity定義為\,將會被解析為com.example.myapp.MainActivity。

因此,package屬性的值應該總是和工程的package name相同。當然,你可以給工程設定子包名。這些檔案必須從package屬性的命名空間匯入R類,並且任何定義在manifest中的組件必須增加子包名(或者寫全路徑)。

如果您需要完全重新命名package name,請確保您已經更新package屬性。直到您用Android studio的工具重新命名包,之後這些自動保持同步。(如果沒有保持同步,您的代碼將不能正確解析R類,因為它不再是相同包下,並且manifest也將不能正確識別您的activities和其它組件)。

您必須在AndroidManifest.xml檔案中置頂package屬性,如果您另外添加了manifest檔案,請注意,由最高優先順序manifest檔案提供的package name始終用於合并最終的manifest。更多:[Merge Multiple Manifest Files。

望周知:儘管您的項目可以設定package屬性不等於applicationId,然並卵。構建工具在最後構建的時候將會複製Application ID並設定為您應用程式唯一的package屬性的值。所以,如果您在構建成功之後檢查AndroidManifest.xml檔案,請不要驚訝package屬性發生變化。在Android平台和Google市集,package屬性才是真正作為您應用程式唯身份憑證。所以,一旦使用原始值構建(使用命名空間的R類解析manifest中的組件),構建工具將會丟棄package屬性的值,並且使用Application ID替換。

原文連結:https://developer.android.com/studio/build/application-id.html#change_the_package_name

Android package屬性、package name和Application ID三者的聯絡及區別

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.