官方文档:https://developer.android.google.cn/studio/build/application-id?hl=zh-cn#change_the_package_name
先摘录官方重点内容:
每个 Android 应用均有一个唯一的applicationId
,像 Java package
名称一样,例如 com.example.myapplication
。此 ID 可以作为您的应用在设备上和 Google Play 商店中的唯一标识
。如果您要上传新版本的应用,应用 ID(以及用于为其签名的证书)必须与原始工件相同。如果您更改了应用 ID,Google Play 商店会将上传的应用视为完全不同的应用。因此,发布应用后,不得更改应用 ID
。
android {
namespace 'com.example.myapplication'
compileSdk 33
defaultConfig {
applicationId "com.example.myapplication"
minSdk 24
targetSdk 33
versionCode 1
versionName "1.0"
...
}
applicationId 的命名规则限制
- 必须至少包含两段(一个或多个圆点)。
= 每段必须以字母开头。 - 所有字符必须为字母数字或下划线 [a-zA-Z0-9_]。
注意:applicationId 过去直接关联到代码的package 名称;所以,有些 Android API 会在其方法名称和参数名称中使用“package name”一词,但这实际上是您的applicationId 。例如,Context.getPackageName() 方法会返回您的applicationId。无论何时都不需要在应用代码以外分享代码的真实软件包名称。
注意:为了与以前的 SDK 工具兼容,如果您未在 build.gradle 文件中定义 applicationId 属性,构建工具会将 AndroidManifest.xml 文件中的package name用作applicationId 。在这种情况下,重构您的package name也会更改您的
applicationId
。
如果需要在清单文件中引用applicationId ,您可以在任何清单属性中使用
${applicationId}
占位符。在构建期间,Gradle 会将此标记替换为实际的applicationId 。
更改 package name
默认情况下,项目的package name与applicationId 匹配,但您可以更改package name。不过,如果您要更改package name,需要注意的是,package name
(由项目目录结构定义)应始终与 AndroidManifest.xml 文件中的 package
属性匹配,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapplication"
android:versionCode="1"
android:versionName="1.0" >
Android 构建工具使用 package
属性来发挥两种作用:
它将此名称用作应用生成的 R.java 类的命名空间。
示例:对于上面的清单,R 类将为 com.example.myapplication.R。
它会使用此名称解析清单文件中声明的任何相关类名。
示例:对于上面的清单,声明为 的 Activity 将解析为 com.example.myapplication.MainActivity。
尽管清单 package 和 Gradle applicationId 可以具有不同的名称,但构建工具会在构建结束时将应用 ID 复制到应用的最终清单文件中。所以,如果您在构建后检查 AndroidManifest.xml 文件,发现 package 属性发生更改就不足为奇了。实际上,Google Play 商店和 Android 平台会查看 package 属性来识别您的应用。所以,build 利用原始值(设置 R 类的命名空间并解析清单类名称)后,它会舍弃该值并将其替换为应用 ID。
namespace
从 AGP 7.3.0-alpha04
开始,使用 Gradle
构建项目时,如果在清单文件中使用 package
属性,AGP 会生成警告。如需为应用设置命名空间,请在模块级 build.gradle
文件中使用 namespace
属性。
官方文档:
https://developer.android.google.cn/studio/build/configure-app-module?hl=zh-cn#set-namespace
每个 Android 模块都有一个命名空间,此命名空间用作其生成的 和 R 类的 Kotlin 或 Java 软件包名称。
命名空间由模块的 build.gradle 文件中的 namespace
属性定义,如以下代码段所示。namespace
最初会设为您在创建项目时选择的软件包名称。
build.gradle 文件的 namespace 属性设置的名称应始终与项目的基础软件包名称匹配,基础软件包中保存着您的 activity 及其他应用代码
namespace
属性表示应用的 Java 或 Kotlin 软件包名称,但在编译 APK 后,合并后的清单文件中的 package 属性将代表应用的通用唯一应用 ID。
如果
namespace
的名称与 Gradle applicationId 的名称不一致,请注意,构建工具会在构建结束时将应用 ID 复制到应用的最终清单文件中。因此,如果您在构建后检查 AndroidManifest.xml 文件,package 属性会设为应用 ID。实际上,Google Play 商店和 Android 平台会查看合并后的清单的 package 属性以识别您的应用。