【发布时间】: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 相比)。
这些被称为<persistent-preferred-activities /> 和<crossProfile-intent-filters />。
它们的用途和使用方法是什么?
<persistent-preferred-activities /> 中子元素的语法是什么?
有任何关于它的公开可用的 android 文档吗?
主要问题:知道如何通过在初始设备启动/设置期间不获取 ResolverActiviy 来解决它吗?
【问题讨论】:
标签: android configuration startup homescreen