Android12之service调试(一百五十二)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

1.前言

本篇目的:掌握service调试方法解决疑难问题。

2.调试

<1>.service命令

# service                                                                                                                                                                                                                  
Usage: service [-h|-?]service listservice check SERVICEservice call SERVICE CODE [i32 N | i64 N | f N | d N | s16 STR | null | fd f | nfd n | afd f ] ...
Options:i32: Write the 32-bit integer N into the send parcel.i64: Write the 64-bit integer N into the send parcel.f:   Write the 32-bit single-precision number N into the send parcel.d:   Write the 64-bit double-precision number N into the send parcel.s16: Write the UTF-16 string STR into the send parcel.null: Write a null binder into the send parcel.fd: Write a file descriptor for the file f to the send parcel.nfd: Write file descriptor n to the send parcel.afd: Write an ashmem file descriptor for a region containing the data from file f to the send parcel.

<1>.service给"audio"服务发送交互命令

1.frameworks/native/include/audiomanager/IAudioManager.h

class IAudioManager : public IInterface
{
public:// These transaction IDs must be kept in sync with the method order from// IAudioService.aidl.enum {TRACK_PLAYER                          = IBinder::FIRST_CALL_TRANSACTION, //=1PLAYER_ATTRIBUTES                     = IBinder::FIRST_CALL_TRANSACTION + 1,PLAYER_EVENT                          = IBinder::FIRST_CALL_TRANSACTION + 2,RELEASE_PLAYER                        = IBinder::FIRST_CALL_TRANSACTION + 3,TRACK_RECORDER                        = IBinder::FIRST_CALL_TRANSACTION + 4,RECORDER_EVENT                        = IBinder::FIRST_CALL_TRANSACTION + 5,RELEASE_RECORDER                      = IBinder::FIRST_CALL_TRANSACTION + 6,PLAYER_SESSION_ID                     = IBinder::FIRST_CALL_TRANSACTION + 7,};DECLARE_META_INTERFACE(AudioManager)// The parcels created by these methods must be kept in sync with the// corresponding methods from IAudioService.aidl and objects it imports.virtual audio_unique_id_t trackPlayer(player_type_t playerType, audio_usage_t usage,audio_content_type_t content, const sp<IBinder>& player,audio_session_t sessionId) = 0;/*oneway*/ virtual status_t playerAttributes(audio_unique_id_t piid, audio_usage_t usage,audio_content_type_t content)= 0;/*oneway*/ virtual status_t playerEvent(audio_unique_id_t piid, player_state_t event,audio_port_handle_t deviceId) = 0;/*oneway*/ virtual status_t releasePlayer(audio_unique_id_t piid) = 0;virtual audio_unique_id_t trackRecorder(const sp<IBinder>& recorder) = 0;/*oneway*/ virtual status_t recorderEvent(audio_unique_id_t riid, recorder_state_t event) = 0;/*oneway*/ virtual status_t releaseRecorder(audio_unique_id_t riid) = 0;/*oneway*/ virtual status_t playerSessionId(audio_unique_id_t piid, audio_session_t sessionId) = 0;
};

TRACK_PLAYER = IBinder::FIRST_CALL_TRANSACTION = 1
2.frameworks/native/services/audiomanager/IAudioManager.cpp

namespace android {class BpAudioManager : public BpInterface<IAudioManager>
{
public:explicit BpAudioManager(const sp<IBinder>& impl): BpInterface<IAudioManager>(impl){}virtual audio_unique_id_t trackPlayer(player_type_t playerType, audio_usage_t usage,audio_content_type_t content, const sp<IBinder>& player, audio_session_t sessionId) {Parcel data, reply;data.writeInterfaceToken(IAudioManager::getInterfaceDescriptor());data.writeInt32(1); // non-null PlayerIdCard parcelable// marshall PlayerIdCard data// get new PIId in replyconst status_t res = remote()->transact(TRACK_PLAYER, data, &reply, 0);//TRACK_PLAYER = 1if (res != OK || reply.readExceptionCode() != 0) {ALOGE("trackPlayer() failed, piid is %d", PLAYER_PIID_INVALID);return PLAYER_PIID_INVALID;} else {const audio_unique_id_t piid = (audio_unique_id_t) reply.readInt32();ALOGV("trackPlayer() returned piid %d", piid);return piid;}}virtual status_t playerAttributes(audio_unique_id_t piid, audio_usage_t usage,audio_content_type_t content) {Parcel data, reply;data.writeInterfaceToken(IAudioManager::getInterfaceDescriptor());data.writeInt32((int32_t) piid);data.writeInt32(1); // non-null AudioAttributes parcelabledata.writeInt32((int32_t) usage);data.writeInt32((int32_t) content);data.writeInt32(0 /*source: none here, this is a player*/);data.writeInt32(0 /*flags*/);//   write attributes' tagsdata.writeInt32(1 /*FLATTEN_TAGS*/);data.writeString16(String16("")); // no tags//   write attributes' bundledata.writeInt32(-1977 /*ATTR_PARCEL_IS_NULL_BUNDLE*/); // no bundlereturn remote()->transact(PLAYER_ATTRIBUTES, data, &reply, IBinder::FLAG_ONEWAY);}};IMPLEMENT_META_INTERFACE(AudioManager, "android.media.IAudioService");// ----------------------------------------------------------------------------
};

<2>.通过service给audioservice服务发送TRACK_PLAYER指令

# service call "audio" 1 
Result: Parcel(0x00000000: fffffffc 0000006d 00740041 00650074 '....m...A.t.t.e.'0x00000010: 0070006d 00200074 006f0074 00720020 'm.p.t. .t.o. .r.'0x00000020: 00610065 00200064 00720066 006d006f 'e.a.d. .f.r.o.m.'0x00000030: 00660020 00650069 0064006c 00270020 ' .f.i.e.l.d. .'.'0x00000040: 006e0069 00200074 006e0061 00720064 'i.n.t. .a.n.d.r.'0x00000050: 0069006f 002e0064 0065006d 00690064 'o.i.d...m.e.d.i.'0x00000060: 002e0061 006c0050 00790061 00720065 'a...P.l.a.y.e.r.'0x00000070: 00610042 00650073 00500024 0061006c 'B.a.s.e.$.P.l.a.'0x00000080: 00650079 00490072 00430064 00720061 'y.e.r.I.d.C.a.r.'0x00000090: 002e0064 0050006d 0061006c 00650079 'd...m.P.l.a.y.e.'0x000000a0: 00540072 00700079 00270065 006f0020 'r.T.y.p.e.'. .o.'0x000000b0: 0020006e 00200061 0075006e 006c006c 'n. .a. .n.u.l.l.'0x000000c0: 006f0020 006a0062 00630065 00200074 ' .o.b.j.e.c.t. .'0x000000d0: 00650072 00650066 00650072 0063006e 'r.e.f.e.r.e.n.c.'0x000000e0: 00000065 0000032c 00000190 00610009 'e...,.........a.'0x000000f0: 00200074 006e0061 00720064 0069006f 't. .a.n.d.r.o.i.'0x00000100: 002e0064 0065006d 00690064 002e0061 'd...m.e.d.i.a...'0x00000110: 00750041 00690064 0050006f 0061006c 'A.u.d.i.o.P.l.a.'0x00000120: 00620079 00630061 0043006b 006e006f 'y.b.a.c.k.C.o.n.'0x00000130: 00690066 00750067 00610072 00690074 'f.i.g.u.r.a.t.i.'0x00000140: 006e006f 003c002e 006e0069 00740069 'o.n...<.i.n.i.t.'0x00000150: 0028003e 00750041 00690064 0050006f '>.(.A.u.d.i.o.P.'0x00000160: 0061006c 00620079 00630061 0043006b 'l.a.y.b.a.c.k.C.'0x00000170: 006e006f 00690066 00750067 00610072 'o.n.f.i.g.u.r.a.'0x00000180: 00690074 006e006f 006a002e 00760061 't.i.o.n...j.a.v.'0x00000190: 003a0061 00330032 00290033 0009000a 'a.:.2.3.3.).....'0x000001a0: 00740061 00630020 006d006f 0061002e 'a.t. .c.o.m...a.'0x000001b0: 0064006e 006f0072 00640069 0073002e 'n.d.r.o.i.d...s.'0x000001c0: 00720065 00650076 002e0072 00750061 'e.r.v.e.r...a.u.'0x000001d0: 00690064 002e006f 006c0050 00790061 'd.i.o...P.l.a.y.'0x000001e0: 00610062 006b0063 00630041 00690074 'b.a.c.k.A.c.t.i.'0x000001f0: 00690076 00790074 006f004d 0069006e 'v.i.t.y.M.o.n.i.'0x00000200: 006f0074 002e0072 00720074 00630061 't.o.r...t.r.a.c.'0x00000210: 0050006b 0061006c 00650079 00280072 'k.P.l.a.y.e.r.(.'0x00000220: 006c0050 00790061 00610062 006b0063 'P.l.a.y.b.a.c.k.'0x00000230: 00630041 00690074 00690076 00790074 'A.c.t.i.v.i.t.y.'0x00000240: 006f004d 0069006e 006f0074 002e0072 'M.o.n.i.t.o.r...'0x00000250: 0061006a 00610076 0031003a 00320036 'j.a.v.a.:.1.6.2.'0x00000260: 000a0029 00610009 00200074 006f0063 ').....a.t. .c.o.'0x00000270: 002e006d 006e0061 00720064 0069006f 'm...a.n.d.r.o.i.'0x00000280: 002e0064 00650073 00760072 00720065 'd...s.e.r.v.e.r.'0x00000290: 0061002e 00640075 006f0069 0041002e '..a.u.d.i.o...A.'0x000002a0: 00640075 006f0069 00650053 00760072 'u.d.i.o.S.e.r.v.'0x000002b0: 00630069 002e0065 00720074 00630061 'i.c.e...t.r.a.c.'0x000002c0: 0050006b 0061006c 00650079 00280072 'k.P.l.a.y.e.r.(.'0x000002d0: 00750041 00690064 0053006f 00720065 'A.u.d.i.o.S.e.r.'0x000002e0: 00690076 00650063 006a002e 00760061 'v.i.c.e...j.a.v.'0x000002f0: 003a0061 00370039 00390031 000a0029 'a.:.9.7.1.9.)...'0x00000300: 00610009 00200074 006e0061 00720064 '..a.t. .a.n.d.r.'0x00000310: 0069006f 002e0064 0065006d 00690064 'o.i.d...m.e.d.i.'0x00000320: 002e0061 00410049 00640075 006f0069 'a...I.A.u.d.i.o.'0x00000330: 00650053 00760072 00630069 00240065 'S.e.r.v.i.c.e.$.'0x00000340: 00740053 00620075 006f002e 0054006e 'S.t.u.b...o.n.T.'0x00000350: 00610072 0073006e 00630061 00280074 'r.a.n.s.a.c.t.(.'0x00000360: 00410049 00640075 006f0069 00650053 'I.A.u.d.i.o.S.e.'0x00000370: 00760072 00630069 002e0065 0061006a 'r.v.i.c.e...j.a.'0x00000380: 00610076 0031003a 00320032 00290035 'v.a.:.1.2.2.5.).'0x00000390: 0009000a 00740061 00610020 0064006e '....a.t. .a.n.d.'0x000003a0: 006f0072 00640069 006f002e 002e0073 'r.o.i.d...o.s...'0x000003b0: 00690042 0064006e 00720065 0065002e 'B.i.n.d.e.r...e.'0x000003c0: 00650078 00540063 00610072 0073006e 'x.e.c.T.r.a.n.s.'0x000003d0: 00630061 00490074 0074006e 00720065 'a.c.t.I.n.t.e.r.'0x000003e0: 0061006e 0028006c 00690042 0064006e 'n.a.l.(.B.i.n.d.'0x000003f0: 00720065 006a002e 00760061 003a0061 'e.r...j.a.v.a.:.'0x00000400: 00310031 00340038 000a0029 00000000 '1.1.8.4.).......')

这里显示调用在A.c.t.i.v.i.t.yM.o.n.i.t.o.r.j.a.v.a.:.1.6.2,即PlaybackActivityMonitor.java文件的162行,仔细阅读会有答案。

<2>.通过service打开SurfaceFlinger刷新率并显示在屏幕上

在这里插入图片描述

enableRefreshRateOverlay(static_cast(n))),中的n就是1为开,0为关。

1.打开刷新率
# service call SurfaceFlinger 1034 i32 1
Result: Parcel(NULL)

打开成功后,手机的左上角会显示红色字体的刷新率。

2.关闭刷新率
# service call SurfaceFlinger 1034 i32 0
Result: Parcel(NULL)

关闭成功后,手机的左上角会显示红色字体的刷新率消失。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:Python中的精度问题

Python中的精度问题 如果你曾经在Python中处理浮点数&#xff0c;你可能会遇到精度问题。当使用不同的运算符和内置函数时&#xff0c;浮点数很容易产生舍入误差。这种误差可能会导致意想不到的结果&#xff0c;特别是在科学计算和金融应用中。 为什么会出现精度问题&#xf…

C++ map类成员介绍 (map与multimap)

目录 &#x1f914;map模板介绍&#xff1a; &#x1f914;特点&#xff1a; &#x1f914;map容器与哈希表&#xff1a; &#x1f914;map的成员函数&#xff1a; &#x1f642;map构造函数&#xff1a; 代码示例&#xff1a; 运行结果&#xff1a; &#x1f642;map赋…

深度剖析 Vue.js 经典知识点之:SPA、SSR与MVVM

SPA 更多精彩内容&#xff0c;请微信搜索“前端爱好者“&#xff0c; 戳我 查看 。‘ 谈一谈你对 SPA 单⻚面的理解&#xff0c;它的优缺点分别是什么 SPA&#xff08; single-page application &#xff09;仅在 Web ⻚面初始化时加载相应的 HTML、JavaScript 和 CSS。 一旦…

天敏G10数位板安装完PS无压感,观看此教程

1.拿到数位板&#xff0c;先把usb线路插入到电脑 ps.插入电脑usb,台式机请使用后置面板&#xff0c;这样供电稳定。 2.安装驱动 PS.驱动都是无盘驱动&#xff0c;驱动在我的电脑&#xff0c;一个移动盘符中&#xff0c;找到直接安装即可 3.安装完桌面会有一个图标&#xff…

ps打开笔压仍没有效果

打开钢笔压感但是ps依旧没有笔压 ①在此电脑搜索框中搜索&#xff1a; %appdata%\Adobe 然后打开Adobe Photoshop CC 2019 Settings ②创建文本 PSUserConfig 如下图所示&#xff1a; 这是PSUserConfig文本中的内容 # Use WinTabUseSystemStylus 0 ③然后再次打开ps尝试。 …

每天一个小技巧【5】·数位板笔刷压感设置

虽然是个程序员&#xff0c;但是感觉还是需要个数位板&#xff0c;比如可以做笔记、绘制光学路径、分析运动和受力过程、公式计算&#xff0c;或者放松时涂个鸦。&#xff08;虽然感觉ipad苹果笔或许更合适&#xff09; 我的数位板是有压感功能的&#xff0c;但想要在PS中让笔…

在web上实现压感

先放结论&#xff1a;结论是可以成功获得压感&#xff0c;可行。具体方案可以见文章末尾。 想着做一款带压感的在线绘图工具。首当其冲的问题就是web无法获取到数位板的压感数值。 查询了知乎、百度、google&#xff0c;得到了一下集中方案&#xff1a; 1. pressurejs.com 这…

ps cutterman点击没有反应

ps cutterman点击没有反应,解决办法&#xff1a;http://www.cutterman.cn/zh/faq PS:如果不行&#xff0c;把上面打开的文件夹全部的cutterman删除&#xff0c;重新安装

WIN10系统下PS软件卡顿问题的解决方法

WIN10系统下PS软件手绘板卡顿问题的解决方法 问题的状况问题来源解决方法备注 问题的状况 在win10系统下&#xff1a; 1. 使用手绘板在PS中画画时会弹出Win Ink的小键盘或者其他 2. 不定时卡顿 3. 丢失指针&#xff0c;取消选中图层 4. 滑动过程中中断&#xff0c;在图上留下…

Redis高级篇 - 多级缓存

多级缓存 1.什么是多级缓存 传统的缓存策略一般是请求到达Tomcat后&#xff0c;先查询Redis&#xff0c;如果未命中则查询数据库&#xff0c;如图&#xff1a; 存在下面的问题&#xff1a; 请求要经过Tomcat处理&#xff0c;Tomcat的性能成为整个系统的瓶颈 Redis缓存失效时…

如何在线剪辑视频?手机视频怎样剪辑?

在这个短视频当道的时代&#xff0c;大家都开始随手录制视频记录生活&#xff0c;一个视频从录制到发布&#xff0c;中间不可缺少的环节就是对视频的剪辑&#xff0c;想要做出高质量的视频&#xff0c;就少不了要在视频剪辑这一方面下功夫。 有视频剪辑经验的小伙伴自然会选择使…

视频快速剪辑分享

优酷视频格式转码比较慢&#xff0c;剪辑视频时长比较大时 可以采取一种比较懒的方式对视频进行快速剪辑 1.下载 EV录屏&#xff0c;并进行设置 2.进入设置&#xff0c;修改录制倒计时时间&#xff0c;并记住快捷键&#xff0c;默认快捷键为Ctrl F1 3.将待剪辑视频放置在录制…

屏幕录制和视频剪辑Filmage Screen

Filmage Screen是Mac上的一款比较专业的录屏软件&#xff0c;可以一键录制高清的视频&#xff0c;可以选择全屏录制&#xff0c;也可以选择自定义屏幕&#xff0c;Filmage Screen拥有内置的相机&#xff0c;可以创建清晰的影片&#xff0c;Filmage Screen具有视频编辑功能&…

极简视频录制/剪辑工具-Camtasia Studio9

由于疫情影响&#xff0c;许多会议、课程、毕业答辩等工作均设为线上&#xff0c;有时课程可能没有回放&#xff0c;或是会议领导的总结发言等可能需要反复观看&#xff0c;又或是毕业季的网上答辩&#xff0c;学生生涯中一次美好的回忆&#xff0c;将其记录下来日后观看&#…

电脑录屏怎么录?3个方法,教你如何录制视频

电脑录屏是可以通过录制视频的方式进行记录下我们的操作过程&#xff0c;并且可以随时保存下来方便以后查阅使用。大家都知道&#xff0c;电脑录屏是非常实用的&#xff0c;能够帮助我们记录屏幕上的内容&#xff0c;而且还能保存下来&#xff0c;以便我们以后的电脑学习使用。…

android系统视频剪辑app推荐,知乎10w人收藏:玩短视频必装的9款剪辑App(最全)...

声明:本文来自于微信公众号 微果酱(ID:wjam123456),作者: 橙子,授权站长之家转载发布。 做运营的 每天都要面临一些新难题 比如老板想追潮流做短视频 吐血写脚本、拍完视频 磨刀霍霍向猪羊准备剪视频 打开电脑剪辑软件发现,为何如此复杂 滤镜怎么加?调色怎么办?特效怎…

Camtasia视频剪辑功能详解

Camtasia是一款备受好评的屏幕录制软件&#xff0c;其中一个非常好用的功能就是视频剪辑&#xff0c;其视频剪辑功能的初衷是为了方便用户在录制视频后直接对视频文件进行编辑&#xff0c;而后也可以将其他视频导入Camtasia进行编辑&#xff0c;正因如此&#xff0c;Camtasia令…

录制和剪辑视频,如何解决占用空间过大的问题?

题图&#xff1a;用 OpenAI DALLE 绘制。prompts: a big movie tape in the crowded lighting room 问题 最近做视频比较多。我一般采用手机录制&#xff0c;然后加上 B-roll 素材进行剪辑。录制 8-10 分钟的视频&#xff0c;大概能有 1GB 左右的体积&#xff0c;输出后的视频也…

学术会议演讲视频录制全方位指南

1. 引言 随着进入后疫情时代&#xff0c;在线学术会议愈发频繁。从CCF-A类会议到C类会议&#xff0c;基本上都需要做线上的Oral。 一般的要求就是录制一个15分钟左右的Presentation&#xff0c;然后上传至网站即可。有些会议还贴心的准备了加载字幕的功能&#xff0c;我们的英…

3-网络初识——协议

目录 1.概念 ①语法&#xff1a;即数据与控制信息的结构或格式。 ②语义&#xff1a;即需要发出何种控制信息&#xff0c;完成何种动作以及做出何种响应。 ③时序&#xff1a;即事件实现顺序的详细说明。 2.作用 3.知名协议的默认端口 4.协议分层 4.1.什么是协议分层 …