Android 8.1 去掉 Launcher3 默认给 icon 增加的白边
android的新特性,目前定制后已将此功能关闭,但是chrome始终有白色的一圈,定位在chrome apk自己的android:icon资源就是如此,由此引发出与其他的apk图标风格不一致,看起来别扭,就想从launcher替换一下。
参考:
Android P 上Launcher3 中实现两种方式替换桌面图标
由于安装和预置在显示桌面图标的代码不同,所以通过trace代码,找到了公共必走的路径:
packages/apps/Launcher3/src/com/android/launcher3/graphics/LauncherIcons.java
/**
* Returns a bitmap suitable for the all apps view. The icon is badged for {@param user}.
* The bitmap is also visually normalized with other icons.
*/
public static Bitmap createBadgedIconBitmap(
Drawable icon, UserHandle user, Context context, int iconAppTargetSdk) {
...
}
然后定位到拿图的地方:
packages/apps/Launcher3/src/com/android/launcher3/IconCache.java
public Drawable getFullResIcon(LauncherActivityInfo info, boolean flattenDrawable) {
return mIconProvider.getIcon(info, mIconDpi, flattenDrawable);
}
由此根据参考链接开始深度定制:
Index: packages/apps/Launcher3/res/mipmap-hdpi/com_android_chrome.png
===================================================================
无法显示: 文件标记为二进制类型。
svn:mime-type = application/octet-stream
Index: packages/apps/Launcher3/res/mipmap-hdpi/com_android_chrome.png
===================================================================
--- packages/apps/Launcher3/res/mipmap-hdpi/com_android_chrome.png (版本 0)
+++ packages/apps/Launcher3/res/mipmap-hdpi/com_android_chrome.png (工作副本)
属性改变: packages/apps/Launcher3/res/mipmap-hdpi/com_android_chrome.png
___________________________________________________________________
Index: packages/apps/Launcher3/src/com/android/launcher3/IconCache.java
===================================================================
--- packages/apps/Launcher3/src/com/android/launcher3/IconCache.java (版本 1588)
+++ packages/apps/Launcher3/src/com/android/launcher3/IconCache.java (工作副本)
@@ -176,9 +176,23 @@
}
public Drawable getFullResIcon(LauncherActivityInfo info, boolean flattenDrawable) {
+ int resId = getReplaceIconResByPackageName(info);
+ if (resId != 0) {
+ return mContext.getDrawable(resId);
+ }
return mIconProvider.getIcon(info, mIconDpi, flattenDrawable);
}
+ private int getReplaceIconResByPackageName(LauncherActivityInfo info) {
+ String iconName = info.getComponentName().getPackageName().toLowerCase().replace(".", "_");
+ int identifier = mContext.getResources().getIdentifier(iconName, "mipmap", mContext.getPackageName());
+ return identifier;
+ }
+
protected Bitmap makeDefaultIcon(UserHandle user) {
Drawable unbadged = getFullResDefaultActivityIcon();
return LauncherIcons.createBadgedIconBitmap(unbadged, user, mContext, Build.VERSION_CODES.O);
patch中的资源文件com_android_chrome.png是通过阿里巴巴矢量图标库获取的。
另外需要特别注意的是,资源的格式:
我本想直接用包名com.xxx.xxx将资源放在mipmap文件夹下,通过getIdentifier获取资源号,但是始终是0,尝试将“.”换成“_”就OK了。
Android开发之——使用getIdentifier()方法根据资源名来获取资源id
代码就需要加上toLowerCase().replace(".", "_")
即可。