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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 这一章主要针对项目中可以用到的一些实用功能来介绍Android Gradle,比如如何隐藏我们的证书文件,降低风险...
    acc8226阅读 7,677评论 3 25
  • 1.介绍 如果你正在查阅build.gradle文件的所有可选项,请点击这里进行查阅:DSL参考 1.1新构建系统...
    Chuckiefan阅读 12,173评论 8 72
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,242评论 25 708
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,915评论 18 139
  • 文/影三郎 秋雨缠绵入夜柔,轻敲窗棂曲悠悠。 侧卧听风酣梦眠,再无烦事挂心头。
    柠檬成汁阅读 332评论 0 1