Launcher3图标替换不生效问题

在720p屏幕的设备上,修改系统设置应用的mipmap-xhdpi图标后,仅应用信息显示新图标,Launcher3未更新。通过尝试和源码分析,发现Launcher3会根据需求加载不同dpi的图标,导致替换不生效。解决方案是提供所有分辨率的图标或者确保替换特定dpi的图标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题

  • 屏幕为720p,改系统设置应用源码,替换了 mipmap-xhdpi 目录下的 ic_launcher_settings.png,发现在应用信息中图标变成新的了,但是Launcher3中却没有任何变化。

尝试

  • 首先认为 Launcher3 中对设置应用进行了特殊图标替换,因此在res目录下查找,发现没有原设置图标。
  • 是否不是 Launcher3 的特殊设置呢?安装 Launcher2 应用验证一下,发现Launcher2显示了新图标,因此问题还是在 Launcher3中。
  • 只替换了 mipmap-xhdpi 目录的图标,是否Launcher3采用了别的分辨率的图标?查看了源码, 最终确认了问题所在。

原因

  • 首先,看LauncherModel的初始化
// LauncherModel.java
private void loadAllApps() {
   
   
  for (int i = 0; i < apps.size(); i++) {
   
   
    LauncherActivityInfoCompat app = apps.get(i);
    // 这里创建了icon信息
    mBgAllAppsList.add(new AppInfo(mContext, app, user, mIconCache));
  }
}
// AppInfo.java
public AppInfo(Context context, LauncherActivityInfoCompat info, UserHandleCompat user, IconCache iconCache) {
   
   
  this.componentName = info.getComponentName();
  this.container = ItemInfo.NO_ID;

  flags = initFlags
<think>我们正在Android 14 MTK平台上修改Launcher3中应用程序的默认图标。根据之前的讨论,我们知道在Launcher3中,应用图标的显示是通过`BubbleTextView`来处理的。但是,在Android 14的Launcher3中,代码结构可能有所变化,因此我们需要定位到当前版本中负责应用图标绘制的类。 根据引用[2][3]的提示,MTK平台的Launcher3代码位于`vendor/mediatek/proprietary/packages/apps/Launcher3`或类似路径(注意:引用[3]提到了vendor/sprd,但用户指定的是MTK平台,所以我们以MTK路径为准)。同时,引用[3]也提到在安卓14中Launcher3支持两种模式(桌面模式抽屉模式),这可能会影响图标的显示方式。 修改默认图标的主要思路: 1. 找到负责加载显示应用图标的类。在较新的Launcher3版本中,应用图标通常由`BubbleTextView`的子类或类似的自定义TextView来显示,但具体类名可能有所变化。 2. 在加载应用图标时,根据应用的包名(packageName)替换为自定义的图标资源。 根据引用[1]中提到的`BubbleTextView`类,我们可以在MTK平台的Launcher3代码中查找这个类。但是,在Android 14中,Launcher3可能已经重构,因此我们需要确认类的位置名称。 经过分析,在Android 14的Launcher3中,应用图标的视图类通常是`BubbleTextView`(位于`src/com/android/launcher3/icons/BubbleTextView.java`或类似路径)或者是在`src/com/android/launcher3/views`中。但更常见的是,图标加载缓存由`IconCache`类管理,而视图类则负责显示。 因此,我们可以考虑两种方式: 方式一:修改`IconCache`,在获取图标时根据包名返回自定义图标(这样所有使用该缓存的地方都会生效)。 方式二:修改图标视图类(如`BubbleTextView`)的`applyFromApplicationInfo`方法(或类似方法),在设置图标时进行替换。 这里我们采用方式二,因为方式一可能会影响其他地方的图标显示(如文件夹内的图标、小部件预览等),而方式二只影响桌面上的图标。 具体步骤: 1. 找到MTK平台Launcher3的代码路径,例如:`vendor/mediatek/proprietary/packages/apps/Launcher3` 2. 打开负责应用图标显示的视图类:`BubbleTextView.java`(路径可能为:`src/com/android/launcher3/BubbleTextView.java`或`src/com/android/launcher3/views/BubbleTextView.java`) 3. 在`BubbleTextView`中,通常会有一个方法用于设置应用信息,例如`applyFromApplicationInfo`或`applyFromPackageItemInfo`。我们需要在这个方法中判断包名,然后替换图标。 4. 示例代码修改如下: ```java public void applyFromApplicationInfo(AppInfo info) { // 先调用父类或默认方法设置图标文字 super.applyFromApplicationInfo(info); // 根据包名替换图标 if ("com.example.targetapp".equals(info.componentName.getPackageName())) { // 加载自定义图标,这里假设我们有一个drawable资源名为custom_icon setCompoundDrawablesRelativeWithIntrinsicBounds(null, getContext().getDrawable(R.drawable.custom_icon), null, null); } } ``` 但是,注意:在较新的Launcher3中,应用图标可能是通过`setIcon`方法来设置的,因此我们需要查看`BubbleTextView`的具体实现。如果发现`BubbleTextView`中并没有直接设置图标的逻辑,而是通过`setIcon`方法(可能来自基类)来设置,那么我们可以重写`setIcon`方法。 另一种常见情况是,Launcher3使用了`IconCache`来获取图标,然后在`BubbleTextView`中通过`setIcon`方法设置。例如: ```java public void applyFromApplicationInfo(AppInfo info) { // ... 其他代码 setIcon(iconCache.getIcon(info)); // ... } ``` 那么我们可以修改为: ```java public void applyFromApplicationInfo(AppInfo info) { // ... 其他代码 if ("com.example.targetapp".equals(info.componentName.getPackageName())) { setIcon(getContext().getDrawable(R.drawable.custom_icon)); } else { setIcon(iconCache.getIcon(info)); } // ... } ``` 5. 如果希望替换多个应用,可以使用一个数组或Map来存储包名对应的图标资源ID。 6. 另外,我们还需要在`res/drawable`或`res/drawable-xxx`目录下放置自定义的图标资源(例如custom_icon.png),并在R文件中声明(通常会自动生成)。 注意:在Android 14中,Launcher3可能使用了矢量图标,因此建议使用矢量图(VectorDrawable)或者使用多套png资源。 7. 编译并替换Launcher3。 但是,请注意:在MTK平台上,可能需要修改MTK定制的Launcher3部分。根据引用[2],我们注意到在`AllAppsContainerView.java`中也可能有相关逻辑,但通常应用图标在桌面抽屉中的显示都使用相同的视图类(BubbleTextView),所以修改`BubbleTextView`应该是足够的。 另外,引用[3]中提到了桌面模式的配置,但这与图标替换关系不大。 如果上述方法不生效,可能是因为Launcher3的代码结构发生了变化。我们可以尝试在`BubbleTextView`中搜索`setIcon`方法,并查看其调用链,确保我们在正确的位置进行了替换。 另一种情况:在Launcher3中,桌面图标抽屉中的图标可能使用相同的视图类,所以修改`BubbleTextView`会同时影响两者。如果只想替换桌面的图标,则需要判断当前图标所在的容器(是Hotseat还是Workspace,或者是AllApps)。这需要更复杂的判断,比如检查`BubbleTextView`所在的父容器。 总结:在MTK平台的Android 14上,修改Launcher3中应用默认图标的主要步骤是修改`BubbleTextView`中应用图标设置的部分,根据包名替换为自定义图标资源。 由于不同厂商的定制可能不同,以上方法可能需要根据实际情况调整。 相关问题: 1. 如何在Launcher3中为特定应用设置不同的图标? 2. Android 14上Launcher3图标加载流程是怎样的? 3. 如何修改MTK平台Launcher3的默认工作模式(桌面模式或抽屉模式)? 4. Launcher3中如何隐藏特定应用图标? 5. 如何为不同的用户配置文件显示不同的应用图标?</think>在 Android 14 MTK 平台上修改 Launcher3 中应用程序的默认图标,需要修改图标加载逻辑配置文件。以下是详细步骤: ### 1. **修改图标加载逻辑** 在 `BubbleTextView` 类中重写图标加载方法,根据包名替换图标资源: ```java // 文件路径: vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/BubbleTextView.java public void applyFromPackageItemInfo(PackageItemInfo info) { // 替换拨号器图标示例 if ("com.android.dialer".equals(info.packageName)) { Drawable customIcon = getContext().getDrawable(R.drawable.custom_dialer_icon); setCompoundDrawablesWithIntrinsicBounds(null, customIcon, null, null); } // 替换其他应用图标 else if ("com.example.app".equals(info.packageName)) { Drawable customIcon = getContext().getDrawable(R.drawable.custom_app_icon); setCompoundDrawablesWithIntrinsicBounds(null, customIcon, null, null); } // 默认图标逻辑 else { super.applyFromPackageItemInfo(info); } } ``` [^1] ### 2. **添加自定义图标资源** 在 Launcher3 的资源目录添加图标文件: ```bash vendor/mediatek/proprietary/packages/apps/Launcher3/res/ ├── drawable-xxhdpi/ │ ├── custom_dialer_icon.png │ └── custom_app_icon.png └── values/ └── public.xml # 声明资源ID ``` 在 `public.xml` 中声明资源: ```xml <public name="custom_dialer_icon" type="drawable" id="0x7f020XXX" /> <public name="custom_app_icon" type="drawable" id="0x7f020YYY" /> ``` ### 3. **配置桌面模式 (可选)** 修改配置文件设置默认桌面模式: ```xml <!-- 文件路径: vendor/sprd/platform/packages/apps/Launcher3/res_unisoc/values/config_ext.xml --> <string name="default_home_screen_style">single</string> ``` - `dual`: 抽屉模式(应用列表+桌面) - `single`: 纯桌面模式(所有应用在桌面)[^3] ### 4. **过滤特定应用图标** 在应用加载流程中过滤图标: ```java // 文件路径: vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/allapps/AllAppsContainerView.java protected void loadAllApps() { for (AppInfo info : allApps) { // 隐藏系统输入法图标 if (!"com.android.inputmethod.latin".equals(info.componentName.getPackageName())) { filteredApps.add(info); } } bindApps(filteredApps); } ``` [^2] ### 5. **修改默认布局 (可选)** 在 XML 布局中预设图标位置: ```xml <!-- 文件路径: vendor/mediatek/proprietary/packages/apps/Launcher3/res/xml/default_workspace.xml --> <favorite launcher:packageName="com.android.dialer" launcher:screen="0" launcher:x="1" launcher:y="3" /> ``` ### 编译与验证 1. 执行 MTK 平台编译命令: ```bash source build/envsetup.sh lunch full_<project>-userdebug make Launcher3 -j8 ``` 2. 刷机后验证: - 目标应用图标应显示为自定义图标 - 过滤的应用不应出现在桌面或抽屉 > ⚠️ 注意:不同 MTK 平台版本路径可能有差异,请根据实际代码结构调整路径。修改前备份原始文件。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值