热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android深入系统完全讲解(12)

11跟踪一个服务,直接找到驱动实现如果说我自己学习整个系统,直到底层驱动的方法,我想说的就是我常用的就是跟踪震动这个模块,


11 跟踪一个服务,直接找到驱动实现

如果说我自己学习整个系统,直到底层驱动的方法,我想说的就是我常用的就是跟踪震动这个模块,而为什么是这个,主要是简单,但是又是从上到下都具备,对于学习系统框架是最好的路径。

于是今天我们跟踪下这个代码,震动在 APP 中的使用方式。

在这里插入图片描述
代码中这样使用:
private Vibrator vibrator;
vibrator=(Vibrator)getSystemService(Service.VIBRATOR_SERVICE);
vibrator.vibrate(2000);
我们跟踪 getSystemService 代码,找到对应服务

在这里插入图片描述
这样子我们就要找初始化服务的地方,找下 SystemServiceRegistry 里面的静态代码块,可以看到有这段:

在这里插入图片描述
然后我们看 SystemVibrator 文件实现,
在这里插入图片描述
这个代码就是找到震动服务的代理,于是我们找下服务即可 VibratorService.java,这个就是我
们调用的时候真正实现的地方。
在这里插入图片描述
然后跟下去,找到往下走的代码:
在这里插入图片描述
调用到这个,就知道走下去了,因为标记了 native,说明是个本地方法,我们去找下:在这里插入图片描述
我们通过检索找到代码:
在这里插入图片描述
在这里面又想讲下,观察这个 cpp 文件,找到注册方法,然后搜索这个注册方法:在这里插入图片描述
会检索到这个/frameworks/base/services/core/jni/onload.cpp,这个是在虚拟机启动的时候,初
始化的所有系统相关的 jni 对应表,这个可以多看看。在这里插入图片描述
要找它编译到哪里,从它目录往上找,找到一个 bp 或者 mk 即可。这里是

在这里插入图片描述
我们找到具体的实现地方,一般而言文件名或者函数名是一致的,我们这里可以看到是
hardware\libhardware\modules\vibrator 的 vibrator.c,我们打开看看这个代码:
定义了挂载位置:
static const char THE_DEVICE[] = “/sys/class/timed_output/vibrator/enable”;

最后我们就要找到真正驱动编写的地方,实际中能够通过这个路径,定位到驱动实现,这里
我用老代码演示,手头没有驱动代码:
static int __init vibrator_init(void)
{
return creat_vibrator_sysfs_file(); 这块会注册操作节/sys/class/timed_output/vibrator/enable";
}

static void __exit vibrator_exit(void)
{
remove_vibrator_sysfs_file();
}
module_init(vibrator_init);
module_exit(vibrator_exit);
此处在 creat_vibrator_sysfs_file 则会去进行注册设备,将设备的处理函数和设备进行绑定,
此时 open(THE_DEVICE, O_RDWR);
nwr = sprintf(value, “%d\n”, timeout_ms);
ret = write(fd, value, nwr);
这样子处理是,write 函数会对应到此设备进行注册的写入函数,这时向文件设备写入不同
的值,设备处理函数则会直接引起硬件操作,使得硬件真正跑起来。
这里简单说下__init 这个编译配置属性,这个代表把后面的方法编译到这个段里面,系统启
动后会找到这个段,这个段里面全部是驱动的初始化方法,可以直接遍历,执行系统的驱动
初始化。
这块定位的路线在 kernel 里面。https://www.bbsmax.com/A/qVdeaEY8dP/

在这里插入图片描述
简单说下就是找到这个段里面的方法,依次执行,完成驱动的初始化,系统层是通过 HAL
的统一接口去调用,然后这个 HAL 是 C 代码,然后使用注册 JNI 的方式提供给服务,然后服
务对应有客户端,使用 Binder 进行跨进程调用,完成使用这个驱动的整个回路。







推荐阅读
  • Android native层服务例子Bp和Bn
    转入android阵地,被各种权限所阻挠,app写个jni各种没有权限,只能开个native服务,本来android的服务& ... [详细]
  • 近来有一个需求,是需要在androidjava基础库中插入一些log信息,完成这个工作需要的前置条件有编译好的android源码具体android源码如何编译,这 ... [详细]
  • 这篇文章将为大家详细讲解有关C#开发技巧有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。C#开发技 ... [详细]
  • PIMPL 是 C++ 中的一个编程技巧,意思为指向实现的指针。具体操作是把类的实现细节放到一个单独的类中,并用一个指针进行访问 ... [详细]
  • 本文翻译自:WhatisaMavenartifact?什么是神器?为什么Maven需要它?#1楼参考:https:sta ... [详细]
  • IDEA实用插件Lombok
    LombokLombok是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具,通过使用对应的注解,可以在编译源码的时候生成对应的方法。通常,我们所定义的对象和b ... [详细]
  • 上次我们总结了React代码构建后的webpack模块组织关系,今天来介绍一下Babel编译JSX生成目标代码的一些规则,并且写一个简单的解析器,模拟整个生成的过程。我们还是拿最简 ... [详细]
  • 安全加密C语言库OpenSSL,在Android中服务器和客户端之间的签名验证和数据加密通信等。OpenSSL系列文章:一、AndroidCMake轻松 ... [详细]
  • 编译原理c语言词法分析器,用C语言实现一个真正的词法分析器
    词法分析,是编译器的第一个模块,也是最简单的模块。最简单,指的是相对于编译器这种大型程序而言,与一般的代码相比还是有点复杂的 ... [详细]
  • apk简单介绍APK的组成apk安装流程app的启动过程apk打包流程AIDLAIDL介绍为什么要设计这门语言它有哪些语法?默认支持的数据类型包括什么是apk打包流程 ... [详细]
  • Ubuntu16.0464位安装armlinuxgcc交叉编译器以及samba服务器
    交叉编译器是嵌入式开发的必要工具,但是由于目前大多数人使用64位ubuntu,在照着很多教程做的时候,就会失败,失败原因是64位ubuntu需要额外安装32位的兼容包。以arm-l ... [详细]
  • 找到:frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\Phon ... [详细]
  • PHP 扩展编译的通用方法
    2019独角兽企业重金招聘Python工程师标准以memcache扩展为例子首先需要到软件的官方(如memcached的地址http:pecl.php.netp ... [详细]
  • 使用RSACryptoServiceProvider进行公钥加密我已经在CodeProject上发表了一篇文章,解释了如何使用RSA提供程序进行加密和解密:RSA私钥加密虽然200 ... [详细]
  • 互联网世界 9 种基本的商业模式
    互联网世界9种基本的商业模式一个商业模式是运行一个公司的方法;通过该模式的运作,一个公司能维持自己的生存,就是说,能有收益。商业模式意味着一个公司是如何通过在价值链中定位自己,从而获 ... [详细]
author-avatar
辣子花_644_172
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有