- 博客(35)
- 资源 (3)
- 收藏
- 关注
原创 Android Nougat多窗口简析
Android从7.0开始支持多窗口,官方终于支持这一功能了。其实很多ODM厂商早已实现该功能,实现方式各种各样,最通用的方案是多Stack方案,比较痛苦的是每次版本升级都要花很大力气进行适配和解各种乱七八糟的bug,现在终于一统江湖了,并且第三方应用开始对多窗口进行适配兼容。
2017-02-04 15:02:54
14816
3
原创 LayoutAnimation/LayoutTransition源码分析
LayoutAnimation Android的动画类型比较多,LayoutAnimation便是其中一种,关于LayoutAnimation的使用可参考《Android LayoutAnimation使用及扩展》,其实就是给目标ViewGroup控件添加LayoutAnimation,之后该ViewGroup展示时每个子View便会依次做动画。本质就是第一次绘制前给每个子Vie
2017-01-09 20:00:56
1506
原创 SQLiteConnectionPool学习笔记
最近碰到一个跟SQLiteConnectionPool相关的问题,然后就把这一块逻辑捋了一遍,做了一点笔记记录如下。 跟SQLiteConnectionPool相关的几个大类有:SQLiteDatabase、SQLiteConnection、SQLiteSession。一、SQLiteDatabase、SQLiteConnectionPool、SQLiteConnec
2016-02-25 23:13:17
10523
原创 Fragment流程图
Fragment本质上就是一套在所属Activity的窗口View树中添加、删除子View的管理逻辑,调用的接口是ViewGround.addView()和ViewGround.removeView(),并且Fragment的生命周期由所属Activity的生命周期所驱动。正因为无需重新创建Window,所需系统资源远小于创建新的Activity。一、Fragment部分类图关系:2、
2016-01-26 17:59:34
1372
原创 WindowManagerService动画分析
我们知道Android动画主要包括Activity切换动画、窗口动画、转屏动画、窗口内部View动画,前三者在WindowManagerService(简称WMS)中完成,本篇文章重点分析Activity切换动画、窗口动画的设置,动画每一帧计算,及如何快速分析动画类型资源。阅读本文最好有一定的WindowManagerService基础,本文所有代码基于AndroidM。 典
2015-10-20 16:44:34
13219
原创 kill -3 pid打印trace原理笔记
做系统稳定性问题分析,当遇到系统卡死时,我们经常要使用“kill -3 pid”来打印System_Server进程各个线程的Java调用栈,根据线程状态及调用栈来更进一步定位问题点,当然某个应该界面卡顿时间长时也可以通过这个命令来抓取Java调用栈进行分析。注意native进程是不能用kill -3来打trace的,而是使用debuggerd。但是某些时候打印不出来trace,要知道原因,自然要
2015-09-22 17:43:00
11558
原创 蓝牙压力测试报抛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
4217
原创 AsyncTask分析
AsyncTask的使用和原理分析网上有很多文章写得非常清楚,这里大概画了下时序图(不求准确),帮助理解。MyAsyncTask是自定义AsyncTask的子类,AsyncTask_Thread是线程池执行器创建的执行线程,线程以AsyncTask#count命名。相关文章分享:Android AsyncTask完全解析,带你从源码的角度彻底理解:http://bl
2015-08-14 16:46:03
943
原创 远程调试
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
906
原创 MountService整理
刚毕业时第一个接触的模块就是Vold,这个模块虽然小,但深入下去是有一定难度的。花了点时间重新整理了下这一块的逻辑,也当温习下这个模块。挂载核心在Vold,MountService相当于对外提供了一个服务接口。在Vold内部,FrameworkListener接收MountService发来的Socket消息,NetlinkListener接收Kernel发来的Uevent事件。Stora
2015-07-23 10:06:42
1198
原创 系统异常埋点
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
4219
原创 深入理解Activity——Token之旅
Token是ActivityRecord的内部静态类,我们先来看下Token的继承关系,Token extends IApplicationToken.Stub,从IApplicationToken.Stub类进行继承,根据Binder的机制可以知道Token是一个匿名Binder实体类,这个匿名Binder实体会传递给其他进程,其他进程会拿到Token的代理端。 我们知道匿名Binde
2015-07-09 17:15:02
14208
原创 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
2791
原创 Android 5.0重启恢复Task功能分析
Android5.0新增了一个重启后可恢复Task功能。在正常的Activity切换使用过程中AMS会将Task和对应截图进行保存,重启后会将Task和截图恢复到最近任务栏中。开机恢复Task没什么好说的,我们重点研究下Task和截图的保存逻辑,如下。我们重点分析下screenshotApplications()、notifyTaskPersisterLocked()、LazyTaskWr
2015-05-10 18:01:43
3382
原创 Lowmemorykiller笔记
从zygote孵化出来的进程都会记录在ActivityManagerService.mLruProcesses列表中,由ActivityManagerService进行统一管理,ActivityManagerService核心业务之一便是时时更新进程的状态,根据状态计算出进程对应的OomAdj值,这个值会传递到kernel中去,kernel有个低内存回收机制,在内存达到一定阀值时会触发清理OomA
2015-04-29 21:26:54
10926
原创 RenderThread学习笔记
文章记录自己对RenderThread学习过程,供日后回顾。我们知道5.0上为每个进程新增了一个RenderThread线程,这是一个附加的UI线程?我们通过学习这块代码来熟悉它。第一部分:RenderThread线程的启动RenderThread线程的启动过程如下图所示。涉及相关的类关系如下图:有两个注意点:①每一个窗口都对应唯一的一个Threaded
2015-04-19 20:18:24
22875
3
原创 NotificationManagerService笔记
Notification相关分析是基于5.0的代码。我们知道应用程序如果要在通知栏弹一个消息需要加上类似于下面这样的一段代码,看起来只有几行代码,实际上有两个比较大的框架在里面。一个是通过PendingIntent的静态函数getActivity()获取一个PendingIntent对象;一个是获取NotificationManagerService的服务代理对象调用notify()来post
2015-03-08 17:45:27
2522
原创 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
2409
2
原创 activity启动模式笔记
activity启动模式的逻辑主要在startActivityUncheckedLocked()函数中,现在来看下这个函数。 final int startActivityUncheckedLocked(ActivityRecord r, ActivityRecord sourceRecord, IVoiceInteractionSession voiceSe
2015-03-01 21:40:17
3704
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
4310
原创 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
3505
原创 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
2706
原创 appNotResponding()分析
ActivityManagerService.appNotResponding()在程序无响应、ANR时被调用,分析这个函数有有助于更好地理解日志中打印出的信息。 final void appNotResponding(ProcessRecord app, ActivityRecord activity, ActivityRecord parent, boolea
2015-01-16 20:30:03
6236
原创 Binder笔记
1、IServiceManager.c中提供了一个namespace android(android 命名空间)的defaultServiceManager()全局函数,这个函数会生成一个BpServiceManager单例对象,sp defaultServiceManager(){ if (gDefaultServiceManager != NULL) return gDefaul
2015-01-10 19:12:50
2127
原创 PackageManagerService笔记
1、系统开机时PackageManagerService()构造函数会调用readPermissions()解析etc/permissions目录下的xml文件,然后将配置信息分别进行保存:assign-permission项保存在mSystemPermissions队列中、library项保存在mSharedLibraries队列中、feature项保存在mAvailableFeatures中;
2014-12-10 20:08:07
5954
原创 InputMethod窗口、wallpaper窗口管理关键函数分析
1、addInputMethodWindowToListLocked() void addInputMethodWindowToListLocked(WindowState win) { int pos = findDesiredInputMethodWindowIndexLocked(true); if (pos >= 0) {
2014-12-06 15:47:14
2736
原创 Activity管理笔记
文章仅记录自己的一点理解,供日后参考。AMS管理四大组件外加进程管理,其中最庞大的算是Activity了吧。1、AMS中对ActivityStack划分为两类,其中一类是FrontStack,另一类刚好相反。 boolean isFrontStack(ActivityStack stack) { return !(stack.isHomeStack() ^ g
2014-09-17 15:56:57
11759
原创 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
3803
原创 Broadcast学习笔记
1、mIntentSenderRecords是一个PendingIntentRecord哈希表。一个PendingIntentRecord对象对应的是应用层的一个PendingIntent对象(延迟性的intent),其中包含send系列方法,主要用于触发PendingIntent的Intent行为。上层应用每获取一个PendingIntent对象时在AMS这边便会生成对应的PendingIn
2014-09-04 21:54:27
13432
JNI详解(书)
2013-04-11
Linux下jdk1.5
2013-03-14
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人