Android中app的applicationId和包名的区别
Android app的applicationId和包名的区别
每个Android应用都有一个唯一的应用ID。在Android设备和市场上,这个ID是你应用的唯一标识.若想在市场上更新应用,新应用的ID必须和原来apk的应用ID一致,所以一旦发布了应用,就不能再改变应用ID。
在Eclipse中没有applicationId这个概念,在Eclipse中applicationId即等同于包名。但是到了Android Studio中,这两个概念做个区分。包名的定义在清单文件AndroidMainfest.xml中:
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapplicationtest" >
......
</manifest>
应用ID是在moudle层的build.gradle中定义,applicationId值即为应用ID,如下所示:
android {
defaultConfig {
// 应用Id
applicationId "com.example.demo"
minSdkVersion 19
targetSdkVersion 28
// ndk配置
ndk{abiFilters "armeabi-v7a"}
}
}
在Android Studio中创建一个新项目时,applicationId默认是和项目的包名一致的。所以常常有开发者会将两者混淆,以为它们是一个概念。实际上,应用ID和包名是相互独立的。改变包名不会影响应用ID,反之亦然。
通常Android的应用ID与包名是绑定的,所以在Android API中,一些方法和参数从名称上看似乎它们返回的是包名,事实上它们返回的是应用ID值.例如,Context.getPackageName()方法返回的是应用ID,而不是包名。如在某个Activity中打印packageName:
String applicationId = this.getPackageName();
Log.i("demo","applicationId:" + applicationId);
应用ID的命名并不是随意的,它至少需要需遵循以下限制:
- 应用ID至少包含两部分(也就是说至少有一个点,如com.example);
- 每部分必须以字母开头;
- 所有字符必须是字母数字或者下划线[a-zA-Z0-9_]
- app的标识,一旦定义不能随意改变
PS:如果你使用了webview,请使用包名作为应用ID的前缀,否则,有可能会报错。
应用ID applicationId作用
- 唯一标识应用;
- 可以伪装应用:如开发调试时可以通过修改applicationId改为发布的id即可;实现安装多个应用的场景,便于开发调试。发布时把applicationId改为发布的id即可;
- 同一个应用可以发布到应用市场多个版本,比如:免费版和收费版。这就需要我们来构建不同的应用变体,我们可以在productFlavors中进行相应的配置,来生成不同的应用,具体代码实现如下:
// 在productFlavors中,通过配置不同应用ID,最终生成不同的应用。最终这两种应用apk可同时存在于市场中。
android {
defaultConfig {
applicationId "com.example.myapplicationtest"
}
productFlavors {
free {
// 为“free”版本的applicationId增加后缀
applicationIdSuffix ".free"
}
paid {
// 为“paid”版本的applicationId增加后缀
applicationIdSuffix ".paid"
}
}
buildTypes {
debug {
// 为“debug”版本的applicationId增加后缀
applicationIdSuffix ".debug"
}
}
}
包名package作用
默认情况下,包名与应用ID是相同的。当然,开发者也可以对包名进行修改。如果开发者想要修改包名的话,注意项目目录结构必须与AndroidManifest.xml中package属性的包名一致.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapplicationtest"
android:versionCode="1"
android:versionName="1.0" >
......
</manifest>
package值有两个作用:
- 它为R.java文件提供了命名空间,例如R. class的包名为com.example.myappcationtest.R;
- 决定manifest中声明的class的相对名称。如:manifest中声明的<activity android:name=".MainActivity"> 的真实路径为:com.example.myapplicationtest.ManiActivity
PS:如果开发者想修改包名,必须确保manifest中package值也做了同步修改。