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文件中指定用于代码引入的包名,同上面的AndroidManifest.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