在自定义 ROM 中进行初始设备设置/启动时首选的同类应用程序

dig*_*lxm 5 configuration android startup homescreen

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

我们试图归档的是构建自定义 ROM,并在设备上预安装两个主屏幕。一个是标准的Andoid“Launcher3”,另一个是我们自己的主屏幕应用程序“foobarhome”。到现在为止还挺好 :-)

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

问题:不幸的是,我们将在之后立即获得 ResolverActivity GMS 设置向导已完成。
ResolverActivity 为我们提供了 Launcher3 和主屏幕应用程序之间的选择,我们必须手动选择我们的主应用程序(始终运行)。

目标:

准备工作:
在构建自定义 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
Run Code Online (Sandbox Code Playgroud)

并且这种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>
Run Code Online (Sandbox Code Playgroud)

您可能知道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>
Run Code Online (Sandbox Code Playgroud)


我们的输出是:

<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>
Run Code Online (Sandbox Code Playgroud)

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

  Use foobarhome as HOME
  buttons "always" and "just once"
  --------------------------------
  Use a different app
  Launcher3
Run Code Online (Sandbox Code Playgroud)

--> 再次检查设备中的 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>
Run Code Online (Sandbox Code Playgroud)

为什么 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>
Run Code Online (Sandbox Code Playgroud)

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

问题:
Q1:是否可以通过aosp_root/frameworks/base/core/java/android/content/res/Configuration.java在 Settings.apk (packages/apps/Settings) 中预先选择主屏幕应用程序。
这可能会解决问题吗?

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

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

小智 0

对于问题 1:我认为你可以像 ChooseActivity 那样做一些事情。关键是要在Launcher之前找到一个合适的执行时间,据我所知,Provision是执行此操作的最佳位置。您可以在该规定自行禁用之前调用addPreferredActivity()PackageManager 协议。