Android applicationId與包名的區別
應用ID與包名區別
每個Android應用都有一個唯一的應用ID.在Android裝置和市場上,這個ID是你應用的唯一標識.若想在市場上更新應用,新應用的ID必須和原來apk的應用ID一致.所以一旦釋出了應用,就不能再改變應用ID.
在Eclipse中沒有applicationId這個概念,在Eclipse中applicationId即等同於包名。但是到了Android Studio中,這兩個概念做個區分。包名的定義在清單檔案中:
-
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-
package="com.example.myapplicationtest" >
應用ID是在moudle層的build.gradle中定義,applicationId值即為應用ID,如下所示:
-
android {
-
defaultConfig {
-
applicationId "com.example.myapplicationtest"
-
minSdkVersion 15
-
targetSdkVersion 24
-
versionCode 1
-
versionName "1.0"
-
}
-
...
-
}
但是,在Android Studio中建立一個新專案時,applicationId預設是和專案的包名一致的。所以常常有開發者會將兩者混淆,以為它們是一個概念。實際上,應用ID和包名是相互獨立的。改變包名不會影響應用ID,反之亦然。
通常Android的應用ID與包名是繫結的,所以在Android API中,一些方法和引數從名稱上看似乎它們返回的是包名,事實上它們返回的是應用ID值.例如,Context.getPackageName()方法返回的是應用ID,而不是包名。不信我們來看:
圖中,包名是:com.example.myapplicationtest 應用ID:com.example.myapplicationtest.id
在MainActivity中呼叫如下程式碼:
-
String applicationId = this.getPackageName();
-
Log.i("TESTKIM","applicationId:" + applicationId);
列印日誌檔案,如下:
應用ID的命名並不是隨意的,它至少需要需遵循以下限制:
-
應用ID至少包含兩部分(也就是說至少有一個點,如com.example);
-
每部分必須以字母開頭;
-
所有字元必須是字母數字或者下劃線[a-zA-Z0-9_]
注意:
如果你使用了webview,請使用包名作為應用ID的字首,否則,有可能會報錯.
應用ID用處
應用ID除了唯一標識了應用,那麼它在開發過程中可以有哪些用處呢?
試想一下,當我們開發應用的時候,要在一臺測試機上同時裝上開發版和釋出版,如何才能做到呢?其實很簡單,只要讓開發版的應用ID與釋出版不一致即可。所以,只需要在buildTypes中修改開發版的應用ID就行。如下:
-
android {
-
...
-
buildTypes {
-
debug {
-
applicationIdSuffix ".debug" //等同於“com.example.myapplicationtest.debug”
-
}
-
}
-
}
上面程式碼中,將debug版的應用ID在原來應用ID後追加“.debug”。applicationIdSuffix代表了預設的應用ID,即為defaultConfig中applicationId的值。所以,debug版的應用ID為:"com.example.myapplicationtest.debug".
另外,有時我們釋出到市場的應用希望有不同的版本,比如:免費版和收費版。這就需要我們來構建不同的應用變體。那麼我們可以在productFlavors中進行相應的配置,來生成不同的應用。如:
-
android {
-
defaultConfig {
-
applicationId "com.example.myapplicationtest"
-
}
-
productFlavors {
-
free {
-
applicationIdSuffix ".free"
-
}
-
paid {
-
applicationIdSuffix ".paid"
-
}
-
}
-
}
在上面的程式碼中,我們用"free"表示免費版,用"paid"表示付費版。在productFlavors中,通過配置不同應用ID,最終生成不同的應用。最終這兩種應用apk可同時存在於市場中。
修改包名
預設情況下,包名與應用ID是相同的。當然,開發者也可以對包名進行修改.如果開發者想要修改包名的話,注意專案目錄結構必須與AndroidManifest.xml中package屬性的包名一致.
-
<?xml version="1.0" encoding="utf-8"?>
-
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-
package="com.example.myapplicationtest"
-
android:versionCode="1"
-
android:versionName="1.0" >
package值有兩個作用:
-
它為R.java檔案提供了名稱空間,例如R class的包名為com.example.myappcationtest.R
-
決定manifest中宣告的class的相對名稱。如:manifest中宣告的
<activity android:name=".MainActivity"> 的真實路徑為:com.example.myapplicationtest.ManiActivity
如果開發者想修改包名,必須確保manifest中package值也做了同步修改.
--------------------- 本文來自 金偉__ 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/jinrall/article/details/53465403?utm_source=copy