当前位置: 移动技术网 > IT编程>移动开发>Android > Android package属性、package name和Application ID三者联系及区别

Android package属性、package name和Application ID三者联系及区别

2018年12月28日  | 移动技术网IT编程  | 我要评论

魔窟覆灭记,上海第二工业大学分数线,栗裕简历

名词解释

package属性:在androidmanifest.xml文件中。 package name:模块结构的包名。 application id:模块defaultconfig块下的applicationid属性。

设置application id

每个android应用程序都有唯一一个类似java包名的application id,比如com.example.myapp。在android设备和google应用商店上,application id是您应用的唯一标识。如果您想上传应用程序的新版本,那么application id必须和原来相同。如果您改变了新版本应用程序的application id,那么goolge应用商店会认为这是个完全不同的应用程序。所以,从您第一次上传应用程序开始,绝对不要更改application id

application id定义在模块build.gradle的applicationid属性中,如下所示:

android {
    defaultconfig {
        applicationid "com.example.myapp"
        minsdkversion 15
        targetsdkversion 24
        versioncode 1
        versionname "1.0"
    }
    ...
}

当您在android studio中创建新项目的时候,您可以设置applicationid属性,这时,application id和package name是精确匹配的。除此之外,两者是完全独立的。当然,您可以更改package name,但是这不会影响到application id。反之亦然(再次提醒:在您上传应用程序之后,不要修改application id,不要修改application id,不要修改application id)。然而,您应该意识到,修改package name 还有另一个后果。

尽管application id看起来和传统的java包名很类似,但是application id的命名规则有更多的限制:

最少有两段(至少一个.隔开) 每段开头必须是字母 所有的字符只能是字母、数字和下划线

注意:在以前,application id 直接绑定package name。所以,有些android apis在方法名或者参数名中使用“package name”,但是实际上指的是application id。举个栗子, context.getpackagename()方法返回application id。所以没必要在您应用程序代码之外分享真正的package name。

警告:如果你使用webview,考虑使用您的package name作为您application id的前缀,否则,您可能遇见 issue 211768。

修改构建版本的application id

当为您的应用程序构建apk时,构建工具使用build.gradle文件中的defaultconfig块中定义的application id标识apk(如下所示)。但是,如果你想创建不同版本的应用程序并且在google应用商店中显示不同的信息,例如“免费版”和“专业版”。您需要构建拥有不相同application id的不同版本。

在这种情况下,每个构建版本应该定义不同的product flavor,且每个flavor都在productflavors{}块内部。对于每个flavor,您可以重新定义applicationid属性,或者给默认的applicationid増加前后缀,如下所示:

android {
    defaultconfig {
        applicationid "com.example.myapp"
    }
    productflavors {
        free {
            applicationidsuffix ".free"
        }
        pro {
            applicationidsuffix ".pro"
        }
    }
}

这样定义之后,“free”的application id是”com.example.myapp.free“。

在构建类型上,你也可以使用后缀,如下所示:

android {
    ...
    buildtypes {
        debug {
            applicationidsuffix ".debug"
        }
    }
}

由于gradle首先应用product flavor之后才应用build type,所以”free debug”版本现在的application id是”com.example.myapp.free.debug”。如果你想在同一部手机上同时安装debug和release两个版本,这将非常有用,因为没有两个应用程序可以拥有相同的application id。

记住一点,同一应用程序拥有不同的application id,google应用市场将会认为这是两个应用程序。所以,如果您为了适配不同的设备配置(例如不同的api等级),并且想用相同信息去分发多个应用程序。那么对于每个版本,您必须使用相同的application id和不同的versioncode。

警告:为了兼容先前的sdk工具,如果你没有在build.gradle中定义applicationid属性,那么构建工具将使用androidmanifest.xml中的package属性作为application id。在这种情况下,重命名package name意味着同时重命名了application id。

提示:如果您需要在manifest文件中引用application id,可以在manifest的属性中使用${applicationid}占位符。gradle在构建时会自定替换这个标识为真正的application id。

测试专用application id

默认情况下,构建工具会使用指定构建版本的application id(附加.test)将application id应用到您的instrumentation测试apk。例如,构建版本为”com.example.myapp.free”的测试应用程序真正的application id是“com.example.myapp.free.test“。

通常这不是必要的,你可以在defaultconfig或者productflavor块中定义testapplicationid属性来修改application id。

注意:为了避免与测试应用程序命名冲突,构建工具为测试应用程序使用基于测试application id生成r.class的命名空间。

修改package name

虽然package name默认完全匹配application id,但是您仍然可以修改它。如果您想修改package name,请留意package name(项目目录结构)和androidmanifest.xml中的package属性是完全对应的。如下所示:


对于android构建工具来说,package属性用于两件事情:

应用于您应用程序生成r.java类的命名空间。

例如:在上面的manifest文件中。r类是“com.example.myapp.r”

用于解析androidmanifest.xml文件中任何类的相对路径。

例如:在上面的manifest文件中。一个activity定义为\,将会被解析为com.example.myapp.mainactivity。

因此,package属性的值应该总是和工程的package name相同。当然,你可以给工程设置子包名。这些文件必须从package属性的命名空间导入r类,并且任何定义在manifest中的必须增加子包名(或者写全路径)。

如果您需要完全重命名package name,请确保您已经更新package属性。直到您用android studio的工具重命名包,之后这些自动保持同步。(如果没有保持同步,您的代码将不能正确解析r类,因为它不再是相同包下,并且manifest也将不能正确识别您的activities和其它组件)。

您必须在androidmanifest.xml文件中置顶package属性,如果您另外添加了manifest文件,请注意,由最高优先级manifest文件提供的package name始终用于合并最终的manifest。更多:[merge multiple manifest files。

望周知:尽管您的项目可以设置package属性不等于applicationid,然并卵。构建工具在最后构建的时候将会复制application id并设置为您应用程序唯一的package属性的值。所以,如果您在构建成功之后检查androidmanifest.xml文件,请不要惊讶package属性发生变化。在android平台和google应用商店,package属性才是真正作为您应用程序唯身份凭证。所以,一旦使用原始值构建(使用命名空间的r类解析manifest中的组件),构建工具将会丢弃package属性的值,并且使用application id替换。


如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网