Gityuan

Keep on going never give up

[置顶]Android 操作系统架构开篇

基于Android 6.0或更高版本的源码,专注于分享Android系统原理、架构分析的原创文章,这是Android系列文章的开篇。

[置顶]Flutter 跨平台演进及架构开篇

基于Flutter 1.5.4或更高版本的源码,专注于分享Flutter引擎、框架、虚拟机等架构与原理解读的原创文章。

理解Android.bp

介绍Android最新的编译系统 一、简介 早期的Android系统都是采用Android.mk的配置来编译源码,从Android 7.0开始引入Android.bp。很明显Android.bp的出现就是为了替换掉Android.mk。 再来说一说跟着Android版本相应的发展演变过程: Android 7.0引入ninja和kati Android 8.0使用A...

解读Android进程优先级ADJ算法

本文基于原生Android 9.0源码来解读进程优先级原理,基于篇幅考虑会精炼部分代码 一、概述 1.1 进程 Android框架对进程创建与管理进行了封装,对于APP开发者只需知道Android四大组件的使用。当Activity, Service, ContentProvider, BroadcastReceiver任一组件启动时,当其所承载的进程存在则直接使用,不存在则由框架代码自...

Binder Driver缺陷导致定屏的案例

本文讲解异步binder call是如何阻塞整个系统的,通过ramdump信息以及binder通信协议来演绎并还原定屏现场。 一、背景知识点 解决此问题所涉及到的基础知识点有:Trace、CPU调度、Ramdump推导、Crash工具、GDB工具、Ftrace, 尤其深入理解binder IPC机制。 1.1 工具简介 Trace:分析死锁问题的最基本的技能,通过kill -3...

系统角度解读Android P新特性

引言 2018年3月8日,谷歌发布了Android P的预览版,预计今年的Q3季度发布final release版本,有不少文章从开发者角度介绍了Android P的新特征,初步来看给感觉这次大版本似乎并没有什么改变。接下来,将从系统Treble,System,Framework,Runtime, Security等多方面来解读一下Android P的变化。 Treble计划 Treb...

深度剖析APP保活案例

这是作者在去年处理的一个关于进程保活的案例 一. 引言 1.1 保活概述 什么是保活?保活就是在用户主动杀进程,或者系统基于当前内存不足状态而触发清理进程后,该进程设法让自己免于被杀的命运或者被杀后能立刻重生的手段。 保活是”应用的蜜罐,系统的肿瘤“,应用高保活率给自己赢得在线时长,甚至做各种应用想做而用户不期望的行为,给系统带来的是不必要的耗电,以及系统额外的性能负担。 保...

跑monkey压力测试过程的冻屏案例

这是作者在2017年处理的monkey相关的冻屏案例 一、引用 这个问题经常在跑monkey出现, 普通用户端不会出现这个问题(发烧友刷带有root的版本或者内部root版本除外), 也没有真正花精力去分析. 但这个问题 困扰了测试同事 有一段时间了, 这次花精力认真研究了下这个问题的前因后果. 问题现象就是monkey压力测试一段时间后会出现冻屏,有时候一直冻着,有时候居然还...

数组越界导致系统重启的案例

这是作者在2017年处理的数组越界的案例,要理解该问题需熟练掌握以下知识: Activity启动流程 进程创建流程 ANR触发流程 一. 问题描述 引言 一般数组越界问题, 往往是涉及多线程并发的情况下, 某个或多个临界资源(比如类或对象的成员变量)多线程并发读写而导致的异常。出现这样情况, 一般是该保护的地方没有用同步锁保护,或者是用错了同步锁,这类问题比较常...

一行Log引发多线程并发问题的案例

这是作者在2017年处理的一个多线程并发的案例,带着大家一起来领略异常分析思路 一. 问题描述 问题表现是文件管理器(fileexplorer)应用出现java.lang.NullPointerException导致应用崩溃的问题, 这是一个极低概率问题,本地无法复现,在大数据统计信息中陆陆续续的有上报,而且只出现在部分机型。 二. 问题分析 问题出在文件管理器,但最终导致异...

Android logd日志原理

基于Android源码6.0,解读logd的日志记录过程 frameworks/base/core/java/android/util/ - Log.java - Slog.java - EventLog.java frameworks/base/core/jni/android_util_Log.cpp /system/core/logcat/logc...

NotificationManagerService原理分析

基于Android 7.0源码分析通知机制,相关源码如下: frameworks/base/services/core/java/com/android/server/notification/ - NotificationManagerService.java - ManagedServices.java frameworks/base/core/java/andr...

介绍gdb调试工具

本文介绍Native异常的调试工具gdb的环境准备与常见命令 1. 找到gdbserver 当有Android系统源码,可在/prebuilts目录下查找,一般位于如下: 工具 所在源码路径 32位gdb服务端 prebuilts/misc/android-arm/gdbserver/gdb...

介绍addr2line调试命令

用addr2line可以将函数地址解析为函数名,在抓取调堆栈时Java层的堆栈本身就是显示函数名与行数,这个不需要转换,但对于native和kernel层的则是函数地址,需要借助addr2line来进行转换。 接下来分析介绍一下这个地址转换方法 一、Native地址转换 首先获取symbols表,要找到对应的版本的symbols,以及对应版本的addr2line,这样才能确保完全匹配。 然...

/proc/stat解析

本文解析进程节点含义 一. 概述 1.1 CPU时间 cpu指标 含义 user 用户态时间 nice 用户态时间(低优先级,nice>0) system 内核态时间 ...

Linux进程pid分配法

一. 概述 Android系统创建进程,最终的实现还是调用linux fork方法,对于linux系统每个进程都有唯一的 进程ID(值大于0),也有pid上限,默认为32768。 pid可重复利用,当进程被杀后会回收该pid,以供后续的进程pid分配。 上一篇文章Linux进程管理 详细地介绍了进程fork过程,在copy_process()过程,执行完父进行文件、内存等信息的拷贝,紧接...

Linux进程管理(二)--fork

基于Kernel 4.4源码 kernel/include/linux/sched.h kernel/include/linux/kthread.h kernel/arch/arm/include/asm/thread_info.h kernel/kernel/fork.c kernel/kernel/exit.c kernel/kernel/sched/core.c 一. ...