Android applicationId與包名的區別

應用ID與包名區別

每一個Android應用都有一個惟一的應用ID.在Android設備和市場上,這個ID是你應用的惟一標識.若想在市場上更新應用,新應用的ID必須和原來apk的應用ID一致.因此一旦發佈了應用,就不能再改變應用ID.java

在Eclipse中沒有applicationId這個概念,在Eclipse中applicationId即等同於包名。可是到了Android Studio中,這兩個概念作個區分。包名的定義在清單文件中:android

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="com.example.myapplicationtest" >

應用ID是在moudle層的build.gradle中定義,applicationId值即爲應用ID,以下所示web

android {

defaultConfig {

applicationId "com.example.myapplicationtest"

minSdkVersion 15

targetSdkVersion 24

versionCode 1

versionName "1.0"

}

...

}

可是,在Android Studio中建立一個新項目時,applicationId默認是和項目的包名一致的。因此經常有開發者會將二者混淆,覺得它們是一個概念。實際上,應用ID和包名是相互獨立的。改變包名不會影響應用ID,反之亦然。app

一般Android的應用ID與包名是綁定的,因此在Android API中,一些方法和參數從名稱上看彷佛它們返回的是包名,事實上它們返回的是應用ID值.例如,Context.getPackageName()方法返回的是應用ID,而不是包名。不信咱們來看:測試


圖中,包名是:com.example.myapplicationtest   應用ID:com.example.myapplicationtest.idgradle

在MainActivity中調用以下代碼:​​​​​​​ui

String applicationId = this.getPackageName();

Log.i("TESTKIM","applicationId:" + applicationId);

打印日誌文件,以下:this

應用ID的命名並非隨意的,它至少須要需遵循如下限制:spa

  • 應用ID至少包含兩部分(也就是說至少有一個點,如com.example);debug

  • 每部分必須以字母開頭;

  • 全部字符必須是字母數字或者下劃線[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值也作了同步修改.

 

親,若是您感受本文有用,請點個贊再走吧✌(>‿◠)!!

相關文章
相關標籤/搜索