Android package属性、package name和Application ID三者的联系及区别
Androidpackage属性、packagename和ApplicationID三者的联系及区别
- package属性:在AndroidManifest.xml文件中。
- packagename:应用程序的包名。
- ApplicationID:模块defaultConfig块下的applicationId属性。
设置ApplicationID
每个Android应用程序都有唯一一个类似Java包名的ApplicationID,比如com.example.myapp。在Android设备和Google应用商店上,ApplicationID是您应用的唯一标识。如果您想上传应用程序的新版本,那么ApplicationID必须和原来相同。如果您改变了新版本应用程序的ApplicationID,那么Goolge应用商店会认为这是个完全不同的应用程序。所以,从您第一次上传应用程序开始,绝对不要更改ApplicationID。
ApplicationID定义在模块build.gradle的applicationId属性中,如下所示:
android{ defaultConfig{ applicationId"com.example.myapp" minSdkVersion15 targetSdkVersion24 versionCode1 versionName"1.0" } ... }
当您在AndroidStudio中创建新项目的时候,您可以设置applicationId属性,这时,ApplicationID和packagename是精确匹配的。除此之外,两者是完全独立的。当然,您可以更改packagename,但是这不会影响到ApplicationID。反之亦然(再次提醒:在您上传应用程序之后,不要修改ApplicationID,不要修改ApplicationID,不要修改ApplicationID)。然而,您应该意识到,修改packagename还有另一个后果。这部分详见修改包名(下文有讲)。
尽管ApplicationID看起来和传统的Java包名很类似,但是ApplicationID的命名规则有更多的限制:
- 最少有两段(至少一个.隔开)
- 每段开头必须是字母
- 所有的字符只能是字母、数字和下划线
注意:在以前,ApplicationID直接绑定packagename。所以,有些AndroidAPIs在方法名或者参数名中使用“packagename”,但是实际上指的是ApplicationID。举个栗子,Context.getPackageName()方法返回ApplicationID。所以没必要在您应用程序代码之外分享真正的packagename。
警告:如果你使用WebView,考虑使用您的packagename作为您ApplicationID的前缀,否则,您可能遇见
issue211768。
修改构建版本的ApplicationID
当为您的应用程序构建APK时,构建工具使用build.gradle文件中的defaultConfig块中定义的ApplicationID标识APK(如下所示)。但是,如果你想创建不同版本的应用程序并且在Google应用商店中显示不同的信息,例如“免费版”和“专业版”。您需要构建拥有不相同ApplicationID的不同版本。
在这种情况下,每个构建版本应该定义不同的productflavor,且每个flavor都在productFlavors{}块内部。对于每个flavor,您可以重新定义applicationId属性,或者给默认的applicationId増加前后缀,如下所示:
android{ defaultConfig{ applicationId"com.example.myapp" } productFlavors{ free{ applicationIdSuffix".free" } pro{ applicationIdSuffix".pro" } } }
这样定义之后,“free”的ApplicationID是”com.example.myapp.free“。
在构建类型上,你也可以使用后缀,如下所示:
android{ ... buildTypes{ debug{ applicationIdSuffix".debug" } } }
由于Gradle首先应用productflavor之后才应用buildtype,所以”freedebug”版本现在的ApplicationID是”com.example.myapp.free.debug”。如果你想在同一部手机上同时安装debug和release两个版本,这将非常有用,因为没有两个应用程序可以拥有相同的ApplicationID。
记住一点,同一应用程序拥有不同的ApplicationID,Google应用市场将会认为这是两个应用程序。所以,如果您为了适配不同的设备配置(例如不同的API等级),并且想用相同信息去分发多个应用程序。那么对于每个版本,您必须使用相同的ApplicationID和不同的versionCode。
警告:为了兼容先前的SDK工具,如果你没有在build.gradle中定义applicationId属性,那么构建工具将使用AndroidManifest.xml中的packagename作为ApplicationID。在这种情况下,重命名packagename意味着同时重命名了ApplicationID。
提示:如果您需要在manifest文件中引用ApplicationID,可以在manifest的属性中使用${applicationId}占位符。Gradle在构建时会自定替换这个标识为真正的ApplicationID。更多详见InjectBuildVariablesintotheManifest.
测试专用ApplicationID
默认情况下,构建工具会使用指定构建版本的ApplicationID(附加.test)将ApplicationID应用到您的instrumentation测试APK。例如,构建版本为”com.example.myapp.free”的测试应用程序真正的ApplicationID是“com.example.myapp.free.test“。
通常这不是必要的,你可以在defaultConfig或者productFlavor块中定义testApplicationId属性来修改ApplicationID。
注意:为了避免与测试应用程序命名冲突,构建工具为测试应用程序使用基于测试ApplicationID生成R.class的命名空间。
修改packagename
虽然packagename默认完全匹配ApplicationID,但是您仍然可以修改它。如果您想修改packagename,请留意packagename(项目目录结构)和AndroidManifest.xml中的package属性是完全对应的。如下所示:
<?xmlversion="1.0"encoding="utf-8"?> <manifestxmlns: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属性的值应该总是和工程的packagename相同。当然,你可以给工程设置子包名。这些文件必须从package属性的命名空间导入R类,并且任何定义在manifest中的组件必须增加子包名(或者写全路径)。
如果您需要完全重命名packagename,请确保您已经更新package属性。直到您用Androidstudio的工具重命名包,之后这些自动保持同步。(如果没有保持同步,您的代码将不能正确解析R类,因为它不再是相同包下,并且manifest也将不能正确识别您的activities和其它组件)。
您必须在AndroidManifest.xml文件中置顶package属性,如果您另外添加了manifest文件,请注意,由最高优先级manifest文件提供的packagename始终用于合并最终的manifest。更多:[MergeMultipleManifestFiles。
望周知:尽管您的项目可以设置package属性不等于applicationId,然并卵。构建工具在最后构建的时候将会复制ApplicationID并设置为您应用程序唯一的package属性的值。所以,如果您在构建成功之后检查AndroidManifest.xml文件,请不要惊讶package属性发生变化。在Android平台和Google应用商店,package属性才是真正作为您应用程序唯身份凭证。所以,一旦使用原始值构建(使用命名空间的R类解析manifest中的组件),构建工具将会丢弃package属性的值,并且使用ApplicationID替换。
原文链接:https://developer.android.com/studio/build/application-id.html#change_the_package_name
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!