- 博客(181)
- 资源 (6)
- 问答 (1)
- 收藏
- 关注
原创 Android学习汇总
http://gityuan.com/android/https://blog.csdn.net/yiranfeng/article/details/103549149Android学习之路一、系统启动Android系统架构Android10.0系统启动流程Android10.0系统启动之init进程Android10.0系统启动之SystemServer进程Android10.0系统服务之ActivityManagerServiceAndroid10.0系统启动之Launcher启动之
2021-01-13 16:24:05 247
原创 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 195
原创 perfetto详解
可以将Perfetto理解为systrace的升级版,用在更新的平台、新图表展示更多的信息。它可帮助开发者收集 Android 关键子系统(如SurfaceFlinger/SystemServer/Input/Display 等 Framework 部分关键模块、服务,View系统等)的运行信息,从而帮助开发者更直观的分析系统瓶颈,改进性能。
2024-03-16 21:24:53 697
原创 稳定性三——wachdog机制与分析方法
最早引入Watchdog是在单片机系统中,由于单片机的工作环境容易受到外界磁场的干扰,导致程序“跑飞”,造成整个系统无法正常工作,因此,引入了一个“看门狗”,对单片机的运行状态进行实时监测,针对运行故障做一些保护处理,譬如让系统重启。这种Watchdog属于硬件层面,必须有硬件电路的支持。Linux也引入了Watchdog,在Linux内核下,当Watchdog启动后,便设定了一个定时器,如果在超时时间内没有对/dev/Watchdog进行写操作,则会导致系统重启。
2024-03-10 22:35:09 891
原创 cpu 性能分析基础
单核CPU一次只能运行一个进程或线程,超线程除外,看上去多个任务在同时运行,其实是Linux内核在不同的进程间切换,公平地分配CPU时间片,这便是上下文切换。内核调度,会周期性地中断正在运行的进程,切换其它进程,引起上下文切换。如果上下文切换明显多于定时器中断,那么可能是IO请求或长时间的系统调用造成的,在这种操作不能立即完成的情况下,为了提高CPU效率,内核也会调度进程,发生上下文切换。在一定的时间内,可运行进程个数的平均值,包括正在运行的进程,即平均负载,这个时间一般为1分钟、5分钟、15分钟。
2024-03-02 20:43:24 393
原创 稳定性二——JE流程
1.1LoggingHandlerUncaughtExceptionHandler只定义了一个接口方法 当线程因为未捕获的异常停止时,Java 虚拟机会调用 uncaughtException() 函数。可以看出,uncaughtException() 是在crash 最开始调用的,用以输出crash 开头信息1.3 KillApplicationHandlerKillApplicationHandler 类,以及构造中传入的LoggingHandler,都是实现UncaughtExceptio
2024-01-21 22:43:12 821
原创 稳定性一——ANR
如果有发现某个线程的堆栈,包含此字样,可进一步看其堆栈,确定是调用了什么系统服务。main log可以得到anr基本信息,要得到阻塞的地方,还得靠trace文件,一般在/data/anr目录下,可在找个trace文件中搜索主线程堆栈。可知80这个等级是很严重的,应用马上就要被杀死,被杀死的这个应用从名字可以看出来是桌面,连桌面都快要被杀死,那普通应用能好到哪里去呢?可以从log中看到,发生anr的时候,Top进程的Cpu占用情况,user代表是用户空间,kernel是内核空间,一般的有如下的规。
2023-10-27 00:51:23 263
原创 2.android消息机制-native
它就是一个int值,又叫做句柄,在Linux中,打开或新建一个文件,它会返回一个文件描述符,读写文件需要使用文件描述符来指定待读写的文件,所以文件描述符就是指代被打开的文件,所有对这个文件的IO操作都要通过文件描述符。pollInner方法返回一个int值result,代表着本次轮询是否成功处理了消息,当result不等于0时,就会跳出循环,,等到下一个消息到达(mWakeEventFd会往管道写入字符)或监听的其他事件发生时就会唤醒线程,然后处理消息,只要epoll_wait方法返回后,都会进入。
2023-05-19 23:54:53 598
原创 6.关于系统服务的思考—— native vs java
app与FregService .activity onCreate中。// 获得一个名称为“ freg ”的服务的 Binder 代理对象接口。java 服务 app 系统应用 三方应用。hal 服务可以直接给app调用。
2023-02-19 20:43:47 380
原创 linux ipc
消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题共享内存区:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存信号: 传递字符串消息只能在同一程序下的进程间信号量:不能传递复杂消息,只能用来同步 ,通常配合消息队列、共享内存使用。
2023-02-14 01:39:01 193
原创 深入理解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 807
原创 4. 添加Java服务
定义aidl接口}frameworks/base/Android.bp framework-defaults 模块中添加我们刚刚加的 aidl 文件mm成功,会有hello目录IHelloService.java。
2022-11-04 01:19:22 533
原创 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 527
原创 UML 类图
可以理解为继承,标准解释: is-a 关系,实现继承抽象类,实现接口,都属于实现关联一个类知道另一个类的属性和方法聚合整体和部分的关系,部分可以离开整体,如汽车 引擎,轮胎组合整体和部分的关系,部分不能离开整体单独存在,公司 部门依赖局部变量,方法,参数或者对静态方法的调用各关系强弱 泛化=实现>组合>聚合>关联>依赖—继承6. 电脑是可处理计算机这个概念的一种实现——实现关系...
2022-06-28 22:56:42 154
原创 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 195
原创 io模型初探
操作系统负责计算机的资源管理和进程调度。应用需要经过操作系统,才能做一些特殊操作,如磁盘读写,内存读写等。应用程序要把数据写入磁盘,只能通过调用操作系统开放出来的API来操作。应用程序在用户空间,不存在实质的io过程,真正的io在操作系统执行,应用程序发起一次IO操作包含两个阶段:操作系统内核完成IO操作还包括两个过程:其实io就是把进程内部数据转移到外部设备,或者把外部设备的数据迁移到进程内部。外部设备一般指 硬盘,socket通讯的网卡。一个完整的io过程包括这几个步骤知道什么是io了,什么是阻塞io
2022-06-27 00:13:46 253
原创 3.volatile域
有时仅仅为了读写一个或者两个实例域就使用同步的话,显得开销过大,volatile关键字为实例域的同步访问提供了免锁的机制。如果声明一个域为volatile,那么编译器和虚拟机就知道该域是可能被另一个线程并发更新的。再讲到volatile关键字之前我们需要了解一下内存模型的相关概念以及并发编程中的三个特性:原子性,可见性和有序性1.内存模型 原子性 可见性 有序性1.1 JMM在 java 中,所有实例域、静态域和数组元素存储在堆内存中,堆内存在线程之间共享(本文使用“共享变量”这个术语代指实例域,
2022-05-19 16:12:05 132
原创 2. java并发编程-同步
文章目录1. 锁对象2. 条件对象3. Synchronized关键字4. 同步阻塞http://liuwangshu.cn/java/concurrent/2-synchronous.html在多线程的应用中,两个或者两个以上的线程需要共享对同一个数据的存取。如果两个线程存取相同的对象,并且每一个线程都调用了修改该对象的方法,这种情况通常成为竞争条件。比如买火车票看看一个银行转账的例子1. 锁对象synchronized关键字自动提供了锁以及相关的条件,大多数需要显式锁的情况使用synchron
2022-05-19 15:59:47 140
原创 1. java并发编程-线程定义、状态和属性
基本用法参考多线程1. 进程和线程线程 是指程序在执行过程中,能够执行程序代码的一个执行单元。在java语言中,线程有四种状态:运行 、就绪、挂起和结束。进程 是指一段正在执行的程序。而线程有时也被成为轻量级的进程,他是程序执行的最小单元,一个进程可以拥有多个线程,各个线程之间共享程序的内功空间(代码段、数据段和堆空间)及一些进程级的资源(例如打开的文件),但是各个线程都拥有自己的棧空间。为何使用多线程?从操作系统角度看主要一下几个方面:使用多线程可以减少程序的响应时间,如果某个操
2022-05-19 15:54:27 138
原创 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 2262
原创 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 2655 1
原创 1.java系统服务初识-vibrate
1. 一个简单的系统服务Android开发过程中经常会用到各种各样的系统管理服务,如进行窗口相关的操作会用到窗口管理服务WindowManager,进行电源相关的操作会用到电源管理服务PowerManager,还有很多其他的系统管理服务,如通知管理服务NotifacationManager、振动管理服务Vibrator、电池管理服务BatteryManager…… 这些Manager提供了很多对系统层的控制接口。对于App开发者,只需要了解这些接口的使用方式就可以方便的进行系统控制,获得系统各个服务的信
2022-04-15 00:24:17 558
原创 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 550
原创 android中的jni两种注册时机 base/core/jni & base/service/core/jni
https://www.jianshu.com/p/91321134207b下一篇文章目录1基本要点2. android 中的jni2.1Framework base/core/jni 机制2.2 service的jni (另外一种方式)1基本要点JavaVM:表示Java虚拟机。JNIEnv:表示JNI环境的上下文,例如注册、查找类、异常等。jclass:在JNI中表示的Java类。jmethodID:在JNI中表示的Java类中的方法。jfiledID:在JNI中表示的Java类中的属
2022-02-13 21:33:54 1761
原创 Linux进程管理
1.1 进程由来操作系统进行资源分配和调度的一个独立单位,1.2 进程描述符进程是操作系统中调度的实体,需要对进程所必须拥有的资源做抽象描述,这种抽象描述叫进程控制块,Process Control Block PCB,需要描述的信息进程运行状态:就绪 运行 等待阻塞 僵尸程序计数器:记录当前进程运行到哪条指令了cpu寄存器:主要保存当前运行的上下文,记录cpu所有必须保存下来的寄存器信息,一遍调度出去之后还能调度回来继续运行cpu调度信息:进程优先级,调度队列,调度相关信息内存管理信息
2021-06-29 23:45:08 259 1
原创 Linux 内存管理
1.1 远古时代单道编程:整个系统只有一个用户进程和一个操作系统。用户程序总是加载到同一个内存地址上运行,不需要地址保护。缺点有三无法运行比实际物理内存大的程序系统只运行一个程序,造成资源浪费无法迁移到其他计算机多道编程:系统同时运行多个进程。内存管理中出现了,固定分区和动态分区固定分区:在系统编译阶段内存被划分成许多静态区,进程可以装入大于或者等于自身大小的分区。实现简单,操作系统管理开销较小,缺点也很明显:程序大小和分区大小必须匹配活动进程的数目固定地址空间无法增长。动
2021-06-27 19:10:56 81
原创 java编译&运行
//MainApp.java public class MainApp { public static void main(String[] args) { Animal animal = new Animal("Puppy"); animal.printName(); } } //Animal.java public class Animal { public String name; public A
2021-06-27 18:10:49 294 1
原创 java内存结构
jvm内存结构1 jvm结构详解1.2 堆 Heap1.2 方法区 Method Area1.3 程序计数器 Program Counter1.4 虚拟机栈 JVM Stacks2 Java8 内存变化2.1 永久代2.2 元空间 Metaspace2.3 永久代为什么被替换1 jvm结构详解1.2 堆 Heap特点堆内存最大堆线程共享堆的目的就是存放对象,几乎所有的对象实例都在此分配,当然随着优化技术更新,某些数据会放在栈上因为堆占用空间最大,堆也是java垃圾回收的主要区域,也称为G
2021-06-04 22:22:13 69
listview图片卡顿 左右滑动的时候,PagerSlidingTabStrip开源
2016-05-20
TA创建的收藏夹 TA关注的收藏夹
TA关注的人