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;
}
相关推荐
maki0775 小时前
VR大空间资料 03 —— VRGK使用体验和源码分析
android·vr·虚幻·源码分析·oculus·htc vive·vrgk
white-persist7 小时前
【burp手机真机抓包】Burp Suite 在真机(Android and IOS)抓包手机APP + 微信小程序详细教程
android·前端·ios·智能手机·微信小程序·小程序·原型模式
安卓AndroidQ7 小时前
Android Studio 代码混淆核心解释
android·ide·android studio
qq_7391753697 小时前
Android Studio 实现四则运算+开方+倒数简易计算器
android·python·android studio
就叫飞六吧7 小时前
Android studio -kt构建一个app
android·ide·android studio
qluka9 小时前
Android 窗口结构(三) Home Task 添加Home ActivityRecord
android·开发语言
灿烂阳光g9 小时前
App进程是如何从Zygote中fork出来的
android
谢语花9 小时前
【VS2022】LNK assimp64.lib找不到文件_openframework
android·运维·服务器
model20059 小时前
Android 配置多个 cmake
android
教程分享大师10 小时前
【升级安卓9教程】华为Q21_Q21A_Q21C_Q21AQ_Q21AE_hi3798mv200线刷烧录包带adb权限
android·adb