zoukankan      html  css  js  c++  java
  • Android官方技术文档翻译——ApplicationId 与 PackageName

    本文译自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 应用程序都有一个包名。包名是设备上的这个应用程序的唯一标识,也是在谷歌Play商店上的唯一标识。这意味着,一旦你已发布的程序使用了这个包名, 你就永远都无法改变它;否则会导致你的应用程序被当作是一个全新的应用程序,你之前的应用程序的用户将不会看到作为更新的安装包。

    在此前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" >

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

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

    同时,您要在代码中导入的 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"
        }
        ...

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

    这里说到了最关键的部分:当你像上面那样做时,这两个包是互相独立的。你能够完全自由地重构您的代码——更改用于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 (例如一个 flavor 的特定的manifest或一个 buildType 的特定的manifest),该包名是可选的,但如果它被指定了,它必须和主manifest中指定的包完全相同。

  • 相关阅读:
    Asynchronous AOF fsync is taking too long (disk is busy?). Writing the AOF buffer without waiting for fsync to complete, this may slow down Redis.
    DHCP "No subnet declaration for xxx (no IPv4 addresses)" 报错
    Centos安装前端开发常用软件
    kubernetes学习笔记之十:RBAC(二)
    k8s学习笔记之StorageClass+NFS
    k8s学习笔记之ConfigMap和Secret
    k8s笔记之chartmuseum搭建
    K8S集群集成harbor(1.9.3)服务并配置HTTPS
    Docker镜像仓库Harbor1.7.0搭建及配置
    Nginx自建SSL证书部署HTTPS网站
  • 原文地址:https://www.cnblogs.com/zsw-1993/p/4879085.html
Copyright © 2011-2022 走看看