原文链接: http://tools.android.com/tech-docs/new-build-system/applicationid-vs-packagename
在android开发中,应用包名是APP在设备和Google Play的唯一标识,一旦app的新版本修改了包名再重新发布到Google Play,则会被处理为新的应用,app的老用户也无法接收到更新通知。
在没有采用Gradle构建系统之前,包名是通过AndroidManifest.xml中的package属性标识的,如下所示:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.my.app" android:versionCode="1" android:versionName="1.0" >除此之外,包名属性同时作为项目源文件索引的R资源文件、Activity类文件的前缀(包名),通过制定包名,项目源文件可以省去输入完整路径的R文件等。
而Gradle构建系统允许构建不同版本的app,如“free”和“pro”版本并同时发布和安装,因此需要不同的“包名”来标示区分。这与上面的package属性唯一标识一个app产生冲突,为了解决这个问题,Gradle引入了“applicationId”,使得package属性与applicationId解耦。
1.applicationId属性唯一标识app,包括在Google Play和设备上;
2,,package属性仍然作为项目源码引用R资源文件以及相关的Activity/Service时使用的包名前缀。
在Gradle中配置applicationId可以通过在项目的build.gradle中做如下配置:
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" } ...
而上面第2点提到的package属性则仍然通过项目的AndroidManifest.xml中进行配置。
这样做的好处在于,你可以随便修改项目内部的“包名”,此时只需要修改项目源码结构以及AndroidManifest.xml文件中的package属性,从而保证项目源码内部引用的R资源文件和Activity等源文件路径正确,而不会影响到发布到Google Play或者设备上,此时app的唯一标识只认设备打包配置时使用的applicationId属性。
另一方面,你可以通过配置构建脚本进行多渠道多版本打包,而这个过程与以前的package属性无关。配置例子如下:
productFlavors { pro { applicationId = "com.example.my.pkg.pro" } free { applicationId = "com.example.my.pkg.free" } } buildTypes { debug { applicationIdSuffix ".debug" } } ....
如果你没有在build.gradle中显式制定applicationId属性,该属性默认与AndroidManifest.xml中的package相同,最好是分开标识。