自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(16)
  • 收藏
  • 关注

原创 Android13 PMS是如何启动的

InputReader不停的从硬件获取事件,将硬件事件封装成上层能使用的格式和keycode,然后通过notify通知InputDispatcher,添加到队列中,并唤醒InputDispatcher线程。InputThread创建了一个InputThreadImpl,看InputThreadImpl发现是一个Thread也就是一个线程,所以InputDispatcher::start就是启动了一个名字叫InputDispatcher的线程,执行内容是dispatchOnce。这里也用常见的按键设备。

2023-04-28 16:11:22 285

原创 Andriod事件分发的事件从何而来(三)

InputReader不停的从硬件获取事件,将硬件事件封装成上层能使用的格式和keycode,然后通过notify通知InputDispatcher,添加到队列中,并唤醒InputDispatcher线程。InputThread创建了一个InputThreadImpl,看InputThreadImpl发现是一个Thread也就是一个线程,所以InputDispatcher::start就是启动了一个名字叫InputDispatcher的线程,执行内容是dispatchOnce。这里也用常见的按键设备。

2023-03-21 14:36:47 152

原创 Andriod事件分发的事件从何而来(二)

最后监听serverChannel的fd,有事件时回调给InputDispatcher::handleReceiveCallback方法的最后把创建的clientChannel返回给了客户端,就是开头的WMS中。调用了mInputManager的getDispatcher函数看名字就知道应该有个变量mDispatcher,查看mInputManager是怎么创建的可以发现是在NativeInputManager创建的时候初始化的。上一篇最后留下了一个疑问,WMS的事件是哪里来的?这里就出现了重要的两个类。

2023-03-21 14:36:04 167

原创 Andriod事件分发的事件从何而来(一)

这个方法里有一个在Window创建流程的时候没有关注的InputChannel,事件真正的来源就是它,在。所以最初的事件就是从PhoneWindow进入了view的事件分发,而PhoneWindow的事件又是Activity中来的.从名字也能猜出mInputEventReceiver就是接收事件的对象了,这是一个ViewRootImpl的内部类看下它的实现。ViewRootImpl的事件就交给mView来继续分发了,这里mView是DecorView,也是在setView中传进来的。

2022-12-21 11:34:38 143

原创 Android 匿名内存解析

有了binder机制为什么还需要匿名内存来实现IPC呢?我觉得很大的原因就是binder传输是有大小限制的,不说应用层的限制。在驱动中binder的传输大小被限制在了4M,分享一张图片可能就超过了这个限制。匿名内存的主要解决思路就是通过binder传输文件描述符,使得两个进程都能访问同一个地址来实现共享。

2022-10-20 23:08:51 773

原创 AIDL中的Binder机制

来到应用层,使用binder的方法一般就是利用系统提供的AIDL来实现。AIDL的作用就是再编译的时候自动生成一个java文件实现binder的功能。

2022-10-04 18:56:54 807

原创 Framework如何实现Binder

回到javaObjectForIBinder中获取到BinderProxy对象之后调用了getBPNativeData,这个方法获取了BinderProxy对象的BinderProxyNativeData地址通过这个地址和前面创建的nativeData地址判断mGetInstance获取的到的对象是新创建的还是缓存里面的。可以肯定的是framework使用jni调用的是native的binder接口,在native层Binder结构通过BBinder,BpBinder和ServiceManager来实现。

2022-09-13 22:28:00 600

原创 Linux 角度看binder原理(五)

上一篇中提到ProcessState::self()->getStrongProxyForHandle(handle)相当于BpBinder::create(handle),readNullableStrongBinder通过flat->hdr.type来判断拿到的binder是否是当前进程的,分别获取BBinder和BpBinder对象返回。interface_cast在上一篇也讲过就是通过asInterface来创建一个对象,实现就是通过模板方法。...

2022-08-31 20:37:05 622

原创 Linux 角度看binder原理(四

因为是interface_cast所以就是去android::os::IServiceManager里寻找asInterface方法,这里有一个主要注意的点,在最新的Android12中,Servicemanager已经不是直接和binder驱动交互了,它的实现通过aidl来系统生成代码,这个IServiceManager不是当前frameworks下的这个文件,是通过aidl生成的。在done中创建新线程,触发done的只有BINDER_WORK_TRANSACTION和发送死亡通知的时候。

2022-08-21 23:18:50 1110

原创 Android 伪加密和解决思路

zip解压的流程就到这里结束,android中解压还是通过标准的流程。找到ECOD解析CentralDirectory->根据CentralDirectory创建CentralDirectoryRecord的hashtable->最终通过CentralDirectoryRecord中的文件地址和长度压缩方式,拿到数据解压。后续如果再遇到修改了其他地方导致解压失败应该也很容易解决了。...

2022-08-16 13:57:40 480

原创 Linux 角度看binder原理(三)

可以看到这里是通过tls来判断是否已经存在,从而实现的线程唯一对象其中ProcessState是通过ProcessState::self()来获取的,ProcessState::self()会调用ProcessState::init()来获取单例。BpBinder中最重要的就是mHandle,每个binder_ref有一个handle,BpBinder中的mHandle就和binderRef中的对应。这里说的ServiceManager是c++层的ServiceManager,它的作用就是管理所有的服务。.

2022-08-07 22:46:40 1027

原创 Linux 角度看binder原理(二)

binder_node最大的作用就是binder驱动可以通过binder_node来访问service,同时通过强弱引用来控制他的生命周期。binder_thread就已经到了比较具体执行任务的地方了,它的field都是和具体任务相关。在binder_proc通过threads来管理线程池,在binder中线程的结构是binder_thread。在上一篇中,已经知道所有使用binder的进程都会调用open来打开设备,当设备打开的时候就会创建一个binder_proc结构体。传入当前控制指令需要的参数。..

2022-07-28 17:54:38 750

原创 Linux 角度看binder原理(一)

众所周知binder是Android极具特色的IPC方式,也可以说是Android系统中最重要的部分。Binder系统的基石则是Binder驱动。接下来就看下Binder驱动是怎么在底层提供支持的。binder驱动的代码并不在aosp的源码中而是在Linux源码中,在我的linux-5.16.8版本中它的路径为/drivers/android。首先想象一下如果自己实现一个IPC功能需要哪些部分这么看来ipc的基础功能也就这么多了,剩下的就是安全和优化部分了也不是很复杂。接下来就看下binder的实现不熟悉L

2022-07-09 21:44:05 1419

原创 Android 伪加密和解决思路

我们都知道Android的apk文件就是一个zip格式的文件。研究一下Android 11源码中的zip解压库,看看有什么特殊的地方。

2022-06-16 22:46:21 1138

原创 Android LOG系统源码解析(二)

上一篇了解了log系统的启动,这次主要梳理一下写入和读取的流程

2022-06-06 22:32:44 1018

原创 Android LOG系统源码解析(一)

在学习老罗的《Android系统源码情景分析》中发现其中的代码版本实在是有点老,和现在版本差别较大所以基于android 11重新梳理了一下。

2022-05-31 22:40:16 958

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除