android系统源码阅读笔记
文章平均质量分 91
记录日常工作中个人阅读系统源码或者开源项目后的理解
好久没来过
这个作者很懒,什么都没留下…
展开
-
update_engine简介
近期猛然发现公司的项目都已经换成了AB升级,AB升级之前一直有所了解,只是一直都没有去仔细查看过其具体升级流程,这两天捋了捋,简单整理下。AB升级(谷歌官网叫法无缝更新)是自android7.0开始新增的一种android设备升级方式,只是这种方式对设备存储要求高,所以之前没有怎么被国内手机厂商采用。简而言之:系统同时存在两套system分区,一套处于休眠状态不可使用,一套处于使用状态,两者通过slot的概念来做区分,在设备启动引导阶段通过特殊标记位确定启动哪个system,当有可用升级版本时候,客原创 2021-02-25 23:43:39 · 4835 阅读 · 2 评论 -
Doze模式简介
Doze模式是自Android 6.0开始引入的两项省电功能的其中之一,还有一个就是appstandby,通过管理应用在设备未连接至电源时的行为方式,帮助用户延长电池寿命。当用户长时间未使用设备时,低电耗模式会延迟应用的后台 CPU 和网络活动,从而降低耗电量。应用待机模式会延迟用户近期未与之交互的应用的后台网络活动。当设备处于低电耗模式时,应用对某些高耗电量资源的访问会延迟到维护期。如果用户未插接设备的电源,在屏幕关闭的情况下,让设备在一段时间内保持不活动状态,那么设备就会进入低电耗模式。在低电耗模式原创 2021-02-18 23:21:52 · 13182 阅读 · 1 评论 -
android系统更新原理简介
简介:Android系统更新简而言之就是将升级包从服务器下载到本地然后对当前系统进行升级的过程,主要包括三大块:升级包、应用层、recovery层。主要功能流程如下如所示:升级包:版本编译完成后会生成target_file,这里的名称是:ota_target,升级包就是使用源版本的target_file跟目标版本的target_file通过imgdiff/bsdiff工具完成两个img文件的对比差分,做出升级所需的.new.dat、.patch.dat、.transfer.list文件,目原创 2020-11-24 23:16:36 · 3477 阅读 · 6 评论 -
android输入法架构解析
android输入法架构解析简介:前阵子接手维护了一个密码键盘的项目,之前还没有接触过android输入法这块的知识点,所以在熟悉项目的同时将android系统输入法实现框架整理了一遍,记录在此.整个输入法架构可以简单划分为主要三块:1.android输入法管理服务InputMethodManagerService(IMMS)2.android输入法管理InputMethodManager(IMM)与当前输入控件(EditText)3.输入法IME 简要示意图如下:几个主要类关系图如下:原创 2020-10-18 13:30:16 · 2769 阅读 · 0 评论 -
SettingsProvider源码流程解析
简介:前阵子遇到个问题,OTA升级之后设置中的默认设置项发生了改变,后来查找发现设置中该设置项是通过读取系统数据库中的数据来决定选项是否开启,所以顺带查看了一下SettingsProvider源码,后来发现问题跟SettingsProvider没关系,但还是抽时间将阅读内容整理记录下来。模块总览:该模块主要用于记录一些重要的系统数据,模块代码位于:\frameworks\base\packages\SettingsProvider代码不多,就几个java文件,围绕一个SettingsProvide原创 2020-05-16 20:56:45 · 1222 阅读 · 1 评论 -
android绘制draw流程分析
概述:之前分析过一个activity的启动到显示流程,具体显示流程中分析过测量与布局流程,这里对具体的绘制渲染流程进行具体的分析。绘制的起始还是从ViewRootImpl开始,在进入到view之后会根据根据是否有边缘效果稍作区分主要包括以下几点:绘制背景如果存在边缘效果的话,保存画布图层用于给边缘效果做准备调用ondraw实现具体的绘制流程绘制子view如果存在边缘效果的话,绘制边缘...原创 2020-04-03 18:43:18 · 901 阅读 · 0 评论 -
总结activity启动过程中View,ViewRootImpl关系
近段时间查看android的布局流程一块代码时间较多,发现频繁使用到一个类ViewRootImpl,加之曾经有仔细分析过activity启动过程,和activity的setContentView之后的显示过程,但是一直没有作为一个整体连贯起来,后来在分析布局流程中,发现诸多疑惑比如:ViewRootImpl是怎样跟布局中的所有子View关联起来的View中的mAttachInfo什么时候初始...原创 2020-03-24 18:37:05 · 1707 阅读 · 1 评论 -
基于FrameLayout的onLayout分析
概述:之前分析过activity调用setContentView之后的流程和基于FrameLayout的onMeasure流程分析,onMeasure流程走完之后,布局文件中的各个控件的宽度和高度就都测量完成了,接下来就是布局了,布局的功能就是确定每个控件的摆放位置,这里也就是上下左右,left,top,bottom,right。这一步进行完成后控件在屏幕上的位置就确定了,如下是流程图:调用...原创 2020-03-19 16:58:06 · 448 阅读 · 0 评论 -
基于FrameLayout的onMeasure分析
概述:之前有分析过activity的显示流程,activity页面是油DecorView来承载,而DecorView是继承自FrameLayout,在activity中调用setContentView后,经过LayoutInflater的解析将布局中的view元素解析出来,最后在onresume过程中,经过一系列的计算后调用到FrameLayout的measure方法对当前页面上的所有view进...原创 2020-03-08 19:02:02 · 581 阅读 · 0 评论 -
嵌套滑动机制与recycleview惯性滑动更新流程
概述实际项目中通常用到recyclerview的地方,都会有一些嵌套滑动的功能在里面,本篇基于recyclerview的点击事件,对recyclerview中的嵌套滑动流程和recyclerview自身滑动过程界面更新流程进行分析。嵌套滑动嵌套滑动主要涉及如下几个类NestedScrollingChildNestedScrollingParentNestedScrollingChil...原创 2020-03-05 16:57:58 · 968 阅读 · 0 评论 -
recycleview源码走读
之前项目中大量使用了recycleview,现在乘着空闲时间查阅源码,记录如下。recycleview使用总览recycleview大量使用在需要展现列表的项目中,通常的使用方式如下:1、定义adapter2、在布局文件中添加recycleview3、在activity或者fragment中初始化recycleview,为其设置adapter、layoutmanager。4、获取数据后...原创 2020-02-10 19:50:23 · 213 阅读 · 0 评论 -
setContentView到界面显示流程
activity界面显示流程相关文件路径:\frameworks\base\core\java\android\app\Activity.java\frameworks\base\services\core\java\com\android\server\policy\PhoneWindowManager.java\frameworks\base\core\java\android\vie...原创 2019-12-21 18:24:44 · 400 阅读 · 0 评论 -
handler发送延迟处理消息的原理
handler实现消息延迟发送的原理handler每次发送消息,不管是否发送空消息,最终都会调用到如下方法中: public final boolean sendMessageDelayed(Message msg, long delayMillis) { if (delayMillis < 0) { delayMillis = 0;...原创 2019-12-21 15:08:35 · 4331 阅读 · 1 评论 -
SwipeRefreshLayout实现原理解析
概述:下拉刷新在实际项目中使用到的频次很高,尤其是带列表的界面中,几乎有列表就会有下拉刷新的功能出现,网上开源的下拉刷新库也较多如PullToRefresh等,近期查看了google提供的SwipeRefreshLayout下拉刷新库,因其功能强大,代码结构简单,便于修改自定义(事实上有很多开源的下拉刷新库也是基于该库进行的修改),专门查看了其实现逻辑,简单记录下来。涉及文件路径:\fram...原创 2019-12-04 21:06:41 · 566 阅读 · 0 评论 -
Glide内存占用优化
Glide内存占用优化近期项目中选用glide作为图片加载工具,布局采用NestedScrollView嵌套RecyclerView实现,recycleview中的条目有张图片,通过glide添加,RecyclerView不断下滑不断加载更多item,随着recycleview中的item数量的不断增加,应用内存不断增长直至最后OOM退出查找发现内存暴涨是因为recyvleview中的item...原创 2019-10-12 19:02:56 · 4355 阅读 · 0 评论 -
app报错处理流程
app报错处理流程在android应用进程启动流程中,进程启动之初,在RuntimeInit中:private static final void commonInit() { if (DEBUG) Slog.d(TAG, "Entered RuntimeInit!"); /* set default handler; this applies to all ...原创 2019-03-07 10:37:41 · 1295 阅读 · 0 评论 -
MediaPlayer源码流程简要分析
涉及文件目录:\frameworks\base\media\java\android\media\MediaPlayer.java\frameworks\base\media\jni\android_media_MediaPlayer.cpp\frameworks\av\include\media\mediaplayer.h\frameworks\av\media\libmedia\med...原创 2019-07-20 15:31:04 · 705 阅读 · 0 评论 -
android动画总结
android动画总结android动画大致可以分为两类,一类是通过播放多张图片的帧动画,另一类就是通过设置和修改控件属性达到动画的目的。帧动画1、通过xml文件设置帧动画<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"&...原创 2019-07-29 22:07:44 · 185 阅读 · 0 评论 -
android缓存实现分析
内存缓存分析内存缓存主要用于将可能随时需要再次使用的对象暂时添加到一个本地缓存管理中,LruCache是android系统中自带的一个缓存管理类,以下将分析具体分析LruCache的原理:LinkedHashMap是一个数组加双向链表的结构,LruCache主要利用LinkedHashMap的有序性,将对象保存在其中,观察如下代码: // 第三个参数用于指定accessOrder值 ...原创 2019-07-29 22:25:28 · 213 阅读 · 0 评论 -
android点击事件在activity中的传递流程
概述当手指点击屏幕时候,linux就会接收到对应的事件中断,然后将这些中断事件包装成输入事件写入到相应的设备节点中,android输入系统所进行的操作大致来说就是监控这些设备节点,当有数据可读时候就读取这些数据,将其翻译成点击事件,然后寻找到合适的窗口,将其派发下去。一个点击事件的传递流程当产生一个点击事件后,首先在ViewRootImpl的WindowInputEventReceiver中...原创 2019-07-29 22:41:36 · 2219 阅读 · 0 评论 -
MediaPlayerService流程简要分析
涉及相关文件:\frameworks\av\media\mediaserver\mediaserver.rc\frameworks\av\media\mediaserver\main_mediaserver.cpp\frameworks\av\media\libmediaplayerservice\MediaPlayerService.h\frameworks\av\media\libme...原创 2019-07-20 15:37:52 · 1197 阅读 · 0 评论 -
nuplayer播放流程简略分析
涉及相关文件路径:\frameworks\av\media\libmediaplayerservice\nuplayer\NuPlayer.cpp\frameworks\av\media\libmediaplayerservice\nuplayer\NuPlayer.h\frameworks\av\media\libmediaplayerservice\nuplayer\NuPlayerDe...原创 2019-07-20 15:45:45 · 1883 阅读 · 0 评论 -
android inputmanager中事件的传递流程
涉及文件路径:frameworks\base\services\core\java\com\android\server\input\InputManagerService.javaframeworks\base\core\java\android\view\InputChannel.javaframeworks\base\core\jni\android_view_InputChannel...原创 2019-08-03 13:13:58 · 1991 阅读 · 0 评论 -
android内存泄露处理总结
android内存泄露处理总结导致android发生内存泄露的原因,主要跟activity的生命周期有关,如果某个类持有activity的引用,且它的生命周期是要长于activity的生命周期的,这时就会导致内存泄露。JVM判断对象是否可以回收主要通过两个算法,引用计数法与可达性分析法,从引用计数法来看,activity的引用依然被其他类所持有,所以不能回收,从可达性分析,此时activity...原创 2019-10-08 19:48:19 · 318 阅读 · 0 评论 -
sharedpreference实现源代码走读
sharedpreference实现源代码走读1、sharedpreference的使用:SharedPreferences sh = getSharedPreferences("shared.xml",0);int testValue = sh.getInt("testValue",0);SharedPreferences.Editor ed = sh.edit();ed.putInt...原创 2019-03-08 14:34:47 · 245 阅读 · 0 评论 -
PowerManager服务流程分析
1、涉及主要代码:frameworks\base\core\java\android\os\PowerManager.javaframeworks\base\core\java\android\os\PowerManagerInternal.javaframeworks\base\services\core\java\com\android\server\power\PowerManager...原创 2019-03-08 14:34:20 · 952 阅读 · 0 评论 -
okhttp代码流程走读
1、使用示例:同步方法:OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url(url) .build(); try { Response response = client.newCall(req...原创 2019-03-07 10:38:42 · 141 阅读 · 0 评论 -
installd进程流程分析
installd服务启动在systemserver中installer服务作为一个重要服务在:startBootstrapServices中启动:// Wait for installd to finish starting up so that it has a chance to // create critical directories such as /data/us...原创 2019-03-07 10:38:15 · 2950 阅读 · 0 评论 -
eventbus源码走读
1、eventbus的使用在activity的oncreate和ondestroy中注册和解除注册,在需要接收数据处理的方法上使用@subscribe注解,在发送数据出使用post。eventbus相比android内部广播优势在于,使用起来十分简洁,不需要像广播那种的注册,可携带数据量也比广播要多,广播仅可携带string、int等简单类型数据参数,eventbus可传递实体类,列表等数据。...原创 2019-03-07 10:37:58 · 117 阅读 · 0 评论 -
AppOpsService服务流程分析
1、概述:appops是在现有权限机制上新增的一套权限管理机制,主要针对一些高危的非必须系统应用的权限,比如在其他应用上显示悬浮窗。</br>2、服务启动:appops服务在ActivityManagerService服务启动的时候一同启动: mAppOpsService = mInjector.getAppOpsService(new File(syste...原创 2019-03-07 10:37:24 · 3555 阅读 · 0 评论 -
android存储系统源码走读
android存储系统源码走读1、storageManagerservice的启动:在SystemServer的startOtherServices中,storageManagerservice启动。private void startOtherServices() { final Context context = mSystemContext; Vibra...原创 2019-03-07 10:37:00 · 813 阅读 · 0 评论 -
android 夜间模式
自7.0开始谷歌提供了夜间模式,用于将屏幕色彩调成较为柔和的琥珀色,但因该模式需要硬件的支持,所以不是所有设备上都可用,也不常见。相关代码:\frameworks\base\services\core\java\com\android\server\display\NightDisplayService.java\frameworks\base\core\java\com\android\i...原创 2019-03-07 10:36:36 · 1818 阅读 · 0 评论 -
android Handler机制简要分析
消息机制总览如果你想要让一个 Android 应用程序反应灵敏,那么你必须防止它的 UI 线程被阻塞。同样地,将这些阻塞的或者计算密集型的任务转到工作线程去执行也会提高程序的响应灵敏性。然而,这些任务的执行结果通常需要更新UI组件的显示,但该操作只能在UI线程中去执行。有一些方法解决了 UI 线程的阻塞问题,例如阻塞队列,共享内存以及管道技术。Android 为解决这个问题,提供了一种自有的消息...原创 2019-03-07 10:34:22 · 165 阅读 · 0 评论 -
Activity页面显示流程
1在activity的启动过程中,最后是通过ActivityStackSupervisor中的realStartActivityLocke方法将activity最终拉起,实现如下:final boolean realStartActivityLocked(ActivityRecord r, ProcessRecord app, boolean andResume, bo...原创 2019-03-07 10:33:16 · 1114 阅读 · 0 评论 -
watchdog工作流程
1、watchdog的产生在系统启动阶段,systemserver.java中startOtherServicesfinal Watchdog watchdog = Watchdog.getInstance();watchdog.init(context, mActivityManagerService);......省略各种服务启动代码在ActivityManagerService、...原创 2019-03-08 14:35:21 · 756 阅读 · 0 评论 -
通知栏显示流程
1、相关代码:frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\StatusBar.javaframeworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\NotificationListenerWithPlu...原创 2019-03-08 14:35:41 · 1199 阅读 · 0 评论 -
应用进程异常被kill后ams重新拉起机制分析
应用进程异常被kill后ams重新拉起机制分析在AMS中有用于专门接收进程消亡回调的类如下:private final class AppDeathRecipient implements IBinder.DeathRecipient { final ProcessRecord mApp; final int mPid; final IAppli...原创 2019-03-08 14:35:58 · 1265 阅读 · 0 评论 -
应用进程异常被kill后ams重新拉起机制分析
应用进程异常被kill后ams重新拉起机制分析在AMS中有用于专门接收进程消亡回调的类如下:private final class AppDeathRecipient implements IBinder.DeathRecipient { final ProcessRecord mApp; final int mPid; final IAppli...原创 2019-07-20 14:16:59 · 480 阅读 · 0 评论 -
zygote启动systemserver流程
涉及代码路径:\frameworks\base\cmds\app_process\app_main.cpp\frameworks\base\core\jni\AndroidRuntime.cpp\frameworks\base\core\java\com\android\internal\os\ZygoteInit.java\frameworks\base\core\java\com\an...原创 2019-03-12 19:04:58 · 624 阅读 · 0 评论 -
init进程解析init.rc文件流程
涉及相关文件:\system\core\init\init.cpp\system\core\init\action.cpp\system\core\init\action.h\system\core\init\import_parser.cpp\system\core\init\import_parser.h\system\core\init\init_parser.cpp...原创 2019-03-12 18:45:12 · 1167 阅读 · 0 评论