程序员人生 网站导航

Android官方技术文档翻译――ApplicationId 与 PackageName

栏目:综合技术时间:2014-12-07 10:08:31

本文译自androd官方技术文档《ApplicationId versus PackageName》,原文地址:http://tools.android.com/tech-docs/new-build-system/applicationid-vs-packagename。

本文地址:http://blog.csdn.net/maosidiaoxian/article/details/41719357。转载请注明出处。翻译如有错讹,敬请指正。


ApplicationId 与 PackageName

所有的 Android 利用程序都有1个包名。包名是装备上的这个利用程序的唯1标识,也是在谷歌Play商店上的唯1标识。这意味着,1旦你已发布的程序使用了这个包名, 你就永久都没法改变它;否则会致使你的利用程序被当作是1个全新的利用程序,你之前的利用程序的用户将不会看到作为更新的安装包。

在此前Android Gradle 构建系统中,您的利用程序的包名由你的manifest文件的根元素里的package属性决定:

AndroidManifest.xml:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.my.app"
    android:versionCode="1"
    android:versionName="1.0" >

但是,这里所定义的包也有第2个目的:它被用来命名你的资源类的包(和解析任何相干的Activity的类名)。在上面的示例中,生成的 R 类将会是com.example.my.app.R,因此如果您其他包里面的代码需要援用这些资源,就需要导入com.example.my.app.R

使用新的 Android Gradle 构建系统,你可以轻松构建多个不同版本的利用程序;例如,您可以构建1个“free”版本和“pro”版本的利用程序 (通过使用flavors),并且这些不同版本的程序在 Google Play 商店上应当有不同的包,这样他们可以被单独安装和购买,或是同时安装两个,等等。一样,您还可以同时创建“debug”、“alpha”和“beta”版本的利用程序 (使用build types),而这些版本的程序一样可使用唯1的包名。

同时,您要在代码中导入的 R 类必须在这段时间内保持不变 ;在您正在构建您的利用程序的不同版本时您的.java 源文件不应当被更改。

因此,我们解耦了包名称的两种用法:
  • 终究的方案是,在您生成的.apk 的manifest 中,并且用于在你的装备和 Google Play 商店来标识你的利用的包,叫做“application id”。
  • 用于在源代码中来援用您的R类的,并且是解析任何相干的Activity/Service 注册的包,继续被称为“package”。
你可以在你 gradle 文件中,指定application id,以下所示:

app/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"
    }
    ...

像之前1样,你需要在 Manifest 文件中指定用于代码的包,就如上面的Andr??oidManifest.xml示例1样。

这里说到了最关键的部份:当你像上面那样做时,这两个包是相互独立的。你能够完全自由地重构您的代码――更改用于Activity和Service的内部包,更新你的Manifest里的包,和重构您的导入语句。这都不会影响到你的程序的终究id,这个终究的id总是为你的Gradle文件中指定的applicationId的值。

你可以通过使用以下的 Gradle DSL 方法,为不同的flavors和构建类型改变您的利用程序的 applicationId:

app/build.gradle:
    productFlavors {
        pro {
            applicationId = "com.example.my.pkg.pro"
        }
        free {
            applicationId = "com.example.my.pkg.free"
        }
    }

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

(在 Android Studio 中,您也能够在项目结构对话框中图形化地进行这些配置。)

注意: 出于兼容性缘由,如果您没有在您的 build.gradle 文件中定义 applicationId,这个applicationId 将默许为 AndroidManifest.xml 中所指定的相同的值。在这类情况下,这两个明显未解耦,并且如果你试图重构您的代码也将会心外地更改您的利用程序的 id !在 Android Studio 中,新建的项目始终会指定这两个值。

注 2: 包名称必须始终在默许 AndroidManifest.xml 文件中指定。如果您有多个manifest (例如1个 flavor 的特定的manifest或1个 buildType 的特定的manifest),该包名是可选的,但如果它被指定了,它必须和主manifest中指定的包完全相同。


------分隔线----------------------------
------分隔线----------------------------

最新技术推荐