Android 8.1.0 Launcher3 修改之 - 改变系统默认 Notification Badge color

本文详细介绍了如何在Android8.1.0系统中将默认的NotificationBadge颜色从蓝绿色更改为红色。通过修改系统源码和Launcher3的资源文件,成功实现了颜色定制。
部署运行你感兴趣的模型镜像

今天,接到这么一个需求:

Need to change the notification color on the top right of the icons, right now it is a green blue color, let's change it to #FC3D30 as a red dot.

意思很清楚:当前 Android 8.1.0 版本的系统默认 Notification Badge color 是蓝绿色的,现在客户想把它改成红色(#FFFC3D30 )的。

先看一眼修改之前的颜色(其实我觉得还可以...):

接下来,Change it.

首先找到 IconDrawableFactory.java,所在路径:

Code/frameworks/base/core/java/android/util/IconDrawableFactory.java

在这个类里面,可以看到系统对默认 Notification Badge color 的引用:

    // Should have enough colors to cope with UserManagerService.getMaxManagedProfiles()
    @VisibleForTesting
    public static final int[] CORP_BADGE_COLORS = new int[] {
            com.android.internal.R.color.profile_badge_1,
            com.android.internal.R.color.profile_badge_2,
            com.android.internal.R.color.profile_badge_3
    };

哇,我们好厉害,一下就找到了系统源码中对默认 Notification Badge color 的引用!

额,其实不是的,找到这个地方,费了一些时间的...

找到了颜色引用,那在哪里声明的这几个颜色呢?

执行:find .|xargs grep -ri "profile_badge_1",找到:

Code/frameworks/base/core/res/res/values/colors.xml

    <!-- Default profile badge colors -->
    <color name="profile_badge_1">#ffff6d00</color><!-- Orange -->
    <color name="profile_badge_2">#ff000000</color><!-- Black -->
    <color name="profile_badge_3">#ff22f033</color><!-- Green -->

发现,现在默认的应用的 Notification Badge color 可不就是绿色(#ff22f033)的嘛,话不多说,在colors.xml 中添加上我们的颜色:

    <color name="profile_badge_4">#FFFC3D30</color><!-- Red -->

然后,在 IconDrawableFactory.java 中,修改所有的颜色为 profile_badge_4

    @VisibleForTesting
    public static final int[] CORP_BADGE_COLORS = new int[] {
            com.android.internal.R.color.profile_badge_4,
            com.android.internal.R.color.profile_badge_4,
            com.android.internal.R.color.profile_badge_4,
            com.android.internal.R.color.profile_badge_4
    };

记住,这个时候不能只是修改这两个地方,否则会报错:

frameworks/base/core/java/android/util/IconDrawableFactory.java:104: error: cannot find symbol
            com.android.internal.R.color.profile_badge_4,
                                        ^
  symbol:   variable profile_badge_4
  location: class color

还得在

Code/frameworks/base/core/res/res/values/symbols.xml

中添加:

<java-symbol type="color" name="profile_badge_4" />

这样编译时才认识这个 profile_badge_4 是个什么鬼东西。

修改完这三个地方,编译,刷机,验证。发现:

我擦,什么鬼,这是啥情况,为什么没有修改过来。

一定是逻辑没有捋清楚,再重新看一下这个工厂类。

-------------------------------------------  重新查看 -------------------------------------------

后来在这个工厂类 IconDrawableFactory.java 中添加了日志,发现在执行下面程序时,无论是对于Google 原生应用还是 QQ :

    public Drawable getBadgedIcon(PackageItemInfo itemInfo, ApplicationInfo appInfo,
            @UserIdInt int userId) {
        Log.d(TAG, " --- IconDrawableFactory-- 0000000000000000,itemInfo is: " + itemInfo + " ; appInfo is " + appInfo + " ; userId is " + userId );
        Drawable icon = mPm.loadUnbadgedItemIcon(itemInfo, appInfo);
        Log.d(TAG, " --- IconDrawableFactory-- 11111111111111,icon is: " + icon);
        if (!mEmbedShadow && !needsBadging(appInfo, userId)) {
            Log.d(TAG, " --- IconDrawableFactory-- 22222222222222,icon is: " + icon);
            return icon;
        }

        icon = getShadowedIcon(icon);
        Log.d(TAG, " --- IconDrawableFactory-- 33333333333333,icon is: " + icon);
        if (appInfo.isInstantApp()) {
            int badgeColor = Resources.getSystem().getColor(
                    com.android.internal.R.color.instant_app_badge, null);
            icon = mLauncherIcons.getBadgedDrawable(icon,
                    com.android.internal.R.drawable.ic_instant_icon_badge_bolt,
                    badgeColor);
            Log.d(TAG, " --- IconDrawableFactory-- 444444444444444,icon is: " + icon);
        }
        if (mUm.isManagedProfile(userId)) {
            icon = mLauncherIcons.getBadgedDrawable(icon,
                    com.android.internal.R.drawable.ic_corp_icon_badge_case,
                    getUserBadgeColor(mUm, userId));
            Log.d(TAG, " --- IconDrawableFactory-- 5555555555555555,icon is: " + icon);
        }
        Log.d(TAG, " --- IconDrawableFactory-- 666666666666666666,icon is: " + icon);
        return icon;
    }

只打印出了:

--- IconDrawableFactory-- 111111111111111111

--- IconDrawableFactory-- 3333333333333333

--- IconDrawableFactory-- 6666666666666666

现在好像没什么线索了。但是还有一个思路,用拾色器查看这个小点的颜色值,在系统中查找这个色值(后来事实证明,发现截屏之后,截图中 Notification dot 的颜色会发生变化,所以使用拾色器进行颜色定位的方式不可取)。但是,无论是 #2BE8B9 还是 #2CE8B9 都在系统中没找到。。。

那。。这个资源是不是定义到了 Launcher3 的资源文件中了?查看 Launcher3 的colors.xml 文件,果然发现:

    <!-- Popup container -->
    <color name="notification_icon_default_color">#757575</color> <!-- Gray 600 -->
    <color name="badge_color">#1DE9B6</color> <!-- Teal A400 -->
    <color name="folder_badge_color">#1DE9B6</color> <!-- Teal A400 -->

这个地方就是我们需要修改的,改为下面:

    <!-- Change the default notification badge color from #1DE9B6 to #FC3D30.  -->
    <color name="badge_color">#FC3D30</color>
    <color name="folder_badge_color">#FC3D30</color>

好了,编译Launcher3.apk ,并且编译 rom 进行刷机,安装第三方应用查看效果,前后对比图如下:

 

修改之前

 

修改之后

 

至此,成功的完成了在 Android 8.1.0 版本的系统中把默认 Notification Badge color 从蓝绿色改成红色。

 

另外,稍后补上 IconDrawableFactory.java 中,设置Notification dot 的流程是啥。

 

 

 

您可能感兴趣的与本文相关的镜像

Llama Factory

Llama Factory

模型微调
LLama-Factory

LLaMA Factory 是一个简单易用且高效的大型语言模型(Large Language Model)训练与微调平台。通过 LLaMA Factory,可以在无需编写任何代码的前提下,在本地完成上百种预训练模型的微调

<think>我们注意到用户补充了信息:PID文件路径为`/usr/local/mysql-8.1.0/data/sibas-dev-02.pid`没有找到,但是存在`/usr/local/mysql-8.1.0/data/sibas-dev-02.err`。这进一步确认了PID文件缺失的问题,同时错误日志文件存在,我们可以利用错误日志来诊断问题。 ### 问题分析 1. **PID文件缺失**:MySQL服务在启动时无法创建或找到PID文件。可能原因包括: - 配置文件(如`my.cnf`)中指定的`pid-file`路径不正确。 - MySQL进程没有权限在指定目录创建文件(权限问题)。 - 磁盘空间不足或文件系统错误。 2. **错误日志的存在**:`sibas-dev-02.err`文件是MySQL的错误日志,它记录了启动失败的具体原因。因此,查看这个日志文件是解决问题的关键。 ### 解决步骤 1. **查看错误日志**: 使用命令查看错误日志的最后几行,以获取启动失败的详细信息: ```bash tail -100 /usr/local/mysql-8.1.0/data/sibas-dev-02.err ``` 常见的错误可能有: - 配置文件语法错误 - 数据目录权限问题 - InnoDB初始化失败 - 端口冲突 2. **检查配置文件**: 确保`my.cnf`(通常在`/etc/my.cnf`或`/etc/mysql/my.cnf`)中的`pid-file`设置正确,并且指向的路径是MySQL有权限写入的。例如: ``` [mysqld] pid-file = /usr/local/mysql-8.1.0/data/sibas-dev-02.pid ``` 同时,检查`datadir`等配置是否正确。 3. **修复权限问题**: 如果日志中提示权限问题,需要确保MySQL用户(通常是`mysql`)对数据目录有完整的权限: ```bash chown -R mysql:mysql /usr/local/mysql-8.1.0/data chmod -R 755 /usr/local/mysql-8.1.0/data ``` 4. **检查磁盘空间**: 使用`df -h`命令检查磁盘空间,确保有足够的空间。 5. **尝试手动启动**: 在修复配置和权限后,尝试手动启动MySQL服务,并观察输出: ```bash /usr/local/mysql-8.1.0/bin/mysqld --defaults-file=/etc/my.cnf --console ``` 如果启动成功,则按`Ctrl+C`停止,然后使用`service mysqld start`启动服务。 ### 注意事项 - 如果错误日志显示InnoDB表空间损坏,可能需要恢复备份或进行修复。 - 如果之前MySQL没有正常关闭,可能存在一个未结束的进程占用了数据文件,需要先结束该进程。 ### 如果上述步骤无效 - 考虑备份数据目录,然后重新初始化MySQL(注意:这会重置系统表,谨慎操作): ```bash /usr/local/mysql-8.1.0/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql-8.1.0 --datadir=/usr/local/mysql-8.1.0/data ``` 初始化后,会生成一个临时密码,需要查看错误日志获取。 §§相关问题§§ 1. 如何查看MySQL错误日志文件以诊断启动问题? 2. 如何修改MySQL配置文件中的pid-file路径? 3. 如何解决MySQL数据目录的权限问题? 4. 磁盘空间不足如何影响MySQL服务启动? 5. 如何手动初始化MySQL的数据目录?</think>### 问题分析与解决方案 您确认了 `/usr/local/mysql-8.1.0/data/sibas-dev-02.pid` 文件不存在,但存在错误日志文件 `sibas-dev-02.err`。这表明 MySQL 服务在尝试启动时未能创建 PID 文件,但生成了错误日志。以下是关键步骤: #### 1. **检查错误日志(首要步骤)** ```bash tail -100 /usr/local/mysql-8.1.0/data/sibas-dev-02.err ``` 错误日志会明确显示启动失败原因,常见问题包括: - 配置文件语法错误 - 数据目录损坏 - InnoDB 表空间问题 - 内存不足 #### 2. **验证 PID 文件路径配置** 在 `my.cnf` 中检查配置: ```bash grep "pid-file" /etc/my.cnf ``` 确保配置正确(示例): ```ini [mysqld] pid-file = /usr/local/mysql-8.1.0/data/sibas-dev-02.pid ``` #### 3. **修复目录权限** ```bash chown -R mysql:mysql /usr/local/mysql-8.1.0/data chmod 750 /usr/local/mysql-8.1.0/data touch /usr/local/mysql-8.1.0/data/sibas-dev-02.pid chown mysql:mysql /usr/local/mysql-8.1.0/data/sibas-dev-02.pid ``` #### 4. **常见错误日志解决方案** - **表空间损坏**: ```bash /usr/local/mysql-8.1.0/bin/mysqld --innodb_force_recovery=1 ``` 启动后立即导出数据,重装 MySQL - **内存不足**: 在 `my.cnf` 中调低 `innodb_buffer_pool_size` - **配置文件错误**: 使用 `mysqld --verbose --help` 检查配置有效性 #### 5. **强制清理并重启** ```bash rm -f /usr/local/mysql-8.1.0/data/*.pid killall mysqld /usr/local/mysql-8.1.0/bin/mysqld_safe --defaults-file=/etc/my.cnf & ``` > **提示**:如果错误日志显示 "InnoDB: Database was not shut down normally",需执行 InnoDB 恢复模式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值