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);
中会执行到 LauncherProvider
的loadDefaultFavoritesIfNecessary
方法 如果partner
不为null
,就会去解析 partner_default_layout.xml
。其实就是去匹配符合 action
为 com.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;
}