参考原文链接:https://blog.csdn.net/jinrall/java/article/details/53465403
https://blog.csdn.net/qq_17250009/article/details/53896168
名词解释
package属性:在AndroidManifest.xml文件中。
package name:模块结构的包名。
Application ID:模块defaultConfig块下的applicationId属性。
设置Application ID
每个Android应用程序都有唯一一个类似Java包名的Application ID,比如com.example.myapp。在Android设备和Google应用商店上,Application ID是您应用的唯一标识。如果您想上传应用程序的新版本,那么Application ID必须和原来相同。如果您改变了新版本应用程序的Application ID,那么Goolge应用商店会认为这是个完全不同的应用程序。所以,从您第一次上传应用程序开始,绝对不要更改Application ID。
Application ID定义在模块build.gradle的applicationId属性中,如下所示:
android {
defaultConfig {
applicationId "com.example.myapp"
minSdkVersion 15
targetSdkVersion 24
versionCode 1
versionName "1.0"
}
...
}
在Android Studio中创建一个新项目时,applicationId默认是和项目的包名一致的。所以常常有开发者会将两者混淆,以为它们是一个概念。实际上,应用ID和包名是相互独立的。改变包名不会影响应用ID,反之亦然。(再次提醒:在您上传应用程序之后,不要修改Application ID,不要修改Application ID,不要修改Application ID)。然而,您应该意识到,修改package name 还有另一个后果。这部分详见[修改包名](下文有讲)。
通常Android的应用ID与包名是绑定的,所以在Android API中,一些方法和参数从名称上看似乎它们返回的是包名,事实上它们返回的是应用ID值.例如,Context.getPackageName()方法返回的是应用ID,而不是包名。不信我们来看:
图中,包名是:com.example.myapplicationtest
应用ID:com.example.myapplicationtest.id
在MainActivity中调用如下代码:
String applicationId = this.getPackageName();
Log.i("TESTKIM","applicationId:" + applicationId);
打印日志文件,如下:
尽管Application ID看起来和传统的Java包名很类似,但是Application ID的命名规则有更多的限制:
- 最少有两段(至少一个.隔开)
- 每段开头必须是字母
- 所有的字符只能是字母、数字和下划线
应用ID用处
应用ID除了唯一标识了应用,那么它在开发过程中可以有哪些用处呢?
试想一下,当我们开发应用的时候,要在一台测试机上同时装上开发版和发布版,如何才能做到呢?其实很简单,只要让开发版的应用ID与发布版不一致即可。所以,只需要在buildTypes中修改开发版的应用ID就行。如下:
android {
...
buildTypes {
debug {
applicationIdSuffix ".debug" //等同于“com.example.myapplicationtest.debug”
}
}
}
上面代码中,将debug版的应用ID在原来应用ID后追加“.debug”。applicationIdSuffix代表了默认的应用ID,即为defaultConfig中applicationId的值。所以,debug版的应用ID为:"com.example.myapplicationtest.debug".
另外,有时我们发布到市场的应用希望有不同的版本,比如:免费版和收费版。这就需要我们来构建不同的应用变体。那么我们可以在productFlavors中进行相应的配置,来生成不同的应用。如:
android {
defaultConfig {
applicationId "com.example.myapplicationtest"
}
productFlavors {
free {
applicationIdSuffix ".free"
}
paid {
applicationIdSuffix ".paid"
}
}
}
在上面的代码中,我们用"free"表示免费版,用"paid"表示付费版。在productFlavors中,通过配置不同应用ID,最终生成不同的应用。最终这两种应用apk可同时存在于市场中。
修改包名
默认情况下,包名与应用ID是相同的。当然,开发者也可以对包名进行修改.如果开发者想要修改包名的话,注意项目目录结构必须与AndroidManifest.xml中package属性的包名一致.
package值有两个作用:
它为R.java文件提供了命名空间,例如R class的包名为com.example.myappcationtest.R
决定manifest中声明的class的相对名称。如:manifest中声明的
如果开发者想修改包名,必须确保manifest中package值也做了同步修改.