每一个 Android 应用均有一个惟一的应用 ID,像 Java 软件包名称同样,如 com.example.myapp。 此 ID 能够在设备上和 Google Play 商店中对您的应用进行惟一标识。 若是您想要上传新版本的应用,应用 ID(以及使用它签署的证书)必须与原始 APK 相同 - 若是您更改应用 ID,Google Play 商店会将 APK 视为彻底不一样的应用。因此您发布应用后,毫不应更改应用 ID。html
您的应用 ID 经过模块的 build.gradle
文件中的 applicationId
属性定义,以下面所示:java
android { defaultConfig { applicationId "com.example.myapp" minSdkVersion 15 targetSdkVersion 24 versionCode 1 versionName "1.0" } ... }
当您在 Android Studio 中建立新项目时,applicationId
会彻底匹配您在设置时选择的 Java 风格软件包名称。 不过,除了这一点,应用 ID 和软件包名称彼此无关。您能够更改代码的软件包名称(代码命名空间),这不会影响应用 ID,反之亦然(但一样,您发布应用后不该再更改应用 ID)。android
尽管应用 ID 看起来像传统的 Java 软件包名称,但应用 ID 的命名规则有更多限制:web
注: 应用 ID 用于直接关联到代码的软件包名称;因此有些 Android API 会在其方法名称和参数名称中使用术语“软件包名称”,但这其实是您的应用 ID。例如,Context.getPackageName()
方法会返回您的应用 ID。 不管什么时候都不须要在应用代码之外分享代码真实的软件包名称。app
注意:若是您使用的是 WebView
,请考虑在您的应用 ID 中将您的软件包名称用做前缀;不然,您可能会遇到如问题 211768 中所述的问题。工具
当您为应用构建 APK 时,构建工具会使用 build.gradle
文件的 defaultConfig
块中定义的应用 ID 标记 APK(以下所示)。不过,若是您想要建立不一样版本的应用以在 Google Play 商店上显示为单独详情,如“免费版”和“专业版”,您须要建立单独的构建变体,每一个构建变体具备不一样的应用 ID。测试
这种状况下,每一个构建变体应定义为单独的app。 对于 productFlavors {}
块中的每种风味,您能够从新定义 applicationId
属性,或者改用 applicationIdSuffix
在默认的应用 ID 上追加一段,以下所示:gradle
android { defaultConfig { applicationId "com.example.myapp" } productFlavors { free { applicationIdSuffix ".free" } pro { applicationIdSuffix ".pro" } } }
这样,“免费”产品风味的应用 ID 就变为“com.example.myapp.free”。ui
您也能够根据本身的构建类型使用 applicationIdSuffix
追加一段,以下所示:google
android { ... buildTypes { debug { applicationIdSuffix ".debug" } } }
由于 Gradle 会在产品风味后面应用构建类型配置,“免费调试”构建变体的应用 ID 如今为“com.example.myapp.free.debug”。若是您想要在同一个设备上建立调试和发布构建,这会十分有用,由于两个 APK 不会具备相同的应用 ID。
注意:对于与以前的 SDK 工具的兼容性,若是您不在 build.gradle
文件中定义 applicationId
属性,构建工具会将 AndroidManifest.xml
文件中的软件包名称用做应用 ID。这种状况下,重构您的软件包名称也会更改您的应用 ID。
提示:若是您须要在清单文件中引用应用 ID,能够在任何清单属性中使用 ${applicationId}
占位符。构建时,Gradle 会将此标记替换为实际的应用 ID。
默认状况下,构建工具会将应用 ID 应用到您的 APK,该 APK 将应用 ID 用于给定的构建变体,同时追加 .test
。例如,com.example.myapp.free
构建变体的测试 APK 的应用 ID 为 com.example.myapp.free.test
。
尽管没必要需,您也能够经过在 defaultConfig
或productFlavor
块中定义 testApplicationId
属性来更改应用 ID。
注:为了不与受测应用的名称冲突,构建工具会根据测试应用 ID(而不是清单文件中定义的软件包名称)经过命名空间为您的测试 APK 生成 R
类。
默认状况下,您项目的软件包名称会匹配应用 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。