ApplicationId 使用及对自定义属性xmlns的影响

PackageName 包名

所有的安卓app都必须有一个包名。包名是该程序在设备上的唯一标识,同时也是Google Play商店上架的唯一标识。这意味着,一旦改变了已发布程序的包名,新的应用程序会被识别为一个完全崭新的app。

在此前的构建系统中,应用程序的包名由AndroidManifest文件的根元素里的package属性决定:

//AndroidManifest.xml

包名还被用来命名资源文件,当引用任一资源时,需要使用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

你可能感兴趣的:(ApplicationId 使用及对自定义属性xmlns的影响)