【RK3288 Android6 T8, 突然无声音问题排查】

文章目录

  • 【RK3288 Android6 T8, 突然无声音问题排查】
    • 问题描述
    • 问题调查
    • patch

【RK3288 Android6 T8, 突然无声音问题排查】

问题描述

页面上方突然出现音量进度条,小铃铛图标显示静音状态,不再播报语音
手动去安卓设置内查看,小铃铛音量为0,手动恢复到有声音后继续执行送餐任务
然后下次任务在取餐页时页面上方又突然出现音量进度条显示为静音状态,无语音播报

问题调查

查看日志,可以发现,在随机出现静音的时候,会有这样的日志
在这里插入图片描述
通过查找到源码,并在该处添加打印调用栈的日志,并再一次复现

From 6162a8571f4ebbb9e27f3246630afe1f3899a079 Mon Sep 17 00:00:00 2001
From: liangji <liangji@keenon.com>
Date: Wed, 6 Dec 2023 18:45:55 +0800
Subject: [PATCH] feat: add debug info of audio mute_changeChange-Id: Id0697008aab0c8dc9ef4f6141ff2e3d979dfb8df
Signed-off-by: liangji <liangji@keenon.com>
---packages/SystemUI/src/com/android/systemui/volume/Events.java | 9 +++++++++1 file changed, 9 insertions(+)diff --git a/packages/SystemUI/src/com/android/systemui/volume/Events.java b/packages/SystemUI/src/com/android/systemui/volume/Events.java
index 893c939..d9f0ccc 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/Events.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/Events.java
@@ -145,6 +145,15 @@ public class Events {case EVENT_MUTE_CHANGED:sb.append(AudioSystem.streamToString((Integer) list[0])).append(' ').append(list[1]);
+
+                StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
+
+                System.out.println("Method Call Stack:");
+                for (StackTraceElement element : stackTrace) {
+                    System.out.println(element.getClassName() + "." + element.getMethodName()
+                            + "(" + element.getFileName() + ":" + element.getLineNumber() + ")");
+                }
+break;case EVENT_KEY:MetricsLogger.action(context, MetricsLogger.ACTION_VOLUME_KEY,
-- 
2.7.4

复现了之后,查看logcat,可以发现是接收到了广播来禁音,(至少肯定不是系统的bug)。

后续又想着可以通过dumpsys 来记录开机之后所有的广播时间,这样就可以知道这个广播是谁发出来的了

From d77e450a8a4477306e7fe8650f8b5f25fe5732c8 Mon Sep 17 00:00:00 2001
From: liangji <liangji@keenon.com>
Date: Sat, 9 Dec 2023 11:48:20 +0800
Subject: [PATCH] feat: support print broadcast package nameChange-Id: Iadc8e0f877b3599181b8ec5b37d08b7a35dcd367
Signed-off-by: liangji <liangji@keenon.com>
---.../systemui/volume/VolumeDialogController.java    | 59 +++++++++++++++++++++-1 file changed, 58 insertions(+), 1 deletion(-)diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogController.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogController.java
index 32d6805..fa1f7bd 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogController.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogController.java
@@ -756,6 +756,54 @@ public class VolumeDialogController {}}+    /*keenon liangji add */
+    private static String exec(String command) {
+        Process process = null;
+        try {
+            process = Runtime.getRuntime().exec(command);
+        } catch (IOException ex) {
+            ex.printStackTrace();
+        } //adb shell
+//        final BufferedWriter outputStream = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
+        final BufferedReader inputStream = new BufferedReader(new InputStreamReader(process.getInputStream()));
+        //杩欓噷涓€瀹氳娉ㄦ剰閿欒娴佺殑璇诲彇锛屼笉鐒跺緢瀹规槗闃诲锛屽緱涓嶅埌浣犳兂瑕佺殑缁撴灉锛?+        final BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
+        final Process finalProcess = process;
+        new Thread(new Runnable() {
+            public void run() {
+                String line;
+                boolean castFlag = false;
+                String[] info;
+                try {
+                    while ((line = inputStream.readLine()) != null) {
+                        if (line.contains(ACTIONTAG)) {
+                            castFlag = line.contains(CAST);
+                        }
+                        if (castFlag && line.contains(CALLERTAG)) {
+                            line = line.trim();
+                            info = line.split(" ");
+                            for (String i: info)
+                                Log.d(TAG, "run: " + i);
+                            Log.d(TAG, "packageName: " + info[0].substring(CALLERTAG.length()));
+                            finalProcess.destroy();
+                            break;
+                        }
+                    }
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }).start();
+        try {
+            process.waitFor();
+        } catch (InterruptedException ex) {
+            ex.printStackTrace();
+        }
+        return null;
+    }
+    /*keenon liangji add end*/
+
+private final class Receiver extends BroadcastReceiver {public void init() {
@@ -811,7 +859,16 @@ public class VolumeDialogController {final int stream = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, -1);final boolean muted = intent.getBooleanExtra(AudioManager.EXTRA_STREAM_VOLUME_MUTED, false);
-                if (D.BUG) Log.d(TAG, "onReceive STREAM_MUTE_CHANGED_ACTION stream=" + stream
+                /*keenon liangji add */
+                Thread thread = new Thread(new Runnable() {
+                    @Override
+                    public void run() {
+                        exec("dumpsys activity broadcasts");
+                    }
+                });
+                thread.start();
+                /*keenon liangji add end*/
+                if (1) Log.d(TAG, "onReceive STREAM_MUTE_CHANGED_ACTION stream=" + stream+ " muted=" + muted);changed = updateStreamMuteW(stream, muted);} else if (action.equals(NotificationManager.ACTION_EFFECTS_SUPPRESSOR_CHANGED)) {
-- 
2.7.4

实际上后来并没有把这个dumpsys的日志加到源码里面,而是直接等待复现后执行dumpsys activity broadcast来查看就行了。

但是在等待复现的过程中,蒋工发现在dts里面有一个功能按键的码值和静音建的码值相同。因此怀疑是否是因为这个recovery按键导致的。

通过按下recovery按键后,这个日志和现象与测试所说的完全符合。因此,后来只是做这样的修复,并且测试后再也没有出现。

patch

From b012b4d5e61cab40b472fa44b012b9d4ec63c41f Mon Sep 17 00:00:00 2001
From: liangji <liangji@keenon.com>
Date: Tue, 12 Dec 2023 15:51:00 +0800
Subject: [PATCH] fix: disabled recovery key_muteChange-Id: I67f2fd680df216fe7749f0e43326101f0a04109b
Signed-off-by: liangji <liangji@keenon.com>
---arch/arm/boot/dts/rk3288-tb_8846.dts | 5 +++++1 file changed, 5 insertions(+)diff --git a/arch/arm/boot/dts/rk3288-tb_8846.dts b/arch/arm/boot/dts/rk3288-tb_8846.dts
index c4fcd7d..a6b8ee2 100644
--- a/arch/arm/boot/dts/rk3288-tb_8846.dts
+++ b/arch/arm/boot/dts/rk3288-tb_8846.dts
@@ -634,11 +634,16 @@label = "power";gpio-key,wakeup;};
+		/*
+		 * disable recovery KEY_MUTE
+		 *recovery-key {linux,code = <113>;label = "recovery";rockchip,adc_value = <4>;};
+		*/
+/*menu-key {linux,code = <59>;
-- 
2.7.4

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/454971.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【el-tree 文字过长处理方案】

文字过长处理方案 一、示例代码二、关键代码三、效果图 一、示例代码 <divstyle"height: 600px;overflow: auto"class"text item"><el-treeref"tree":data"treeData":props"defaultProps"class"filter-tree&…

活字格V9 嵌入的html与活字格页面数据交互

不想看分析请直接跳到解决方案 项目场景&#xff1a; 活字格V9 嵌入的html与活字格页面的数据交互&#xff08;传值&#xff09;&#xff0c;嵌入的html用了WebSocket来控制硬件&#xff0c;获取的数据无法回传到活字格页面上&#xff0c;且嵌入的html无法使用活字格内置的js及…

Oracle数据表ID自增操作

一、Oracle ID自增长功能介绍 Oracle数据库默认不支持像 SQLServer、MySQL中的自增长&#xff08;auto increment&#xff09;功能&#xff0c;即自动为每一行记录的自增长字段生成下一个值。 二、Oracle ID自增长方法 第一种&#xff0c;通过序列&#xff08;sequence&#…

c++之说_10|自定义类型 union 联合体

之前我们说了一些 struct 结构体 现在来了解新的自定义类型 union 联合体 语法 union ptr {void* fptr;CLassFunPtr p;FunPtr p2;ptr& operator(CLassFunPtr ptr){p ptr;return *this;}ptr& operator(FunPtr Fptr){p2 Fptr;return *this;} } FunPtr_; 我们看到了…

【技能树学习】Git入门——练习题解析

前言 本篇文章给出了Git入门技能树中部分的练习题解析&#xff0c;包括分支管理&#xff0c;Git标签&#xff0c;在Mac和Windows上使用GitVSCode的步骤。强调了git cherry-pick不直接支持从标签中选择提交&#xff0c;git tag -d只能删除本地标签&#xff0c;Mac系统的终端可以…

【产品升级】SmartPipe升级到版本2.0

在近一个月的攻关和测试下&#xff0c;SmartPipe软件轴线自动识别算法的性能大幅提升&#xff0c;鲁棒性和稳定性进一步增强。近一年来客户累计反馈的多种复杂管路&#xff08;包括带有支管管路、带有压瘪段管路、推弯管、装配管、带有复杂孔洞管路等&#xff09;现在均能够正确…

离散数学——图论(笔记及思维导图)

离散数学——图论&#xff08;笔记及思维导图&#xff09; 目录 大纲 内容 参考 大纲 内容 参考 笔记来自【电子科大】离散数学 王丽杰

Antd+React+react-resizable实现表格拖拽功能

1、先看效果 2、环境准备 "dependencies": {"antd": "^5.4.0","react-resizable": "^3.0.4",},"devDependencies": {"types/react": "^18.0.33","types/react-resizable": "^…

Excel——高级筛选匹配条件提取数据

一、筛选多条件 Q&#xff1a;筛选多个条件&#xff0c;并将筛选出的内容复制到其他区域 点击任意一个单元格 点击【数据】——【筛选】——【高级筛选】 选择【将筛选结果复制到其他位置】——在【列表区域】 鼠标选择对应的区域位置&#xff0c;条件区域一定要单独写出来&a…

JVM 性能调优 - Java 虚拟机内存体系(1)

Java 虚拟机我们简称为 JVM&#xff08;Java Virtual Machine&#xff09;。 Java 虚拟机在执行 Java 程序的过程中&#xff0c;会管理几个不同的数据区域。如下图所示&#xff1a; 下面我会介绍这几个数据区的特点。 堆 堆区的几个特点&#xff1a; 线程共享。启动时创建堆…

L1-009 N个数求和-java

输入样例1&#xff1a; 5 2/5 4/15 1/30 -2/60 8/3输出样例1&#xff1a; 3 1/3输入样例2&#xff1a; 2 4/3 2/3输出样例2&#xff1a; 2输入样例3&#xff1a; 3 1/3 -1/6 1/8输出样例3&#xff1a; 7/24 这是使用递归的另一种计算最大公约数的方法。 如果 b 为0&#…

【从0上手Cornerstone3D】如何使用CornerstoneTools中的工具之同步器

同步器&#xff08;Synchronizers&#xff09;可以使多个视图同步响应同一个工具的操作&#xff0c;例如我们在MPR视图下&#xff0c;同步操作三个视图的缩放程度、windowLevel等等 一个同步器必须需要以下几个部分才可以执行 一个监听事件&#xff08;什么情况下触发同步&…