
Android系统
文章平均质量分 94
我叫菜鸡
Day day up.
展开
-
Activity启动3-startActivityLocked方法
int startActivityLocked(IApplicationThread caller, Intent intent, Intent ephemeralIntent, String resolvedType, ActivityInfo aInfo, ResolveInfo rInfo, IVoiceInteractionSessi...原创 2018-10-21 20:26:50 · 2553 阅读 · 2 评论 -
Activity启动2-startActivityMayWait方法
我们从上一节分析参数开始最终达到:result = mInterface.startActivityAndWait(null, null, intent, mimeType, null, null, 0, mStartFlags, profilerInfo, ...原创 2018-10-21 18:49:20 · 3195 阅读 · 0 评论 -
Activity启动1_参数解析
Am.javapublic static void main(String[] args) { (new Am()).run(args);}public void run(String[] args) { if (args.length < 1) { onShowUsage(System.out); return; } ...原创 2018-10-21 17:12:24 · 2476 阅读 · 0 评论 -
log分析
log分析用于定位一些无法断点调试的一些疑难杂症。所以需要熟悉bugreport到底有哪些内容,哪些模块都打印log。读完下文你会有不一样的认识。基于Android O源码命令:adb bugreport > bugreport.txt源码:#include <errno.h>#include <stdio.h>#include <sys/sock...原创 2018-10-14 19:48:22 · 3135 阅读 · 0 评论 -
Glide附件难点之上篇源码文章
注册Glide.Glide()GenericLoaderFactory的注册register(File.class, ParcelFileDescriptor.class, new FileDescriptorFileLoader.Factory());register(File.class, InputStream.class, new StreamFileLoader.Fact...原创 2018-10-14 14:44:53 · 304 阅读 · 0 评论 -
VirtualAPK滴滴插件化框架源码深入解读
初始化部分PluginManager.getInstance(base).init();保证单例private static volatile PluginManager sInstance = null;public static PluginManager getInstance(Context base) { if (sInstance == null) { ...原创 2018-06-12 19:45:02 · 532 阅读 · 0 评论 -
Android中窗口添加的过程
Window的分类系统级Window : z-ordered为 2000-2999应用层Window : z-ordered为 1-99子Window : z-ordered为 1000-1999根据下面谷歌的Android层级图可以看出来WindowManager是在framework层掌管Window的 从代码上看WindowManager是一个接口,此接口继承自...原创 2018-05-29 11:43:38 · 1294 阅读 · 0 评论 -
通过堆栈看事件传输
如何调试事件传输在自己Activity中打印下堆栈 @Override public boolean dispatchTouchEvent(MotionEvent ev) { Thread.dumpStack(); return super.dispatchTouchEvent(ev);}W/System.err: java.lang.Throwabl...原创 2018-04-10 15:13:20 · 557 阅读 · 0 评论 -
Hook技术(五)如何Hook系统中任意服务
获取服务&注册 ServiceManager.getService()public static IBinder getService(String name) { try { IBinder service = sCache.get(name); //先从缓存中查看 if (service != null) { ...原创 2018-03-15 15:48:58 · 6265 阅读 · 3 评论 -
Hook技术(四)对系统启动Activity进行Hook之偷梁换柱Activity
引出问题我们如果要启动一个activity,我们的做法是1. 在AndroidManifest.xml中声明一个Activity 2. startActivity,如果不在AndroidManifest.xml中声明,启动activity会报错(android.content.ActivityNotFoundException)。但是我们想,我们使用插件化,按照正常的思维是不是要将插件化中的所...原创 2018-03-12 18:05:05 · 2487 阅读 · 3 评论 -
apk资源打包过程分析
Android应用资源的分类assetsres animatoranimcolordrawablelayoutmenuraw:它们和assets类资源一样,都是原装不动地打包在apk文件中的,不过它们会被赋予资源ID java Resources res = getResources(); InputStream is = res .openRawResource(R.raw原创 2017-11-23 14:12:08 · 7104 阅读 · 0 评论 -
通过AMS.attachApplicationLocked()引入Binder.linkToDeath机制
当系统创建进程以后会调用AMS.attachApplicationLocked(),在这个方法内部会注册该进程的死亡回调//其中thread是ActivityThread通过夸进程通信获取Binder的代理对象,然后调用linkToDeath()AppDeathRecipient adr = new AppDeathRecipient(app, pid, thread);thread.asBin原创 2017-08-20 11:23:34 · 1376 阅读 · 0 评论 -
makefile编写
#设置当编译路径为当前文件夹所在路径LOCAL_PATH := $(call my-dir)#清空编译环境的变量(由其他模块设置过的变量)include $(CLEAR_VARS)其中:#BUILD_STATIC_LIBRARY:编译为静态库。 #BUILD_SHARED_LIBRARY :编译为动态库 #BUILD_EXECUTABLE:编译为Native C可执行程序 LOCAL_P原创 2017-08-14 20:21:30 · 598 阅读 · 0 评论 -
杀进程优先级
查看adj可以通过命令:adb shell//筛选进程ps | grep <包名|pid>//然后,其中oom_score_adj是内核计算过后的adjcat proc/<pid>/oom_score_adj 方法2adb shelldumpsys activity o//然后查看ProcessRecord中下面这些属性反应了oom_score_adj的值int maxAdj;原创 2017-08-14 20:20:08 · 1652 阅读 · 0 评论 -
Crash分析
adb shell//输出所有event_log中的tagcat /system/etc/event-log-tags 常用tag:am_low_memory:位于AMS.killAllBackgroundProcesses或者AMS.appDiedLocked,记录当前Lru进程队列长度。am_pss:位于AMS.recordPssSampleLocked(am_meminfo:位于AM原创 2017-08-14 20:19:15 · 4221 阅读 · 0 评论 -
标志性log关键词
adb shell//输出所有event_log中的tagcat /system/etc/event-log-tags 常用tag:am_low_memory:位于AMS.killAllBackgroundProcesses或者AMS.appDiedLocked,记录当前Lru进程队列长度。am_pss:位于AMS.recordPssSampleLocked(am_meminfo:位于AM原创 2017-08-14 20:18:11 · 891 阅读 · 0 评论 -
发生ANR之后的事情
触发ANR条件Service Timeout:前台服务20s内未完成执行,后台服务超过200sBroadcastQueue Timeout:前台广播在10s内未完成,后台广播超过60s未完成ContentProvider Timeout:内容提供者,在publish过超时10sInputDispatching Timeout: 输入事件分发超时5s,包括按键和触摸事件对应最后执行ANR记录原创 2017-08-06 12:59:48 · 1311 阅读 · 0 评论 -
adb中常用的命令
adb 命令大全原创 2017-08-04 08:49:19 · 837 阅读 · 0 评论 -
Binder里面的关系分析
前几张我们已经介绍了Binder通信从驱动层到Java层,但是我们还是感觉模模糊糊,所以写一篇文章专门理清楚Binder的关系。那这篇文章和之前写的Binder文章有什么不同呢? 主要有以下几点不同!这篇文章目的并不是以大量的代码为主,而是说明每个类还有核心方法的说明,然后进行组装。这篇文章尽可能少写或者不写驱动层,关于驱动层已经在Binder驱动那两篇文章中详细说明。C/S架构的基本理解首原创 2017-03-22 21:00:12 · 1040 阅读 · 0 评论 -
Zygote分析
Zygote进程是通过可执行文件app_process创建的,但是app_process除了能创建Zygote进程之外,还可以创建出普通进程。 今天就来说说,Zygote都做了那些事情,这个进程创建出了那些进程。Zygote是Android系统核心进程之一,是典型的C/S架构,其他程序给Zygote发送一个孕育请求,它就会创建出一个Activity进程。原创 2017-03-19 17:53:11 · 1551 阅读 · 0 评论 -
Binder大总结
我们这片文章从总体介绍了java到native,native到内核,内核到java的过程,希望有兴趣的读者不吝赐教。原创 2017-03-17 18:08:30 · 622 阅读 · 0 评论 -
从C代码出发写系统服务
这节我们通过自己写的hello服务,加入系统中运行,本节使用C代码,下次使用C++,下下次使用Java代码原创 2017-03-12 22:51:50 · 591 阅读 · 0 评论 -
Java层到Native层Binder的流程
我们在SystemServer分析这个文章中已经知道通过ServiceManager.addService("xx", new XXBinder(this));已经添加了很多服务,这些都是继承Binder的服务,需要跨进程操作。包括我们自己声明的服务也是一个道理,都是继承Binder。并且我们上一章已经介绍了添加服务和查询服务的底层流程,但是问题来了,他们都是native层的,没有java的代码出现原创 2017-03-12 14:23:41 · 1096 阅读 · 0 评论 -
分析BatteryService服务的获取过程
让我们从BatteryService入手查看这个Service的查询过程,因为Android系统的系统服务都是在加载的时候创建并且添加的,所以此时要想使用服务就得从service_manager中获取,所以我们今天就看看如何获取这些服务。原创 2017-03-12 00:25:15 · 903 阅读 · 0 评论 -
从MediaPlayerServic出发查看服务注册交互流程
我们上一节已经知道Binder的管理是在ServiceManager中,当然系统中有很多各式各样的服务,他们都要在ServiceManager进行注册,那么我们就用情景分析法,来看一看MediaPlayerService是如何注册在ServiceManager中。原创 2017-03-11 11:42:20 · 471 阅读 · 0 评论 -
Binder通信守护者ServiceManager
前面几章我们讨论了Binder驱动的核心实现,包括数据结构和跨进程操作方法。今天我们就在Android系统中看看整个实现的流程是什么样子,我们就从service_manager.c开始!可能有人要问了,为什么是service_manager.c而不是其他的,这里我需要说明一下,service_manager.c是整个系统管理Binder的代码,也是一个守护进程,并且自己就是一个binder。原创 2017-03-10 21:19:13 · 270 阅读 · 0 评论 -
小结Binder驱动
第一章,我们大致看了一下Binder跨进程传输数据中所需要的结构体。第二章节和第三章,大致看了一下Binder驱动层所需要的函数。 现在我们就先来小结一下前几章的内容,然后深入的理解驱动层重要的函数,进而为彻底了解驱动层打下基础。前面的内容那些要用到的结构体我们就不说了,我们我们谈一谈那些核心方法的顺序,和重中之重方法。启动顺序原创 2017-03-09 22:43:51 · 495 阅读 · 0 评论 -
Binder驱动(二)
上一小节我们介绍了驱动中的几个核心方法 - binder_open() - binder_mmap() - binder_ioctl() 这一节,我们探寻一下核心的结构体binder_write_read结构体,看看这个结构体是怎么样支撑进程间通信的输数据封装的。原创 2017-03-08 18:17:45 · 475 阅读 · 0 评论 -
Binder驱动(一)
前言: 我们这一节将介绍binder内核的核心方法,大概各自都干些什么事情。用户态和驱动态函数方法规则:用户态 驱动态open() -> binder_open()mmap() -> binder_mmap()ioctl() -> binder_ioctl()原创 2017-03-08 16:45:40 · 378 阅读 · 0 评论 -
Binder所用到结构体
理解binder结构体是理解Binder通信的第一步,后期将持续连载Binder内部实现机制。原创 2017-03-08 10:07:25 · 468 阅读 · 0 评论 -
Android系统Handler消息处理机制(二)
引言在Android系统Handler消息处理机制(一)这篇文章中说道,Activity中Looper是在ActivityThread中创建的主线程,当创建一个Handler的时候就得到当前线程的Looper对象,并得到mQueue队列.思考? 我们既然在Handler中得到属于当前主线程的Looper了,并且得到属于当前线程的mQueue队列了,那么我们用这个消息队列做什么?如何才能给消息队列原创 2017-03-01 22:07:36 · 268 阅读 · 0 评论 -
Android系统Handler消息处理机制(一)
前言: 我接触Handler第一次的时候就比较懵逼,Handler handler=new Handler()然后调用handler.sendEmptyMessage();就可以发送消息了,然后在Handler的回调中处理消息.当时只是单纯觉得是一个消息队列,从这边发送消息,那边是一个死循环接收消息,然后调用回调函数打印.仔细没多想,现在具体想了一下,看了源码,才知道并不是那么简单.那么具体那原创 2017-02-28 22:29:15 · 498 阅读 · 0 评论 -
Android中Log机制
Android中Log机制写Log过程 首先从Java层入手 下面是定义的Log级别: public static final int VERBOSE = 2; public static final int DEBUG = 3; public static final int INFO = 4; public static final int WARN原创 2017-02-16 14:16:34 · 3620 阅读 · 0 评论 -
Android输入系统(二)
Android输入系统(二)Android输入系统二启动InputManagerServiceInputManagerService构造函数1nativeInit11NativeInputManager111EventHub112InputManager1121InputDispatcher111211getDispatcherConfiguration1122InputReade原创 2017-02-13 15:53:58 · 415 阅读 · 0 评论 -
Android输入系统(一)
Android输入系统(一) 首先我们明白,在PC或者手机上我们都支持热插拔,比如现在有个键盘,现在键盘插入USB接口,就会检测到。那么系统怎么知道有设备插入,又怎么识别这个设备呢?Android输入系统一设备识别的两种方式储备知识一监测文件使用inotify函数流程测试方法使用epoll函数流程测试方法储备知识二通信使用socketpair函数流程测试方法设备识别的两种方式原创 2017-02-12 18:12:53 · 549 阅读 · 0 评论 -
SystemServer分析
SystemServerSystemServer1createSystemContext11systemMain12getSystemContext1121createSystemContext2startBootstrapServices21setSystemProcess3startCoreServices4startOtherServices总结那么大概又那些服务被启动了呢原创 2017-02-11 14:33:00 · 587 阅读 · 0 评论