何时使用应用程序 ID 或包名称(即 PackageManager#getLaunchIntentForPackage 方法名称不正确)?

Eri*_*rik 3 android android-intent android-package-managers

何时使用“应用程序 ID”或“包”?

\n

(或者是“包名称”?)

\n

我在实际情况中的困惑:

\n

从一个应用程序切换到另一个应用程序的一种方法是获取该应用程序的启动意图,这可以使用以下命令来完成(给定一些context):

\n
PackageManager manager = context.getPackageManager();\nIntent intent = manager.getLaunchIntentForPackage(packageName);\n
Run Code Online (Sandbox Code Playgroud)\n

请注意,参数的名称被调用packageName,甚至方法名称也提到了“package”。然而,这不是名!这是我们应该在这里使用的应用程序 ID!

\n

例如,如果我有一个调试构建类型,而不是com.example具有调试后缀的发布应用程序 ID,例如,它是com.example.debug,我必须使用"com.example.debug"的参数getLaunchIntentForPackage。但应用程序的包命名空间保持不变(默认情况下):它仍然是com.example!如果我没有安装非调试应用程序,该getLaunchIntentForPackage方法将返回null,因为应用程序 IDcom.example尚未安装。

\n

那么我在这里看什么呢?我认为这com.example是我的包名称,com.example.debug也是我的应用程序 ID。但是为什么PackageManager#getLaunchIntentForPackage方法会提到“package”和“package name”,而会认为应该提到“application ID”呢?

\n

这只是 Android SDK 中一个错误命名的方法,还是我误解了什么?

\n

我的问题基于以下信息。

\n

从应用程序 ID的文档中,我引用:

\n
\n

每个 Android 应用程序都有一个唯一的应用程序 ID,看起来像 Java 包名称,例如com.example.myapp。此 ID 唯一标识您的应用程序在设备上和 Google Play 商店中的位置。如果您想上传新版本的应用程序,应用程序 ID(以及您用来签名的证书)必须与原始 APK\xe2\x80\x94 相同。如果您更改应用程序 ID,Google Play 商店会处理该 APK作为一个完全不同的应用程序。因此,一旦发布应用程序,就永远不应该更改应用程序 ID

\n

[...]

\n

当您在 Android Studio 中创建新项目时,它与applicationId您在安装过程中选择的 Java 样式包名称完全匹配。但是,除此之外,应用程序 ID 和包名称是相互独立的。您可以更改代码的包名称(您的代码命名空间),它不会影响应用程序 ID,反之亦然(不过,一旦发布应用程序,您就不应该更改应用程序 ID)。但是,更改包名称会产生您应该注意的其他后果,因此请参阅有关修改包名称的部分。

\n
\n

因此,应用程序 ID 在 Play 商店中唯一标识您的应用程序。包名称是应用程序代码库中子包和类的命名空间。到目前为止一切顺利,我明白了这一点。

\n

然而,在本文档页面的末尾,我们有以下更令人困惑的亮点:

\n
\n

还有一件事需要了解:虽然您的清单package和 Gradle可能有不同的名称applicationId,但构建工具会在构建结束时将应用程序 ID 复制到 APK 的最终清单文件中。因此,如果您在构建后检查AndroidManifest.xml文件,请不要对package属性发生更改感到惊讶。该package属性是 Google Play 商店和 Android 平台实际用来识别您的应用程序的地方;因此,一旦构建使用了原始值(为R类命名并解析清单类名称),它就会丢弃该值并将其替换为应用程序 ID。

\n
\n

所以我们在一页上有多个矛盾!

\n
    \n
  1. Google Play 通过应用程序 ID 与程序包来识别应用程序。
  2. \n
  3. 清单的包名称可能与应用程序 ID 不同,而在编译时,包会被构建工具的应用程序 ID 覆盖。
  4. \n
\n

从这个亮点来看,至少关于构建工具通过应用程序覆盖包名称的说法似乎是不正确的,因为:

\n

com.example.MainActivity在应用程序中创建活动意图时,com.example.debug我必须指定com.example.debug应用程序 ID 和com.example.MainActivity组件名称。在运行时,组件名称尚未将其包名称更改为应用程序 ID,因此构建工具似乎未更改包名称空间?

\n

我希望...

\n

...有人可以通过各种示例创建一个很好的答案,这些示例显示应用程序 ID 和包(名称)何时相同,何时不同,以及 Android 系统和 Google Play 实际在哪里使用哪个。另请考虑一个具有库依赖项的示例:据我了解,库的包命名空间不会更改,但它与您的应用程序 ID 一起运行,对吗?

\n

Dav*_*ser 5

android:package中的属性就是<manifest>我们这里讨论的。它曾经被称为“包名称”,并且在一些较旧的文档中仍然被称为“包名称”。它不是 Java 包名称,尽管它看起来像 Java 包名称,而且它与源代码中的 Java 包名称无关。

最近,此属性被称为“应用程序 ID”,特别是在与 Firebase、Play 商店等相关的文档中。

这是同样的事情。“包名称”是“应用程序ID”。

参考https://developer.android.com/guide/topics/manifest/manifest-element.html#package

笔记:

有一个地方可能会让人感到困惑,那就是清单中组件名称的简写符号。例如:

    <activity
            android:name=".ui.activities.MainActivity">
    </activity>
Run Code Online (Sandbox Code Playgroud)

在本例中,该android:name属性指定“完全限定的 Java 类名Activity”。但是,如果名称以句点开头(如本示例中所示),则应用程序的“包名称”(来自标记android:package的属性<manifest>)将添加到类名称前面,以形成Activity.

android:package如果您遇到不同构建变体的属性发生更改的情况(如在debug包名称中使用的示例),则不应在清单中使用组件名称的简写符号!您应该始终使用完全限定名称,如下所示:

    <activity
            android:name="com.mycompany.mypackage.ui.activities.MainActivity">
    </activity>
Run Code Online (Sandbox Code Playgroud)