Android Framework-Launcher-Partner

Partner是什么呢? 嗯 很好,鉴于我贫瘠的文学功底,我借鉴了一下AI的文本。

Partner 机制是一种允许设备制造商(OEM)、运营商或其他合作伙伴通过标准化方式定制和扩展 Android 系统功能的框架。它主要用于在不直接修改 AOSP 核心代码的前提下,实现厂商特定的定制需求,同时保持系统的兼容性和可维护性。

好的,说人话,就是你可以通过覆盖的方式,达到修改Laucher布局的效果。

实现方法

  • 编写一个BroadcastReceiver
java 复制代码
public  class LauncherPartner extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {

    }
}
  • AndroidMainfest.xml里添加
xml 复制代码
<receiver
            android:name=".LauncherPartner"
            android:exported="true">
            <intent-filter>
                <action android:name="com.android.launcher3.action.PARTNER_CUSTOMIZATION" />
            </intent-filter>
        </receiver>

res/xml包下下构建 partner_default_layout.xml

xml 复制代码
<?xml version="1.0" encoding="utf-8"?>

<favorites  xmlns:launcher="http://schemas.android.com/apk/res-auto">


    <appwidget

        className="com.android.alarmclock.DigitalAppWidgetProvider"
        packageName="com.android.deskclock"
        screen="0"
        spanX="2"
        spanY="2"
        x="3"
        y="0"


        />

    <favorite

        className="com.android.settings.Settings"
        packageName="com.android.settings"
        screen="0"
        spanX="1"
        spanY="1"
        x="4"
        y="4"

        />
    <favorite

        className="com.android.settings.Settings"
        packageName="com.android.settings"
        screen="0"
        spanX="1"
        spanY="1"
        x="4"
        y="3"

        />
    <favorite
        className="com.android.settings.Settings"
        packageName="com.android.settings"
        screen="1"
        spanX="1"
        spanY="1"
        x="3"
        y="2"

        />

    <folder
        screen="0"
        title="test"
        x="0"
        y="3">
        <favorite
            className="com.android.settings.Settings"
            packageName="com.android.settings"/>


        <favorite
            className="com.android.settings.Settings"
            packageName="com.android.settings"/>

        <favorite
            className="com.android.settings.Settings"
            packageName="com.android.settings"/>


        <favorite
            className="com.android.settings.Settings"
            packageName="com.android.settings"/>

    </folder>


    <favorite
        className="com.android.settings.Settings"
        packageName="com.android.settings"
        x="0"
        y="0"
        screen="0"
        container="-101"
       />

    <favorite
        className="com.android.settings.Settings"
        packageName="com.android.settings"
        container="-101"
        screen="1"
        x="1"
        y="0" />

    <favorite
        className="com.android.settings.Settings"
        packageName="com.android.settings"
        container="-101"
        screen="2"
        x="2"
        y="0" />

</favorites>

然后构建apk 或者直接编译到系统中就可以了。

原理解析

Android Framework-Launcher-默认布局的加载 在调用 loadWorkspace方法里

java 复制代码
LauncherSettings.Settings.call(contentResolver,
        LauncherSettings.Settings.METHOD_LOAD_DEFAULT_FAVORITES);

中会执行到 LauncherProviderloadDefaultFavoritesIfNecessary 方法 如果partner 不为null,就会去解析 partner_default_layout.xml。其实就是去匹配符合 actioncom.android.launcher3.action.PARTNER_CUSTOMIZATION的系统apk

java 复制代码
//packages/apps/Launcher3/src/com/android/launcher3/LauncherProvider.java

public static final String RES_PARTNER_DEFAULT_LAYOUT = "partner_default_layout";
loadDefaultFavoritesIfNecessary(){


if (loader == null) {
    final Partner partner = Partner.get(getContext().getPackageManager());
    if (partner != null) {
        int workspaceResId = partner.getXmlResId(RES_PARTNER_DEFAULT_LAYOUT);
        if (workspaceResId != 0) {
            loader = new DefaultLayoutParser(getContext(), widgetHolder,
                    mOpenHelper, partner.getResources(), workspaceResId);
        }
    }
}
}
  • Partner
java 复制代码
private static final String
        ACTION_PARTNER_CUSTOMIZATION = "com.android.launcher3.action.PARTNER_CUSTOMIZATION";
public static Partner get(PackageManager pm) {
    return get(pm, ACTION_PARTNER_CUSTOMIZATION);
}

public static Partner get(PackageManager pm, String action) {
    Pair<String, Resources> apkInfo = findSystemApk(action, pm);
    return apkInfo != null ? new Partner(apkInfo.first, apkInfo.second) : null;
}
相关推荐
liang_jy4 小时前
Android View Tag
android
liang_jy5 小时前
Android 架构中的统一分发与策略路由
android·架构
scan7247 小时前
长期记忆存储在数据库里
android
xingpanvip7 小时前
星盘接口开发文档:星相日历接口指南
android·开发语言·前端·css·php·lua
儿歌八万首10 小时前
Jetpack Compose 实战:实现一个动态平滑折线图
android·折线图·compose
李艺为14 小时前
Fake Device Test作假屏幕分辨率分析
android·java
zh_xuan14 小时前
github远程library仓库升级
android·github
峥嵘life14 小时前
Android蓝牙停用绝对音量原理
android
czlczl2002092515 小时前
IN和BETWEEN在索引效能的区别
android·adb
Volunteer Technology15 小时前
ES高级搜索功能
android·大数据·elasticsearch