android基础:applicationId与packageName的区别

applicationId:在Android系统中应用的applicationId作为应用的唯一标识,就像人的身份证号一样,在一个Android设备中所有的应用程序的applicationId都是唯一的。

eclipse版本

package name:在用Eclipse构建的Android项目中,使用包名(Package Name)作为应用的唯一标识(applicationId)。可以说在Eclipse下applicationId=package name。所以Eclipse构建的Android项目包名必须唯一,一个包名代表一个应用,不允许两个应用使用同样的包名。包名主要用于系统识别应用,几乎不会被最终用户看到。

androidStudo版本

在用Android studio构建的Android项目中可以为应用配置applicationId·,配置的applicationId可以不和package name一样。由此可以看来用Android studio构建的Android项目package name不一定是应用程序的标识。这一点很重要,开发者一定要记住。比如你在使用第三方SDK开发时,如百度地图,需要你来设置Android SDK安全码,在设置安全码时需要用到应用程序的包名,这个包名指的是applicationId

注意:识别.R跟Activity文件的路径还是packageName,这个是唯一的

解耦方案

  • application id 对应 apk 中 manifest 定义的应用包名,同时用于设备以及 Google Play 的应用唯一标识。
  • package 用于在源码中引用 R 类以及解析注册相关的 activity/service,对应 Java 的包名概念。

我们在AndroidManifest.xml定义一个包名,这个是唯一的

1
2
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.hammercui.app.react">

我们在app.gradle文件使用Gradle DSL 方法来为不同的 flavor 和 build type 定义不同的 applicationId:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
android{
···
productFlavors {
pro {
applicationId = "com.hammercui.app.pro"
}
free {
applicationId = "com.hammercui.app.free"
}
}

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

参考文档

Gradle Android Plugin中文手册

applicationID和packageName的区别