«

ApplicationId与PackageName的区别

时间:2024-3-2 18:45     作者:韩俊     分类: Android


原文链接: 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相同,最好是分开标识。



标签: android

热门推荐