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;
}
相关推荐
工程师老罗7 小时前
如何在Android工程中配置NDK版本
android
Libraeking10 小时前
破壁行动:在旧项目中丝滑嵌入 Compose(混合开发实战)
android·经验分享·android jetpack
市场部需要一个软件开发岗位10 小时前
JAVA开发常见安全问题:Cookie 中明文存储用户名、密码
android·java·安全
JMchen12312 小时前
Android后台服务与网络保活:WorkManager的实战应用
android·java·网络·kotlin·php·android-studio
crmscs13 小时前
剪映永久解锁版/电脑版永久会员VIP/安卓SVIP手机永久版下载
android·智能手机·电脑
localbob13 小时前
杀戮尖塔 v6 MOD整合版(Slay the Spire)安卓+PC端免安装中文版分享 卡牌肉鸽神作!杀戮尖塔中文版,电脑和手机都能玩!杀戮尖塔.exe 杀戮尖塔.apk
android·杀戮尖塔apk·杀戮尖塔exe·游戏分享
机建狂魔13 小时前
手机秒变电影机:Blackmagic Camera + LUT滤镜包的专业级视频解决方案
android·拍照·摄影·lut滤镜·拍摄·摄像·录像
hudawei99613 小时前
flutter和Android动画的对比
android·flutter·动画
lxysbly15 小时前
md模拟器安卓版带金手指2026
android
儿歌八万首16 小时前
硬核春节:用 Compose 打造“赛博鞭炮”
android·kotlin·compose·春节