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

news2024/11/20 3:23:08

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

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

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

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

欢迎关注Android系统攻城狮

1.前言

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

2.调试

<1>.service命令

# service                                                                                                                                                                                                                  
Usage: service [-h|-?]
       service list
       service check SERVICE
       service 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, //=1
        PLAYER_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 reply
        const status_t res = remote()->transact(TRACK_PLAYER, data, &reply, 0);//TRACK_PLAYER = 1
        if (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 parcelable
        data.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' tags
        data.writeInt32(1 /*FLATTEN_TAGS*/);
        data.writeString16(String16("")); // no tags
        //   write attributes' bundle
        data.writeInt32(-1977 /*ATTR_PARCEL_IS_NULL_BUNDLE*/); // no bundle
        return 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://www.coloradmin.cn/o/591404.html

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

相关文章

C4D R26 渲染学习笔记 建模篇(3):生成器

文章目录 前文回顾介绍篇建模篇 生成器介绍生成器变形器搭配举例 生成器详细介绍细分曲面布料曲面 未完待续 前文回顾 介绍篇 C4D R26 渲染学习笔记&#xff08;1&#xff09;&#xff1a;C4D版本选择和初始UI框介绍 C4D R26 渲染学习笔记&#xff08;2&#xff09;&#xff…

微服务Spring Cloud 02------使用Eureka实现注册中心(1)

1.Eureka简介 Eureka是Spring Cloud中的一个负责服务注册与发现的组件。遵循着CAP理论中的A(可用性)和P(分区容错性)。 Eureka是Netflix中的一个开源框架。它和 Zookeeper、Consul一样&#xff0c;都是用于服务注册管理的&#xff0c;同样&#xff0c;Spring-Cloud 还集成了Zo…

Canvas画布基本功能及实现网页签名功能

canvas 简介 <canvas> 是 HTML5 新增的&#xff0c;一个可以使用脚本(通常为 JavaScript) 在其中绘制图像的 HTML 元素。它可以用来制作照片集或者制作简单(也不是那么简单)的动画&#xff0c;甚至可以进行实时视频处理和渲染。和所有 DOM 元素一样&#xff0c;拥有自己…

chatgpt赋能python:Python中累乘的作用和用法

Python中累乘的作用和用法 在Python编程语言中&#xff0c;累乘指的是连续乘法&#xff0c;或者说是一系列数字的乘积。累乘的概念非常简单&#xff0c;但是实际上它在编程中有着广泛的应用。 累乘在Python中的实现方式 Python中&#xff0c;累乘可以通过多种方式来实现&…

手写一个webpack插件(plugin)

熟悉 vue 和 react 的小伙伴们都知道&#xff0c;在执行过程中会有各种生命周期钩子&#xff0c;其实webpack也不例外&#xff0c;在使用webpack的时候&#xff0c;我们有时候需要在 webpack 构建流程中引入自定义的行为&#xff0c;这个时候就可以在 hooks 钩子中添加自己的方…

使用docker和minio实现对象存储

文章目录 使用docker和minio实现对象存储什么是minio安装minio使用minio 使用docker和minio实现对象存储 什么是minio ​ Minio是一个开源的分布式文件存储系统&#xff0c;它基于 Golang 编写,虽然轻量&#xff0c;却拥有着不错的高性能&#xff0c;可以将图片、视频、音乐、…

Sequelize:Node.js 中的强大 ORM 框架

❤️砥砺前行&#xff0c;不负余光&#xff0c;永远在路上❤️ 目录 前言优势&#xff1a;提高效率&#xff0c;不用SQL即可完成数据库操作。 那什么是 Sequelize&#xff1f;主要特性&#xff1a;1、模型定义和映射&#xff1a;2、关联和联接&#xff1a;3、事务管理&#xff…

Java性能权威指南-总结2

Java性能权威指南-总结2 性能测试方法原则2:理解批处理流逝时间、吞吐量和响应时间批处理流逝时间吞吐量测试 原则3:用统计方法应对性能的变化 性能测试方法 原则2:理解批处理流逝时间、吞吐量和响应时间 性能测试的第2条原则是多角度审视应用性能。应该测量哪个指标取决于对…

chatgpt赋能python:Python中的与非

Python中的与非 在Python编程中&#xff0c;我们经常会用到与非运算符&#xff0c;用来判断条件语句中的真假性。在本文中&#xff0c;我们将介绍Python中的与非运算符&#xff0c;并探讨其用法和实际应用场景。 什么是与非运算符&#xff1f; 与非运算符是一个布尔操作符&a…

NeRF-SLAM代码记录

前言 没运行成功,尤其是编译gtsam部分,每一步都有错,又是讨厌c++第一天。 这一行编译到92% 就会报错 python/CMakeFiles/gtsam_py.dir/build.make:250: recipe for target python/CMakeFiles/gtsam_py.dir/linear.cpp.o failed make[2

.NET 8 Preview 4 发布

作者&#xff1a;Jon Douglas - Principal Program Manager, NuGet 翻译&#xff1a;Alan Wang 排版&#xff1a;Alan Wang 我们很高兴与大家分享在 .NET 8 预览版 4 中的所有新功能和改进&#xff01;这次发布是继预览版 3之后的更新。您将在这些月度发布中看到更多功能逐渐亮…

【无标题】win11打开VMware虚拟机蓝屏解决

win11打开VMware虚拟机蓝屏解决 win11打开虚拟机蓝屏&#xff01;&#xff01;&#xff01;解决方案&#xff1a;win11支持16.2以上版本&#xff0c;其他版本不兼容&#xff0c;可用文末的卸载工具卸载之前已安装版本&#xff08;深度卸载&#xff09;&#xff0c;然后下载16.2…

chatgpt赋能python:Python中的乘号:一个重要的数学运算符

Python中的乘号&#xff1a;一个重要的数学运算符 在 Python 编程语言中&#xff0c;乘号通常是使用“*”表示的数学运算符。这个运算符非常常用&#xff0c;它可以在各种情况下使用。本文将探讨 Python 中乘号的基本用法&#xff0c;以及更高级的用法。 基本用法 在 Python…

python+django高校人事管理系统vue

本高校人事管理系统以Django作为框架&#xff0c;Python语言&#xff0c;B/S模式以及MySql作为后台运行的数据库。本系统主要包括以下功能模块&#xff1a;用户、院长、职称申报、工资信息、绩效信息、奖惩信息、招聘、科系分类等模块。 本文着重阐述了高校人事管理系统的分析、…

easyX实践上手操作小项目

easyX实践上手操作小项目 效果展示主菜单的装饰玩法介绍界面开始游戏界面制作团队界面排行榜界面注&#xff1a;main()函数拓展数据库小结 这里我们学习过easyX的基础知识后&#xff0c;看看是否能实践操作一下&#xff0c;制作一个属于自己的游戏界面呢&#xff1f; 基础知识…

基于深度学习的高精度野生目标检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度野生目标检测识别系统可用于日常生活中检测与定位野生目标目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的野生目标目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检测…

开源SCRM营销平台MarketGo-账号管理

一、概述 企业在经营的过程中&#xff0c;因为业务、税收等各种因素的需要在各地成立分公司&#xff0c;这样针对公司来说管理成本&#xff0c;运营成本&#xff0c;营销成本都会提高&#xff0c;并且沟通的效率也会变低。 在用户营销的场景中&#xff0c;MarketGo在SCRM做了…

C++ stack容器介绍

&#x1f914;stack容器介绍&#xff1a; &#x1f4d6; stack是一种数据结构&#xff0c;也可以被称为堆栈。它是一个容器&#xff0c;只允许在最顶层进行插入和删除&#xff0c;并且只能访问最后一个插入的元素。这个元素称为栈顶。所有新插入的元素都被放置在栈顶上面&#…

【C++入门】什么是引用

目录 一、引用概念 二、引用特性 三、常引用 四、使用场景 1. 做参数 2. 做返回值 五、传值&#xff0c;传引用效率比较 六、引用和指针的区别 一、引用概念 引用不是新定义一个变量&#xff0c;而是给已存在变量取一个别名&#xff0c;编译器不会为引用变量开辟内存空间…

【C/C++】之内存管理(超详细练气篇)

个人主页&#xff1a;平行线也会相交&#x1f4aa; 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【C之路】&#x1f48c; 本专栏旨在记录C的学习路线&#xff0c;望对大家有所帮助&#x1f647;‍ 希望我们一起努力、成长&…