ApplicationId与PackageName
每个 Android 都有一个包名,如 com.example.myapp。在之前,这是应用在设备上的唯一标示,这意味着如果修改了包名这将是一个全新的应用,跟之前的应用无关。
Android Gradle 构建系统中,您的应用程序的包名由你的manifest文件的根元素里的package属性决定:
Androidmanifest.xml:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.my.app"
android:versionCode="1"
这里所定义的包也有第二个目的:它被用来命名你的资源类的包(以及解析任何相关的Activity的类名)。在上面的示例中,生成的 R 类将会是com.example.my.app.R,因此如果您其他包里面的代码需要引用这些资源,就需要导入com.example.my.app.R。
使用新的 Android Gradle 构建系统后,ApplicationId与PackageName是两个概念
- 最终的方案是,在您生成的.apk 的manifest 中,并且用于在你的设备和 Google Play 商店来标识你的应用的包,叫做“application id”。
- 用于在源代码中来引用您的R类的,并且是解析任何相关的Activity/Service 注册的包,继续被称为“package”。
在 gradle 文件中,指定application id,如下所示:
```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"
}
...
在 Manifest 文件中指定用于代码的包,就如上面的AndroidManifest.xml示例一样。
packageName在代码中使用,通常在AndroidManifest.xml中指定,applicationId则只是用于程序的标识,通常在build.gradle中指定。这样有一个好处,假如你想发布一个免费版,一个收费版,你只需要在build.gradle中把applicationId后面加上免费版的后缀包名(如".free"),收费版加上收费版的后缀即可,而不需要修改你的其他代码。
通过使用以下的 Gradle DSL 方法,为不同的flavors和构建类型修改您的应用程序的 applicationId:
``` productFlavors {
pro {
applicationId = "com.example.my.pkg.pro"
}
free {
applicationId = "com.example.my.pkg.free"
}
}
buildTypes {
debug {
//为 applicationId 追加内容
applicationIdSuffix ".debug"
}
}
....
注意: 出于兼容性原因,如果您没有在您的 build.gradle 文件中定义 applicationId,这个applicationId 将默认为 AndroidManifest.xml 中所指定的相同的值。在这种情况下,这两个显然未解耦,并且如果你试图重构您的代码也将会意外地更改您的应用程序的 id !在 Android Studio 中,新建的项目始终会指定这两个值。
注 2: 包名称必须始终在默认 AndroidManifest.xml 文件中指定。如果您有多个manifest (例如一个 flavor 的特定的manifest或一个 buildType 的特定的manifest),该包名是可选的,但如果它被指定了,它必须和主manifest中指定的包完全相同。
笔者语:
简单来说,在新的Gradle构建体系中,ApplicationId和PackageName是两个概念,ApplictionId标示应用在设备中的唯一性,PackageName是用于在源码中引用R类,并解析任何相关的Activity/Service的。
参考 https://blog.youkuaiyun.com/maosidiaoxian/article/details/41719357