PackageName 包名
所有的安卓app都必須有一個包名。包名是該程序在設備上的唯一標識,同時也是Google Play商店上架的唯一標識。這意味著,一旦改變了已發布程序的包名,新的應用程序會被識別為一個完全嶄新的app。
在此前的構建系統中,應用程序的包名由AndroidManifest文件的根元素里的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" >
包名還被用來命名資源文件,當引用任一資源時,需要使用import 包名.R語句。在上面的示例中,生成的R文件名為com.example.my.app.R。
ApplicationId 應用Id
使用新的 Android Gradle 構建系統,可以輕松構建多個不同版本的應用程序;例如,您可以構建一個“free”版本和“pro”版本的應用程序 (通過使用flavors),并且這些不同版本的程序在 Google Play 商店上應該有不同的包,這樣他們可以被單獨安裝和購買,或者是同時安裝兩個,等等。同樣,您還可以同時創建“debug”、“alpha”和“beta”版本的應用程序 (使用build types),而這些版本的程序同樣可以使用唯一的包名。支持構建應用程序的不同版本時,同時需要保證java文件中導入的R類保持不變。ApplicationId剛好可以用來解耦包名稱。
多版本解耦方案
1)使用applicationId作為應用程序的標識,通常在build.gradle中指定。用于在你的設備和 Google Play 商店來標識你的應用的包
2)packageName用于在源代碼中來引用R類,通常在AndroidManifest.xml中指定。
一、在gradle 文件中,指定applicationId ,如下所示:
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文件中指定用于代碼引入的包名,同上面的Andr??oidManifest.xml示例。
三、可以通過使用以下的 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"
}
}
....
(在 Android Studio 中,您也可以在項目結構對話框中圖形化地進行這些配置。上面的事例,可以在手機上安裝4個apk,分別對應prodebug,freedebug,prorelease,freerelease四中buildVariant)
注意: 出于兼容性原因,如果您沒有在您的 build.gradle 文件中定義 applicationId,這個applicationId 將默認為 AndroidManifest.xml 中所指定的相同的值。在這種情況下,這兩個顯然未解耦,并且如果你試圖重構您的代碼也將會意外地更改您的應用程序的 id !在 Android Studio 中,新建的項目始終會指定這兩個值。
注 2: 包名稱必須始終在默認 AndroidManifest.xml 文件中指定。如果您有多個manifest (例如一個 flavor 的特定的manifest或一個 buildType 的特定的manifest),該包名是可選的,但如果它被指定了,它必須和主manifest中指定的包完全相同。
自定義屬性與applicationId
關于自定義屬性,使用時需要添加域名xmlns。有以下兩種方式:
1)xmlns:app="http://schemas.android.com/apk/res/包名
該方法只能在application模塊使用,如果applicationId不同于package,則會出現編譯失敗,不能識別該屬性2)xmlns:app="http://schemas.android.com/apk/res-auto"區別 applicationId更改為非包名時編譯成功
該方法可在application模塊或library模塊使用,且變更applicationId不會影響程序編譯。
in Gradle projects,always use http://schemas.android.com/apk/res-auto for custom attributes
參考文檔:
http://blog.csdn.net/maosidiaoxian/article/details/41719357
http://www.cnblogs.com/whoislcj/p/5711001.html