何时使用应用程序ID或包名称a.k.a.是PackageManager#getLaunchIntentForPackage方法名称不正确?申请ID

问题描述 投票:1回答:1

When do I use 'application ID' or 'package'?

(或者是'包名'?)

My confusion in a practical situation:

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

PackageManager manager = context.getPackageManager();
Intent intent = manager.getLaunchIntentForPackage(packageName);

请注意,参数的名称称为packageName,即使方法名称也提到'package'。但是,这不是包名!这是我们应该在这里使用的应用程序ID!

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

那么我在这看什么呢?我认为com.example是我的包名,而com.example.debug是我的应用程序ID。但是为什么PackageManager#getLaunchIntentForPackage方法提到'包'和'包名',而它会认为它应该提到'应用程序ID'而不是?

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

我的问题基于以下信息。

From the documentation on application IDs, I quote:

每个Android应用程序都有一个看似Java包名称的唯一应用程序ID,例如com.example.myapp。此ID可在设备和Google Play商店中唯一标识您的应用。如果您要上传新版本的应用,则应用ID(和certificate you sign it with)必须与原始APK相同 - 如果您更改应用ID,Google Play商店会将APK视为完全不同的应用。因此,一旦您发布应用程序,就不应该更改应用程序ID。

[...]

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

因此,应用程序ID可以在Play商店中唯一标识您的应用。包名称是应用程序代码库中子包和类的名称空间。到目前为止这么好,我理解这一点。

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

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

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

  1. Google Play按应用ID和包识别应用。
  2. 清单的程序包名称可能与应用程序ID不同,编译时编译时应用程序ID会覆盖程序包。

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

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

I hope that...

...有人可以通过各种示例创建一个很好的答案,这些示例显示应用程序ID和包(名称)是否相同,或者当它们不相同时,以及Android系统和Google Play实际使用哪些。还请考虑一个带有库依赖的示例:据我所知,库的包命名空间不会改变,但它会与您的应用程序ID一起运行,对吗?

android android-intent android-package-managers
1个回答
2
投票

android:package中的<manifest>属性就是我们在这里讨论的内容。它曾经被称为“包名称”,在某些旧文档中仍被称为“包名称”。它不是Java包名称,即使它看起来像一个,它与源代码中的Java包名称无关。

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

这是一回事。 “包名称”是“应用程序ID”。

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

注意:

有一个地方可能会让事情变得混乱,这是清单中组件名称的简写符号。例如:

    <activity
            android:name=".ui.activities.MainActivity">
    </activity>

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

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

    <activity
            android:name="com.mycompany.mypackage.ui.activities.MainActivity">
    </activity>
© www.soinside.com 2019 - 2024. All rights reserved.