- 博客(174)
- 资源 (6)
- 问答 (1)
- 收藏
- 关注
原创 C++ iovec结构体
iovec是一个结构体,用于描述一个数据缓冲区。它通常与readv和writev系统调用一起使用,用于在一次系统调用中读取或写入多个缓冲区。下面demo演示读取多个缓冲区的数据 fd是文件描述符,iov是iovec结构体数组,iovcnt是数组元素个数。如何使用iovec结构体和readv/writev系统调用。
2024-04-20 20:05:40 189
原创 PackageManagerService概述
判断是否是继续安装还是全新安装,继续安装情况下,获取之前的 sessionId 和 installId,并且根据 installId 注册安装监听;对于全新安装情况,需要根据传入的 apk 信息组装会话参数 SessionParams 对象,并以此创建新的 sessionId,注册新的观察监听安装事件。谷歌有4.4 dalvik 切到ART,应用安装的时候会启动dex2ota,把dex预编译成ELF文件,每次运行程序的时候不用重新编译,是真正意义的本地应用。OtaDexoptService 服务。
2024-04-15 22:39:24 88 1
原创 0图形系统概述
[在这里插入图片描述](https://img-blog.csdnimg.cn/direct/a99d785a8338402ea4e54c96a8fe8237.png。
2024-04-12 00:14:58 125
原创 零长数组,what&why
数组名在作为函数参数传递时,确实传递的是一个地址,但数组名绝不是指针,两者不是同一个东西。数组名用来表征一块连续内存存储空间的地址,是个常量,表示一个地址,而指针是一个变量,编译器要给它单独再分配一个内存空间,用来存放它指向的变量的地址。问什么不用指针代替零长数组?
2024-04-04 19:56:22 380
原创 前序遍历 (preorder traversal) - 中序遍历 (inorder traversal) - 后序遍历 (postorder traversal)
【代码】前序遍历 (preorder traversal) - 中序遍历 (inorder traversal) - 后序遍历 (postorder traversal)
2024-04-03 22:14:55 184
原创 wait/notify await/signal yield join
wait awaitwait/notify/nitifyAll Object中的方法,当线程调用wait()方法,当前线程释放对象锁,进入等待队列,只到被notify唤醒await/signal/signalall java.util.concurrent类库中提供的Condition类来实现线程之间的协调Thread.yield():一定是当前线程调用此方法,当前线程放弃获取CPU的时间片,由运行态转变为就绪态,让操作系统中再次选择线程执行。作用:让相同优先级的线程轮流执行,但并不能保证轮流执行
2024-03-23 19:50:12 209
原创 perfetto详解
可以将Perfetto理解为systrace的升级版,用在更新的平台、新图表展示更多的信息。它可帮助开发者收集 Android 关键子系统(如SurfaceFlinger/SystemServer/Input/Display 等 Framework 部分关键模块、服务,View系统等)的运行信息,从而帮助开发者更直观的分析系统瓶颈,改进性能。
2024-03-16 21:24:53 824
原创 稳定性三——wachdog机制与分析方法
最早引入Watchdog是在单片机系统中,由于单片机的工作环境容易受到外界磁场的干扰,导致程序“跑飞”,造成整个系统无法正常工作,因此,引入了一个“看门狗”,对单片机的运行状态进行实时监测,针对运行故障做一些保护处理,譬如让系统重启。这种Watchdog属于硬件层面,必须有硬件电路的支持。Linux也引入了Watchdog,在Linux内核下,当Watchdog启动后,便设定了一个定时器,如果在超时时间内没有对/dev/Watchdog进行写操作,则会导致系统重启。
2024-03-10 22:35:09 940
原创 cpu 性能分析基础
单核CPU一次只能运行一个进程或线程,超线程除外,看上去多个任务在同时运行,其实是Linux内核在不同的进程间切换,公平地分配CPU时间片,这便是上下文切换。内核调度,会周期性地中断正在运行的进程,切换其它进程,引起上下文切换。如果上下文切换明显多于定时器中断,那么可能是IO请求或长时间的系统调用造成的,在这种操作不能立即完成的情况下,为了提高CPU效率,内核也会调度进程,发生上下文切换。在一定的时间内,可运行进程个数的平均值,包括正在运行的进程,即平均负载,这个时间一般为1分钟、5分钟、15分钟。
2024-03-02 20:43:24 401
原创 稳定性二——JE流程
1.1LoggingHandlerUncaughtExceptionHandler只定义了一个接口方法 当线程因为未捕获的异常停止时,Java 虚拟机会调用 uncaughtException() 函数。可以看出,uncaughtException() 是在crash 最开始调用的,用以输出crash 开头信息1.3 KillApplicationHandlerKillApplicationHandler 类,以及构造中传入的LoggingHandler,都是实现UncaughtExceptio
2024-01-21 22:43:12 833
原创 稳定性一——ANR
如果有发现某个线程的堆栈,包含此字样,可进一步看其堆栈,确定是调用了什么系统服务。main log可以得到anr基本信息,要得到阻塞的地方,还得靠trace文件,一般在/data/anr目录下,可在找个trace文件中搜索主线程堆栈。可知80这个等级是很严重的,应用马上就要被杀死,被杀死的这个应用从名字可以看出来是桌面,连桌面都快要被杀死,那普通应用能好到哪里去呢?可以从log中看到,发生anr的时候,Top进程的Cpu占用情况,user代表是用户空间,kernel是内核空间,一般的有如下的规。
2023-10-27 00:51:23 321
原创 2.android消息机制-native
它就是一个int值,又叫做句柄,在Linux中,打开或新建一个文件,它会返回一个文件描述符,读写文件需要使用文件描述符来指定待读写的文件,所以文件描述符就是指代被打开的文件,所有对这个文件的IO操作都要通过文件描述符。pollInner方法返回一个int值result,代表着本次轮询是否成功处理了消息,当result不等于0时,就会跳出循环,,等到下一个消息到达(mWakeEventFd会往管道写入字符)或监听的其他事件发生时就会唤醒线程,然后处理消息,只要epoll_wait方法返回后,都会进入。
2023-05-19 23:54:53 643
原创 6.关于系统服务的思考—— native vs java
app与FregService .activity onCreate中。// 获得一个名称为“ freg ”的服务的 Binder 代理对象接口。java 服务 app 系统应用 三方应用。hal 服务可以直接给app调用。
2023-02-19 20:43:47 385
原创 linux ipc
消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题共享内存区:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存信号: 传递字符串消息只能在同一程序下的进程间信号量:不能传递复杂消息,只能用来同步 ,通常配合消息队列、共享内存使用。
2023-02-14 01:39:01 224
原创 深入理解Android sensor
整个android sensor模块的核心是SensorService,应用通过SensorManager与其交互,SensorService基本上管理sensor的所有行为,包括1.1.2 jni通过对JNI的了解 System.loadLibrary(“android_servers”); 会去查找libandroid_servers.so 这个库文件1.1.3 native (SensorService)BinderService 是 Android Service 框架的主要类,是
2022-12-18 00:39:20 895
原创 4. 添加Java服务
定义aidl接口}frameworks/base/Android.bp framework-defaults 模块中添加我们刚刚加的 aidl 文件mm成功,会有hello目录IHelloService.java。
2022-11-04 01:19:22 560
原创 1.android消息机制-java
分析过,应用层消息机制 再仔细扒一扒看看,后面继续扒一扒nativeAndroid有大量的消息驱动方式来进行交互,四大组件启动过程交互都离不开消息机制。主要涉及MessageQueue、Message,Looper,Handler四个类handler要想起作用有三个步骤:结构图[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gO57aH4o-1656519751011)(C:\Users\bafc\AppData\Roaming\Typora\typora-user-imag
2022-06-30 00:23:09 535
原创 UML 类图
可以理解为继承,标准解释: is-a 关系,实现继承抽象类,实现接口,都属于实现关联一个类知道另一个类的属性和方法聚合整体和部分的关系,部分可以离开整体,如汽车 引擎,轮胎组合整体和部分的关系,部分不能离开整体单独存在,公司 部门依赖局部变量,方法,参数或者对静态方法的调用各关系强弱 泛化=实现>组合>聚合>关联>依赖—继承6. 电脑是可处理计算机这个概念的一种实现——实现关系...
2022-06-28 22:56:42 170
原创 select/poll/epoll
1. IO系列——io模型初探select/poll/epoll都是IO多路复用机制,可以同时监控多个描述符,当某个描述符就绪(读或写就绪),则立刻通知相应程序进行读或写操作。本质上select/poll/epoll都是同步I/O,即读写是阻塞的。maxfd:代表要监控的最大文件描述符fd+1writefds:监控可写fdreadfds:监控可读fdexceptfds:监控异常fdtimeout:超时时长NULL,代表没有设置超时,则会一直阻塞直到文件描述符上的事件触发0,代表不等待,立
2022-06-27 00:42:41 205
原创 io模型初探
操作系统负责计算机的资源管理和进程调度。应用需要经过操作系统,才能做一些特殊操作,如磁盘读写,内存读写等。应用程序要把数据写入磁盘,只能通过调用操作系统开放出来的API来操作。应用程序在用户空间,不存在实质的io过程,真正的io在操作系统执行,应用程序发起一次IO操作包含两个阶段:操作系统内核完成IO操作还包括两个过程:其实io就是把进程内部数据转移到外部设备,或者把外部设备的数据迁移到进程内部。外部设备一般指 硬盘,socket通讯的网卡。一个完整的io过程包括这几个步骤知道什么是io了,什么是阻塞io
2022-06-27 00:13:46 264
原创 3.volatile域
有时仅仅为了读写一个或者两个实例域就使用同步的话,显得开销过大,volatile关键字为实例域的同步访问提供了免锁的机制。如果声明一个域为volatile,那么编译器和虚拟机就知道该域是可能被另一个线程并发更新的。再讲到volatile关键字之前我们需要了解一下内存模型的相关概念以及并发编程中的三个特性:原子性,可见性和有序性1.内存模型 原子性 可见性 有序性1.1 JMM在 java 中,所有实例域、静态域和数组元素存储在堆内存中,堆内存在线程之间共享(本文使用“共享变量”这个术语代指实例域,
2022-05-19 16:12:05 137
原创 2. java并发编程-同步
文章目录1. 锁对象2. 条件对象3. Synchronized关键字4. 同步阻塞http://liuwangshu.cn/java/concurrent/2-synchronous.html在多线程的应用中,两个或者两个以上的线程需要共享对同一个数据的存取。如果两个线程存取相同的对象,并且每一个线程都调用了修改该对象的方法,这种情况通常成为竞争条件。比如买火车票看看一个银行转账的例子1. 锁对象synchronized关键字自动提供了锁以及相关的条件,大多数需要显式锁的情况使用synchron
2022-05-19 15:59:47 146
原创 1. java并发编程-线程定义、状态和属性
基本用法参考多线程1. 进程和线程线程 是指程序在执行过程中,能够执行程序代码的一个执行单元。在java语言中,线程有四种状态:运行 、就绪、挂起和结束。进程 是指一段正在执行的程序。而线程有时也被成为轻量级的进程,他是程序执行的最小单元,一个进程可以拥有多个线程,各个线程之间共享程序的内功空间(代码段、数据段和堆空间)及一些进程级的资源(例如打开的文件),但是各个线程都拥有自己的棧空间。为何使用多线程?从操作系统角度看主要一下几个方面:使用多线程可以减少程序的响应时间,如果某个操
2022-05-19 15:54:27 148
原创 android 通信之 BitTube
AOSP中使用BitTube 的地方有显示(Display)子系统和Sensor子系统,在这里一探究竟文章目录1. 概述2 socketpair3 socketpair用法4 BitTube1. 概述BitTube是用来处理进程间通讯的机制,和管道类似,主要是socketpair的封装,2 socketpairsocketpair用来创建一堆未命名的,互相连接的套接字,套接字一端可以进行读写操作,用来实现全双工的通讯。函数原型 int socketpair(int domain, int typ
2022-05-05 14:11:37 2302
原创 3. native service
1.java sevice上一篇介绍了系统服务vibrate使用,实现流程:定义抽象类Vibrator,定了应用可以访问的一些抽象方法frameworks/base/core/java/android/os/Vibrator.java;定义具体类SystemVibrator,继承抽象类Vibrator,实现抽象方法frameworks/base/core/java/android/os/SystemVibrator.java;private final IVibratorService
2022-04-20 22:16:09 2704 1
原创 1.java系统服务初识-vibrate
1. 一个简单的系统服务Android开发过程中经常会用到各种各样的系统管理服务,如进行窗口相关的操作会用到窗口管理服务WindowManager,进行电源相关的操作会用到电源管理服务PowerManager,还有很多其他的系统管理服务,如通知管理服务NotifacationManager、振动管理服务Vibrator、电池管理服务BatteryManager…… 这些Manager提供了很多对系统层的控制接口。对于App开发者,只需要了解这些接口的使用方式就可以方便的进行系统控制,获得系统各个服务的信
2022-04-15 00:24:17 588
原创 android so文件与源码路径
libandroid.so——frameworks/base/native/androidlibandroid_runtime.so——frameworks/base/core/jnilibandroidfw.so——frameworks/base/libs/androidfwlibaudioutils.so——system/media/audio_utilslibbinder.so——frameworks/native/libs/binderlibbluedroid.so——system/blu
2022-04-14 20:35:51 612
listview图片卡顿 左右滑动的时候,PagerSlidingTabStrip开源
2016-05-20
TA创建的收藏夹 TA关注的收藏夹
TA关注的人