android系统层
文章平均质量分 75
高山流水29
这个作者很懒,什么都没留下…
展开
-
NotificationManagerService笔记
Notification相关分析是基于5.0的代码。我们知道应用程序如果要在通知栏弹一个消息需要加上类似于下面这样的一段代码,看起来只有几行代码,实际上有两个比较大的框架在里面。一个是通过PendingIntent的静态函数getActivity()获取一个PendingIntent对象;一个是获取NotificationManagerService的服务代理对象调用notify()来post原创 2015-03-08 17:45:27 · 2482 阅读 · 0 评论 -
Binder笔记
1、IServiceManager.c中提供了一个namespace android(android 命名空间)的defaultServiceManager()全局函数,这个函数会生成一个BpServiceManager单例对象,sp defaultServiceManager(){ if (gDefaultServiceManager != NULL) return gDefaul原创 2015-01-10 19:12:50 · 2092 阅读 · 0 评论 -
Android 5.0重启恢复Task功能分析
Android5.0新增了一个重启后可恢复Task功能。在正常的Activity切换使用过程中AMS会将Task和对应截图进行保存,重启后会将Task和截图恢复到最近任务栏中。开机恢复Task没什么好说的,我们重点研究下Task和截图的保存逻辑,如下。我们重点分析下screenshotApplications()、notifyTaskPersisterLocked()、LazyTaskWr原创 2015-05-10 18:01:43 · 3329 阅读 · 4 评论 -
Lowmemorykiller笔记
从zygote孵化出来的进程都会记录在ActivityManagerService.mLruProcesses列表中,由ActivityManagerService进行统一管理,ActivityManagerService核心业务之一便是时时更新进程的状态,根据状态计算出进程对应的OomAdj值,这个值会传递到kernel中去,kernel有个低内存回收机制,在内存达到一定阀值时会触发清理OomA原创 2015-04-29 21:26:54 · 10775 阅读 · 1 评论 -
横屏机制
场景一.启动一个横屏应用原创 2014-10-27 10:45:32 · 7349 阅读 · 2 评论 -
Android匿名共享内存笔记
1、ashmem_open()static int ashmem_open(struct inode *inode, struct file *file){ struct ashmem_area *asma; int ret; ret = generic_file_open(inode, file); if (unlikely(ret)) return ret; asma原创 2015-03-06 14:39:51 · 2358 阅读 · 2 评论 -
activity启动模式笔记
activity启动模式的逻辑主要在startActivityUncheckedLocked()函数中,现在来看下这个函数。 final int startActivityUncheckedLocked(ActivityRecord r, ActivityRecord sourceRecord, IVoiceInteractionSession voiceSe原创 2015-03-01 21:40:17 · 3646 阅读 · 1 评论 -
Binder驱动笔记
Binder驱动笔记对于Binder驱动,可以一个个函数进行拆分学习,以管窥豹的方式进行理解。 以下函数分析都是基于驱动binder.c文件。1.binder_get_ref_for_node(target_proc,binder_node),该函数用来为Binder实体节点创建一个Binder引用节点,target_proc代表binder引用所在的进程。比如client获取service的Bin原创 2015-02-10 13:46:42 · 4234 阅读 · 1 评论 -
ActivityStackSupervisor分析
文章仅记录自己的一点分析过程,供日后原创 2014-10-12 19:35:16 · 16284 阅读 · 2 评论 -
PowerManagerService笔记
1、updateIsPoweredLocked() private void updateIsPoweredLocked(int dirty) { if ((dirty & DIRTY_BATTERY_STATE) != 0) { final boolean wasPowered = mIsPowered; final原创 2015-01-29 10:00:04 · 3489 阅读 · 0 评论 -
appNotResponding()分析
ActivityManagerService.appNotResponding()在程序无响应、ANR时被调用,分析这个函数有有助于更好地理解日志中打印出的信息。 final void appNotResponding(ProcessRecord app, ActivityRecord activity, ActivityRecord parent, boolea原创 2015-01-16 20:30:03 · 6197 阅读 · 0 评论 -
Android启动过程笔记
1、借用一张别人的启动流程图先直观感受下:注意:zygote和servicemanager都是在init进程解析init.rc时启动的。zygote进程的入口是/system/bin/app_process,入口函数是App_main.cpp的main()函数。service zygote /system/bin/app_process -Xzygote /system/bin -原创 2015-01-21 22:03:24 · 2664 阅读 · 0 评论 -
RenderThread学习笔记
文章记录自己对RenderThread学习过程,供日后回顾。我们知道5.0上为每个进程新增了一个RenderThread线程,这是一个附加的UI线程?我们通过学习这块代码来熟悉它。第一部分:RenderThread线程的启动RenderThread线程的启动过程如下图所示。涉及相关的类关系如下图:有两个注意点:①每一个窗口都对应唯一的一个Threaded原创 2015-04-19 20:18:24 · 22727 阅读 · 3 评论 -
Shutdown(关机)流程
梳理了下关机流程,比开机流程简单很多,大概流程如下:原创 2015-06-22 11:29:11 · 1325 阅读 · 0 评论 -
开发者选项中动画时长原理分析(Android M)
Android Animation原创 2016-01-04 21:12:57 · 16712 阅读 · 4 评论 -
Fragment流程图
Fragment本质上就是一套在所属Activity的窗口View树中添加、删除子View的管理逻辑,调用的接口是ViewGround.addView()和ViewGround.removeView(),并且Fragment的生命周期由所属Activity的生命周期所驱动。正因为无需重新创建Window,所需系统资源远小于创建新的Activity。一、Fragment部分类图关系:2、原创 2016-01-26 17:59:34 · 1333 阅读 · 0 评论 -
Broadcast学习笔记
1、mIntentSenderRecords是一个PendingIntentRecord哈希表。一个PendingIntentRecord对象对应的是应用层的一个PendingIntent对象(延迟性的intent),其中包含send系列方法,主要用于触发PendingIntent的Intent行为。上层应用每获取一个PendingIntent对象时在AMS这边便会生成对应的PendingIn原创 2014-09-04 21:54:27 · 13389 阅读 · 1 评论 -
service学习笔记
smap.mServicesByName.put(name, r);原创 2014-09-15 21:47:04 · 4314 阅读 · 0 评论 -
Activity管理笔记
文章仅记录自己的一点理解,供日后参考。AMS管理四大组件外加进程管理,其中最庞大的算是Activity了吧。1、AMS中对ActivityStack划分为两类,其中一类是FrontStack,另一类刚好相反。 boolean isFrontStack(ActivityStack stack) { return !(stack.isHomeStack() ^ g原创 2014-09-17 15:56:57 · 11721 阅读 · 1 评论 -
SQLiteConnectionPool学习笔记
最近碰到一个跟SQLiteConnectionPool相关的问题,然后就把这一块逻辑捋了一遍,做了一点笔记记录如下。 跟SQLiteConnectionPool相关的几个大类有:SQLiteDatabase、SQLiteConnection、SQLiteSession。一、SQLiteDatabase、SQLiteConnectionPool、SQLiteConnec原创 2016-02-25 23:13:17 · 10390 阅读 · 0 评论 -
kill -3 pid打印trace原理笔记
做系统稳定性问题分析,当遇到系统卡死时,我们经常要使用“kill -3 pid”来打印System_Server进程各个线程的Java调用栈,根据线程状态及调用栈来更进一步定位问题点,当然某个应该界面卡顿时间长时也可以通过这个命令来抓取Java调用栈进行分析。注意native进程是不能用kill -3来打trace的,而是使用debuggerd。但是某些时候打印不出来trace,要知道原因,自然要原创 2015-09-22 17:43:00 · 11447 阅读 · 0 评论 -
InputMethod窗口、wallpaper窗口管理关键函数分析
1、addInputMethodWindowToListLocked() void addInputMethodWindowToListLocked(WindowState win) { int pos = findDesiredInputMethodWindowIndexLocked(true); if (pos >= 0) {原创 2014-12-06 15:47:14 · 2680 阅读 · 0 评论 -
WindowManagerService动画分析
我们知道Android动画主要包括Activity切换动画、窗口动画、转屏动画、窗口内部View动画,前三者在WindowManagerService(简称WMS)中完成,本篇文章重点分析Activity切换动画、窗口动画的设置,动画每一帧计算,及如何快速分析动画类型资源。阅读本文最好有一定的WindowManagerService基础,本文所有代码基于AndroidM。 典原创 2015-10-20 16:44:34 · 13121 阅读 · 7 评论 -
Dalvik和ART简介
1、classes.dex文件初识 我们先把QQ_236.apk后缀改为QQ_236.zip,然后解压,发现有一个classes.dex文件,这个classes.dex是java源码编译后生成的java字节码文件.但由于Android使用的dalvik虚拟机与标准的java虚拟机是不兼容的,dex文件与class文件相比,不论是文件结构还是opcode(机器语言操作码)都不一样.原创 2015-07-02 14:33:36 · 2756 阅读 · 0 评论 -
深入理解Activity——Token之旅
Token是ActivityRecord的内部静态类,我们先来看下Token的继承关系,Token extends IApplicationToken.Stub,从IApplicationToken.Stub类进行继承,根据Binder的机制可以知道Token是一个匿名Binder实体类,这个匿名Binder实体会传递给其他进程,其他进程会拿到Token的代理端。 我们知道匿名Binde原创 2015-07-09 17:15:02 · 14131 阅读 · 2 评论 -
AsyncTask分析
AsyncTask的使用和原理分析网上有很多文章写得非常清楚,这里大概画了下时序图(不求准确),帮助理解。MyAsyncTask是自定义AsyncTask的子类,AsyncTask_Thread是线程池执行器创建的执行线程,线程以AsyncTask#count命名。相关文章分享:Android AsyncTask完全解析,带你从源码的角度彻底理解:http://bl原创 2015-08-14 16:46:03 · 923 阅读 · 0 评论 -
系统异常埋点
DropBox会在以下时机抓取相关信息:a、出异常关机前SystemServer会收集以下类型报错:watchdog、anr、wtf、lowmem、native_crash、crashTAG = watchdog、anr、wtf、lowmem、native_crash、crash此时是通过ActivityManagerService.addErrorToDr原创 2015-07-10 17:42:57 · 4182 阅读 · 0 评论 -
远程调试
1、adb shell netcfgguoqifa@guoqifa:~$ adb shell netcfgwlan0 UP 172.29.107.21/21 0x00001043 00:08:22:7e:a1:fetunl0 DOWN 0.0.0原创 2015-08-03 17:33:48 · 862 阅读 · 0 评论 -
ContentProvider笔记
final class BroadcastRecord extends Binder { final Intent intent; // the original intent that generated us final ComponentName targetComp; // original component name set on the intent f原创 2014-09-10 18:01:00 · 3773 阅读 · 0 评论 -
蓝牙压力测试报抛android.os.TransactionTooLargeException异常分析总结
1、从main日志中找到异常点,如下:08-20 11:05:19.754 5023 5023 E AndroidRuntime: FATAL EXCEPTION: main08-20 11:05:19.754 5023 5023 E AndroidRuntime: Process: com.android.bluetooth, PID: 502308-20 11:05:19.75原创 2015-08-21 20:39:28 · 4172 阅读 · 1 评论 -
Android Nougat多窗口简析
Android从7.0开始支持多窗口,官方终于支持这一功能了。其实很多ODM厂商早已实现该功能,实现方式各种各样,最通用的方案是多Stack方案,比较痛苦的是每次版本升级都要花很大力气进行适配和解各种乱七八糟的bug,现在终于一统江湖了,并且第三方应用开始对多窗口进行适配兼容。原创 2017-02-04 15:02:54 · 14660 阅读 · 9 评论 -
Process学习
每个进程在AMS侧对应有一个原创 2014-09-16 21:58:28 · 7184 阅读 · 3 评论