您的位置:首页 > 移动开发

ApplicationId与PackageName的纠葛(ApplicationId versus PackageName译文)

2016-05-19 11:32 323 查看
文档下载地址:http://download.csdn.net/detail/jw20082009jw/9524864

gradle plugin user guide中文版一文中有提到过Application versus
PackageName这篇文章,当时只是一个简单的外链,但是个人觉得这篇挺重要的,就翻译了过来。

原文地址:http://tools.android.com/tech-docs/new-build-system/applicationid-vs-packagename

 

ApplicationId与PackageName的纠葛

所有的安卓app都有一个包名,该包名唯一且用于识别设备上的该应用,同样在Google Play store也是唯一的。这就意味着一旦你发布了一款指定包名的应用,你就不能更改他,更改会让你的应用成为一个全新的应用,所有现存的用户都不会在更新的时候看到这个新的包。

 

在安卓的gradle构建系统出现之前,应用的包名通过在manifest文件中的package属性来指定:

AndroidManifest.xml:

 


然而,在此处定义包名也出于第二种目的:用来指定R资源文件所在的包名(就像分辨与Activity相关的类名)。在上面的例子中,生成的R类会是com.example.my.app.R,所以如果你有代码位于其他的包并且需要引用资源,那他就需要导入com.example.my.app.R。

 

在安卓的gradle构建系统中,你可以很容易的构建应用的不同版本;例如,你可以构建一个“free”版和一个“pro”版(使用flavors),然后这些在Google Play store中就应该会有不同的包名,这样才能够被单独安装和付费,两个同时被安装,等等。类似的,你应该也会构建“debug”、“alpha”和“beta”版(使用build types)并且这些也会产生一个唯一的包名。

 

同时,你在代码中导入的R类必须一直保持一致,你的.java源文件当你构建应用的不同版本时不应该改变。

 

因此,我们分离了包名的这两种用途:

l 最终的包名是被用在构建.apk的manifest中,以及是应用在设备上和Google Play store中被周知的,就是所谓的“application id”。

l 包名被用于源码文件中来引用R类,以及用来识别任何activity/service相关的注册,仍然被叫做“package”。

 

你可以在你的gradle文件中通过下列方式指定application id:

App/build.gradle:

 


在之前,你需要在你的manifest文件中指定你的代码中需要用到的包名,就像上面展示的AndroidManifest.xml示例一样。

 

下面是最重要的部分:当你做完了上面的工作,两个包名相互独立。你可以完全自由的重构你的代码 - 改变activity和service使用的内部包名,更新你的Manifest中的包名,重构的导入(import)的声明。这些都和应用的最终id无关(最终id现在都是在Gradle文件中指定的applicationId)。

 

你可以为你的应用的flavors和build types指定applicationId通过使用如下的Gradle方法:

App/build.gradle:

 


(在android studio中你都可以通过在Project Structure对话框中的图形化方式来配置)

 

注意:基于兼容性原因,如果你没有在你的build.gradle文件中定义一个applicationId,那么applicationId就会默认和AndroidManifest.xml文件中所指定的一样。在这种情况下,这两者是明显没有被分离的,如果尝试重构你的代码很明显就会改变你的应用id。在Android Studio中,新创建的项目都会指定这两个。

 

注意2:包名必须被指定在默认的AndroidManifest.xml文件中。如果有多个manifest(例如flavor定制的manifest或者是buildType定制的manifest),包名是可选的,但是如果定制必须和主manifest中的包名一致。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android gradle