gradle applicationId应用 ID ,包名(清单文件中 package) 说明

gradle 设置应用 ID,包名说明

参考:设置应用 ID

小结:
pagename包名与 生成的R文件,文件目录有关联。如果有子软件包,但是这些文件必须从 package 属性导入使用命名空间的 R.java 类,而且清单中声明的任何应用组件都必须添加缺失的子软件包名称(或者使用完全限定软件包名称)。打包完成后,applicationId 会替换包名。
应用的appid 是发布应用的唯一标识,appid 不同就是两个应用。构建不同的appid 的时候,最终结果是 风味+debug 的形式。Context.getPackageName() 方法会返回您的应用 ID

每个 Android 应用均有一个唯一的应用 ID,像 Java 软件包名称一样,例如 com.example.myapp。此 ID 可以在设备上和 Google Play 商店中对您的应用进行唯一标识。如果您要上传新版本的应用,应用 ID(以及用于为其签名的证书)必须与原始 APK 相同。如果您更改了应用 ID,Google Play 商店会将该 APK 视为完全不同的应用。因此,发布您的应用后,绝不应更改应用 ID

您的应用 ID 通过模块的 build.gradle 文件中的 applicationId 属性定义,如下所示:

android {
    defaultConfig {
        applicationId "com.example.myapp"
        minSdkVersion 15
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
    }
    ...
}

当您在 Android Studio 中创建新项目时,applicationId 与您在设置期间选择的 Java 样式软件包名称完全一致。不过,除了这一点,应用 ID 和软件包名称彼此无关。您可以更改代码的软件包名称(代码命名空间),这不会影响应用 ID,反之亦然(但同样,发布您的应用后,不得更改应用 ID)。不过,更改软件包名称会产生其他影响,您应了解这一点,因此请参阅有关如何更改软件包名称的部分。

虽然应用 ID 看起来就像传统的 Java 软件包名称一样,但应用 ID 的命名规则限制性更强一些:

  • 必须至少包含两段(一个或多个圆点)。
  • 每段必须以字母开头。
  • 所有字符必须为字母、数字或下划线 [a-zA-Z0-9_]。

注意:应用 ID 过去直接关联到代码的软件包名称;所以,有些 Android API 会在其方法名称和参数名称中使用“package name”一词,但这实际上是您的应用 ID。例如,Context.getPackageName() 方法会返回您的应用 ID。无论何时都不需要在应用代码以外分享代码的真实软件包名称。

注意:如果您使用的是 WebView,不妨考虑在您的应用 ID 中将您的软件包名称用作前缀;否则,您可能会遇到如问题 211768 中所述的问题。

更改用于构建变体的应用 ID

当您为应用构建 APK 时,构建工具会使用 build.gradle 文件的 defaultConfig 块中定义的应用 ID 标记 APK(如下所示)。不过,如果您要创建不同版本的应用,让其在 Google Play 商店中显示为单独的详情(如“free”和“pro”版本),则需要创建单独的构建变体,这些变体各自具有不同的应用 ID。

在这种情况下,每个构建变体应定义为单独的产品变种。对于 productFlavors 块中的每个变种,您可以重新定义 applicationId 属性,也可以使用 applicationIdSuffix 在默认的应用 ID 上追加一段,如下所示:

android {
    defaultConfig {
        applicationId "com.example.myapp"
    }
    productFlavors {
        free {
            applicationIdSuffix ".free"
        }
        pro {
            applicationIdSuffix ".pro"
        }
    }
}

这样,“free”产品变种的应用 ID 就是“com.example.myapp.free”。
您也可以根据自己的构建类型使用 applicationIdSuffix 追加一段,如下所示:

android {
    ...
    buildTypes {
        debug {
            applicationIdSuffix ".debug"
        }
    }
}

由于 Gradle 会在产品变种后面应用构建类型配置,因此“free debug”构建变体的应用 ID 现在是“com.example.myapp.free.debug”。如果您希望同一设备上同时具有调试版本和发布版本,这会很有用,因为两个 APK 不能具有相同的应用 ID。

请注意,具有不同应用 ID 的 APK 在 Google Play 商店中会被视为不同的应用。所以如果您想要改用相同的应用详情分发多个 APK,每个 APK 以不同设备配置(如 API 级别)为目标,那么您必须对每个构建变体使用相同的应用 ID,但为每个 APK 提供不同的 versionCode。如需了解详情,请参阅多 APK 支持

注意:为了与以前的 SDK 工具兼容,如果您未在 build.gradle 文件中定义 applicationId 属性,构建工具会将 AndroidManifest.xml 文件中的软件包名称用作应用 ID。在这种情况下,重构您的软件包名称也会更改您的应用 ID。

提示:如果需要在清单文件中引用应用 ID,您可以在任何清单属性中使用 ${applicationId} 占位符。在构建期间,Gradle 会将此标记替换为实际的应用 ID。如需了解详情,请参阅将构建变量注入清单

更改用于测试的应用 ID

默认情况下,构建工具会将应用 ID 应用到您的插桩测试 APK,该 APK 将应用 ID 用于给定的构建变体,同时追加 .test。例如,com.example.myapp.free 构建变体的测试 APK 的应用 ID 为 com.example.myapp.free.test

您可以通过在 defaultConfigproductFlavor 块中定义 testApplicationId 属性来更改应用 ID,不过应该没有必要这样做。

注意:为了避免与受测应用发生名称冲突,构建工具会为您的测试 APK 生成 R 类,其命名空间基于测试应用 ID,而不是清单文件中定义的软件包名称

更改软件包名称

默认情况下,项目的软件包名称与应用 ID 匹配,但您可以更改软件包名称。不过,如果您要更改软件包名称,需要注意的是,软件包名称(由项目目录结构定义)应始终与 AndroidManifest.xml 文件中的 package 属性匹配,如下所示

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp"
    android:versionCode="1"
    android:versionName="1.0" >

Android 构建工具使用 package 属性来发挥两种作用:

  • 它将此名称用作应用生成的 R.java 类的命名空间。

    示例:对于上面的清单,R 类将为 com.example.myapp.R

  • 它会使用此名称解析清单文件中声明的任何相关类名。

    示例:对于上面的清单,声明为 <activity android:name=".MainActivity"> 的 Activity 将解析为 com.example.myapp.MainActivity

因此,package 属性中的名称应始终与项目的基础软件包名称匹配,基础软件包中保存着您的 Activity 及其他应用代码。当然,您的项目中可以包含子软件包,但是这些文件必须从 package 属性导入使用命名空间的 R.java 类,而且清单中声明的任何应用组件都必须添加缺失的子软件包名称(或者使用完全限定软件包名称)。

如果您要完全重构您的软件包名称,请确保也更新 package 属性。只要您使用 Android Studio 的工具重命名和重构您的软件包,那么这些属性就会自动保持同步。(如果它们未保持同步,您的应用代码将无法解析 R 类,因为它不再位于同一软件包中,并且清单无法识别您的 Activity 或其他组件。)

您必须始终在项目的主 AndroidManifest.xml 文件中指定 package 属性。如果您有其他清单文件(如产品变种或构建类型的清单文件),请注意,优先级最高的清单文件提供的软件包名称始终用于最终合并的清单。如需了解详情,请参阅合并多个清单文件

还有一点需要了解:尽管清单 package 和 Gradle applicationId 可以具有不同的名称,但构建工具会在构建结束时将应用 ID 复制到 APK 的最终清单文件中。所以,如果您在构建后检查 AndroidManifest.xml 文件,发现 package 属性发生更改就不足为奇了。实际上,Google Play 商店和 Android 平台会查看 package 属性来识别您的应用。所以,构建系统利用原始值(设置 R 类的命名空间并解析清单类名称)后,它会舍弃该值并将其替换为应用 ID。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容