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
协议。
| 归档时间: |
|
| 查看次数: |
1624 次 |
| 最近记录: |