【问题标题】:preferred apps of the same kind while initial device setup/startup in a custom ROM在自定义 ROM 中进行初始设备设置/启动时,首选同类应用程序
【发布时间】:2015-11-06 11:46:59
【问题描述】:

我们正在使用最新版本的 Lollipop 构建我们自己的 AOSP/自定义 ROM。

我们正在尝试构建自定义 ROM,并在设备上预装两个主屏幕。 一个是标准的Andoid“Launcher3”,另一个是我们自己的主屏幕应用“foobarhome”。到目前为止一切顺利:-)

我们目前的初始设备启动阶段大致如下:
- 设备启动动画
- GMS 设置向导(Wi-Fi、语言、Google 帐户设置等)
****设备达到设置完成状态****
- ResolverActivity 开始显示我们自己的 Home 应用程序“foobarhome”和 Launcher3 之间的选择(>>BAD GUY - 我们必须选择“foobarhome”才能运行“始终”
- 我们的主屏幕应用程序已启动并运行

问题:很遗憾,我们将在 GMS SetupWizard 完成后立即获得 ResolverActivity。
ResolverActivity 让我们在 Launcher3 和我们的主屏幕应用程序之间进行选择,我们必须手动选择我们的主屏幕应用程序(始终运行)。

目标:直接启动我们的主屏幕应用程序,中间没有 ResolverActivity。

准备工作:
在构建自定义 ROM 并执行所有我们的和 Android 的 make 文件期间,我们将所谓的 preferred-activities-home.xml 复制到 system/etc/preferred-apps/ 上设备。

在whatever.mk 中,我们有以下代码行:
首选应用设置:

PRODUCT_COPY_FILES += \
    myLocalPath/preferred_activities/preferred-activities-home.xml:system/etc/preferred-apps/preferred-activities-home.xml

这样的 preferred-activities-home.xml 的内容看起来像:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<preferred-activities>
    <item name="com.example.foobarhome/.MainActivity" match="100000" set="2">
        <set name="com.android.launcher3/com.android.launcher3.Launcher" />
        <set name="com.example.foobarhome/.MainActivity" />
        <filter>
            <action name="android.intent.action.MAIN" />
            <cat name="android.intent.category.HOME" />
            <cat name="android.intent.category.DEFAULT" />
        </filter>
    </item>
</preferred-activities>

您可能知道 frameworks/base/services/core/java/com/andoid/server/pm/PackageManagerService.java./Settings.java 类是处理这样的配置。

我们的分析:
1) GMS SetupWizard 刚刚启动(选择语言页面)
--> 执行 adb "shell dumpsys package preferred-xml" 或在设备文件目录检查文件内容:data/system/users/0/package-restrictions.xml
--> 寻找xml节点块:

<preferred-activities> ... </preferred-activities>


我们的输出是:

<item name="com.example.foobarhome/.MainActivity" match="100000" always="true" set="4">
    <set name="com.android.settings/.CryptKeeper" />
    <set name="com.google.android.setupwizard/.SetupWizardActivity" />
    <set name="com.example.foobarhome/.MainActivity" />
    <set name="com.android.launcher3/com.android.launcher3.Launcher" />
    <filter>
        <action name="android.intent.action.MAIN" />
        <cat name="android.intent.category.HOME" />
        <cat name="android.intent.category.DEFAULT" />
    </filter>
</item>

2) GMS SetupWizard 完成,SetupWizard UI 消失并显示 ResolverActivity
--> 可能的选择:

  Use foobarhome as HOME
  buttons "always" and "just once"
  --------------------------------
  Use a different app
  Launcher3

--> 再次检查设备中的 package-restrictions.xml 文件并 输出是:

<item name="com.example.foobarhome/.MainActivity" match="100000" always="false" set="0">
    <filter>
        <action name="android.intent.action.MAIN" />
        <cat name="android.intent.category.HOME" />
        <cat name="android.intent.category.DEFAULT" />
    </filter>
</item>

为什么 Launcher3 会在这里迷路?

3) 选择我们的 foobarhome 应用程序始终运行后,我们再次检查 package-restrictions.xml 并看到 - 在 GMS SetupWizard 完成后我们期望看到的内容。
输出是:

<item name="com.example.foobarhome/.MainActivity" match="100000" always="true" set="2">
    <set name="com.example.foobarhome/.MainActivity" />
    <set name="com.android.launcher3/com.android.launcher3.Launcher" />
    <filter>
        <action name="android.intent.action.MAIN" />
        <cat name="android.intent.category.HOME" />
        <cat name="android.intent.category.DEFAULT" />
    </filter>
</item>

一般来说,这些preferred-activities.xml 方法有效,但不知何故,它在初始设备启动/设置期间不起作用。 我们想知道为什么我们在通往 ResolverActivity 的途中丢失了 package-restrictions.xml 中的第二个主应用程序 (Launcher3)。

问题:
Q1: 有没有办法在 Settings.apk(包/应用程序/设置)中预先选择主屏幕应用程序,可能通过aosp_root/frameworks/base/core/java/android/content/res/Configuration.java
这或许能解决问题?

Q2: 在设备上的 data/system/users/0/package-restrictions.xml 中,我们看到了 Lollipop 引入的两个新 xml 节点(与 KitKat 相比)。 这些被称为&lt;persistent-preferred-activities /&gt;&lt;crossProfile-intent-filters /&gt;。 它们的用途和使用方法是什么? &lt;persistent-preferred-activities /&gt; 中子元素的语法是什么? 有任何关于它的公开可用的 android 文档吗?

主要问题:知道如何通过在初始设备启动/设置期间不获取 ResolverActiviy 来解决它吗?

【问题讨论】:

    标签: android configuration startup homescreen


    【解决方案1】:

    对于 Q1:我认为您可以像 ChooseActivity 一样做一些事情。关键是在 Launcher 之前找到合适的执行时间,据我所知,Provision 是执行此操作的最佳位置。 您可以拨打addPreferredActivity()PackageManager 携带 在 Provision 禁用之前。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-23
      • 2015-06-18
      • 2015-04-10
      • 2021-04-25
      • 2015-10-28
      相关资源
      最近更新 更多