android – 在自定义ROM中初始设备设置/启动时的同类应用程序的首选应用程序
作者:互联网
我们正在使用最新版本的Lollipop构建我们自己的AOSP /自定义ROM.
我们试图建立的是在设备上预装两个主屏幕来构建自定义ROM.
一个将是标准的Andoid“Launcher3”,另一个是我们自己的主屏幕应用程序“foobarhome”.到现在为止还挺好 :-)
我们当前的初始设备启动阶段大致如下:
– 设备启动动画
– GMS SetupWizard(Wi-Fi,语言,Google帐户设置等)
****设备达到设置完成状态****
– ResolverActivity开始显示我们自己的家庭应用程序“foobarhome”和Launcher3(>> BAD GUY<<)之间的选择
– 我们必须选择“foobarhome”来运行“always”
– 我们的主屏应用程序已启动并正在运行
问题:不幸的是,我们将在GMS SetupWizard完成后立即获得ResolverActivity.
ResolverActivity让我们在Launcher3和我们的主屏幕应用程序之间进行选择,我们必须手动选择我们的家庭应用程序(始终运行).
目标:直接启动我们的家庭应用程序,中间没有ResolverActivity.
水面浮油:
在构建自定义ROM并执行我们所有的Androids 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”或在设备文件dir上检查文件内容: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(packages / apps / Settings)中预先选择一个主屏幕应用程序,可能是通过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,我们怎能解决这个问题?
解决方法:
对于Q1:我认为你可以像ChooseActivity那样做.关键是要在Launcher之前找到合适的执行时间,我知道,Provision是最好的地方.
你可以调用PackageManager携带的addPreferredActivity()
在供应禁用之前.
标签:android,configuration,startup,homescreen 来源: https://codeday.me/bug/20190711/1433942.html