文章

package 与 applicationId 的区别

package 与 applicationId 的区别

Android 中 package 与 applicationId 的理解

最近在打包时碰到了在 apk 的包名 applicationId 目录下 无法找到R$styleable.smali 文件的问题?然后分析了一下AndroidManifest.xml 中 package 与 applicationId 区别,了解了一下两个不同的概念。

AndroidManifest.xml 中的package定义的是包结构的概念,当 apk 在编译时会将res 下资源变异后的 R 文件生成到 package 目录下,即所有的 R 资源都会在这里生成好。

applicationId 是应用的唯一 id,实际不参与包结构上的编译,仅用来为商店和手机中识别身份的唯一 id 作用。生成 apk 后,applicationId 会替代 package。

例如,若 package 为 com.example.myapp,applicationId 可设为 com.example.myapp.free,打包后 APK 的 AndroidManifest.xml 中 package 变为 com.example.myapp.free,但 R 类仍基于 com.example.myapp 生成。

这么做的好处是修改当前的 applicationId 不会影响到资源编译结构的变化,也就是更容易出多个不同applicationId 的包。

关键属性与作用

属性/概念描述影响范围
AndroidManifest.xml 中的 package源代码的 Java 包名,初始值代码组织和 R 类生成
build.gradle 中的 applicationIdAPK 的唯一标识符,替换最终 manifest 的 package设备和应用商店的应用程序标识
build.gradle 中的 namespace代码的包名,默认与 package 一致,可手动设置直接决定 R 类的包名
本文由作者按照 CC BY 4.0 进行授权