在 AOSP 上设置默认应用程序

Set default application on AOSP

问题

如果有两个相同类别的应用程序,我可以在构建中设置默认应用程序吗? 安装了吗?

例子

我要在 AOSP 上添加自定义浏览器。我想在构建开始前将其设置为默认浏览器。

在包的 Android.mk 文件中有一个指定 'LOCAL_OVERRIDES_PACKAGES' 的选项,它基本上覆盖了提到的包的安装,使我的应用程序成为默认应用程序。

但我希望其他应用成为 ROM 的一部分,我的应用作为默认应用。

任何想法将不胜感激。

所以我找到了在构建时将应用程序设置为默认应用程序的解决方案。我正在记录它,希望它能帮助其他人。

  1. Android 系统在位于 /data/system/users/{*user-id*}/package-restrictions.xml 的名为 <preferred-activities></preferred-activities>[= 的文件中的一个块中保留了一个默认 applications/activities 列表17=]

  2. 此文件由 Settings.java 和 PackageManager.java 在构建时生成。每当 android 系统上的默认值发生变化时,此 xml 块上的标志也会相应地发生变化。

  3. 在构建时,系统从附加位置读取一组首选活动,即/system/etc/preferred-activities/*.xml
  4. 为了添加我们想要的 preferred/default 活动,我们创建了一个 xml 文件并将其放置在 /system/etc/preferred-activities/ 中,然后由 android 系统和首选活动列表已添加到 package-restrictions.xml
  5. 中的列表中

例子

向 AOSP 添加自定义浏览器

  • 如果设备上只安装了默认浏览器其他 'mybrowser' 应创建以下 xml 文件。在这个 案例,我将其命名为 preferred-activies-home.xml

    <?xml version="1.0" encoding="UTF-8"?>
       <preferred-activities>
          <item name="com.mybrowser.MainActivity" match="200000" always="true" set="2">
             <set name="com.mybrowser./.MainActivity" />
             <set name="com.android.browser/.BrowserActivity" />
             <filter>
                <action name="android.intent.action.VIEW" />
                <cat name="android.intent.category.DEFAULT" />
                <scheme name="http" />
             </filter>
          </item>
       </preferred-activities>
    
  • 通过在<!--AOSP_SOURCE-->/build/target/product/full_base.mk

    中添加以下行,将上面的xml复制到/system/etc/preferred-apps/位置
    PRODUCT_COPY_FILES +=/<location-of-file>/preferred-activities-home.xml:system/etc/preferred-apps/preferred-activities-home.xml
    
  • 构建后,浏览器activity将设置为默认

限制和注意事项

上述过程存在一些限制。它们如下:

  • 在构建时,我们需要知道所有的主要 activity 解决特定意图过滤器的应用程序。
  • 上述过程 不适用于 Launcher 首次启动时。 假定 ResolverActivity 不考虑 启动时的包限制。