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

设置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 name作为Application ID。在这种情况下,重命名package name意味着同时重命名了Application ID。
提示:如果您需要在manifest文件中引用Application ID,可以在manifest的属性中使用${applicationId}占位符。Gradle在构建时会自定替换这个标识为真正的Application ID。更多详见 Inject Build Variables into the Manifest.
测试专用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属性是完全对应的。如下所示:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapp" android:versionCode="1" android:versionName="1.0" >
对于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替换。
原文链接:https://developer.android.com/studio/build/application-id.html#change_the_package_name
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# Android
# package属性、package
# name和Application
# ID三者的联系及区别
# package
# ID联系及区别
# Android Application存取公共数据的实例详解
# Android application捕获崩溃异常怎么办
# Android 退出多Activity的application的方式方法
# Android Framework Application Framework层简单介绍
# Android编程之Application设置全局变量及传值用法实例分析
# Android开发中避免应用无响应的方法(Application Not Responding、AN
# Android获取应用程序名称(ApplicationName)示例
# 详解Android中Application设置全局变量以及传值
# 应用程序
# 您的
# 所示
# 将会
# 如果您
# 为您
# 您可以
# 重命名
# 您需要
# 你可以
# 你想
# 您在
# 周知
# 上传
# 在上面
# 在这种情况下
# 新版本
# 您想
# 您必须
# 专业版
相关文章:
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
香港服务器网站推广:SEO优化与外贸独立站搭建策略
如何快速使用云服务器搭建个人网站?
安徽网站建设与外贸建站服务专业定制方案
如何有效防御Web建站篡改攻击?
专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?
香港网站服务器数量如何影响SEO优化效果?
交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?
高端云建站费用究竟需要多少预算?
建站之星如何实现网站加密操作?
行程制作网站有哪些,第三方机票电子行程单怎么开?
南宁网站建设制作定制,南宁网站建设可以定制吗?
深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?
香港服务器部署网站为何提示未备案?
c# 服务器GC和工作站GC的区别和设置
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
宝塔新建站点为何无法访问?如何排查?
SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?
如何快速查询域名建站关键信息?
制作公司内部网站有哪些,内网如何建网站?
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?
TestNG的testng.xml配置文件怎么写
建站之星代理平台如何选择最佳方案?
如何正确选择百度移动适配建站域名?
广州建站公司哪家好?十大优质服务商推荐
如何快速生成可下载的建站源码工具?
西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?
宝华建站服务条款解析:五站合一功能与SEO优化设置指南
建站主机功能解析:服务器选择与快速搭建指南
电商网站制作价格怎么算,网上拍卖流程以及规则?
微课制作网站有哪些,微课网怎么进?
如何彻底卸载建站之星软件?
怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?
阿里云网站搭建费用解析:服务器价格与建站成本优化指南
宝塔Windows建站如何避免显示默认IIS页面?
建站主机解析:虚拟主机配置与服务器选择指南
盘锦网站制作公司,盘锦大洼有多少5G网站?
高防服务器如何保障网站安全无虞?
网站企业制作流程,用什么语言做企业网站比较好?
建站之星在线版空间:自助建站+智能模板一键生成方案
如何高效搭建专业期货交易平台网站?
如何通过IIS搭建网站并配置访问权限?
如何快速搭建二级域名独立网站?
成都网站制作公司哪家好,四川省职工服务网是做什么用?
小说建站VPS选用指南:性能对比、配置优化与建站方案解析
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?
建站为何优先选择香港服务器?
如何在搬瓦工VPS快速搭建网站?
桂林网站制作公司有哪些,桂林马拉松怎么报名?
*请认真填写需求信息,我们会在24小时内与您取得联系。