- 博客(26)
- 资源 (1)
- 收藏
- 关注
原创 安卓LMKD
收获安卓12的lmkd通过对kernel中内存各种状态的读取,综合psi event,当前water mark水位,page cache抖动,compact耗时,直接内存回收耗时 与 swap 和file cache来计算kill的最小adj值,更加科学;安卓12的lmkd,通过kernel节点的观测,对直接内存回收 和 异步内存回收进行了初步的监控,避免了单纯因IO上升导致的内存psi上升,更加科学;通过思考源码中在不同内存状态下执行的lmkd查杀策略,可以反向推测出安卓是如何通过各种条件来评估整
2024-02-24 15:53:34 359
原创 【安卓源码阅读】简单追溯几个内存回收的守护线程
其实在进行这部分代码的追溯之前,我也没想到会追溯到runFinalization方法。但是工作中经常需要在各个代码块中加逻辑,有时候加了一些逻辑之后,顺便解决一下之前工作中的困惑,也是挺好的。最后提一点,网上有人喜欢在runFinalization之前先调用一下gc方法,其实没有必要,在runFinalization方法的内部,会帮你gc了。...
2022-08-01 18:01:13 1278
原创 【安卓开机启动】安卓JVM加载so库流程
安卓JVM加载so库流程好久没有写点东西发了,工作中的事情有点杂,也找不到整块东西可以写的。最近调查了一个问题,稍微追了一下流程,这里记录一下。1. 问题背景由于我们支持的设备相对比竞品,zygote进程多占用了好几倍的内存空间。通过dump meminfo后发现,我们的设备在so库,ttf,和unkonwn mmap的内存空间相比竞品一共大了20多M,其中so库多了15M左右。通过查看zygote进程的smaps,确定了占用空间最大的几个so库确实是我们自己的。虽然确定了内存占用大的原因,还是得
2022-03-04 17:51:36 4169
原创 【安卓framework实战】使用lldb调试Android native源码
一、环境准备1.1 安装llvm安装方法参考:https://apt.llvm.org/。为了方便起见,有一个自动安装脚本可用于安装LLVM。要安装最新的稳定版本:$ bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)"要安装特定版本的LLVM:$ wget https://apt.llvm.org/llvm.sh$ chmod +x llvm.sh$ sudo ./llvm.sh <version number>安装完毕之
2021-11-11 20:22:16 4765
原创 【安卓framework实战】Android JNI 分析与实践
Android JNI 分析与实践JNI,即Java Native Interface的缩写,中文为Java本地调用,它连接了Java与Native之间的世界。鉴于功力尚浅,本文从基本概念、原理与实战三个方面对JNI在安卓系统中的使用进行了粗浅的介绍,如果有兴趣可以自行阅读Jdk文档或者其他大神的资料。通常我们在JDK源码中看到的方法,如果带有native,则表示这个方法是一个本地方法。Thread类中的几个方法,如java程序员经常使用的Thread.sleep(),就是一个native方法。pa
2021-09-10 11:50:58 597
原创 【安卓framework实战】实现一个安卓native服务
本文介绍了如何实现一个安卓native服务。需求: 在native framework层实现一个服务接受云控配置,并执行云控命令。已有条件:系统接受到云控配置会发送特定action的广播并将信息包含在intent中,我们只需要接受此广播并完成我们的逻辑即可。一、预先分析在开始写代码之前,做一些功能点大致的分析如下:1:在java framework需要一个广播接收器,接受传来的广播,此广播接收器需要在开机时就注册。根据安卓开机流程,我选择在system_server启动AMS后,注册此Rece.
2021-06-21 11:12:08 1124
原创 【安卓SELinux权限】SELinux走过的坑
SELinux走过的坑linux通过UID/GID机制对权限进行管理,将文件的权限划分为读、写和执行三种,分别用字母r、w和x表示。每一个文件有三组读、写和执行权限,分别是针对“文件的所有者”、“文件所有者所属的组”以及其它用户。在linux系统中,我们想完全操作某个文件,只需要执行sudo chmod 777 filename 即可。这表示root用户拥有无限大的权限,可以操作系统中的任何文件。所以在安卓系统中,引入了SELinux用以提升系统安全性。一、常用命令SELinux模式有三种,E
2021-06-04 11:19:52 1440 3
原创 【安卓开机启动】SystemServer启动
本文基于安卓6.0源码,对systemserver进程的启动与管理的基本过程进行介绍。从Zygote进程初始化ZygoteInit.main()中调用startSystemServer()fork出子进程开始。SystemServer负责启动和管理整个java framework,包含ActivityManager,WindowManager,PackageManager以及PowerManager等。在一号进程init(),解析init.rc文件,并启动其中的Zygote服务,会调用Zygote.
2021-05-08 15:43:08 272
原创 【安卓稳定性之ANR】第二篇:ANR的信息搜集过程(log,trace信息)
在安卓anr发生的时候,会进行anr现场的log打印以及trace文件的输出,以便于安卓开发者进行问题的分析。本文介绍了anr发生之后,从AMS的MainHandler接受到超时的消息,到调用mUiHandler进行未响应弹窗之间系统进行anr信息搜集的过程。调用链:AMS.MainHandler.handleMessage() -----> ActiveServices.serviceTimeout() ----->ProcessRecord.appNotRe.
2021-05-07 14:50:30 364
原创 【安卓稳定性之ANR】第一篇:安卓ANR问题综述
本文针对anr问题分析的一般套路与技巧进行了总结与归纳。以下所有内容均为本人的个人理解以及经验积累,偏向于实战若有任何问题,请给出建议及帮忙进行纠错。通过本文的阅读,你将有以下收获:1:了解什么是anr2:了解anr的简单分析套路3:了解攻克较难无响应问题的部分手段一、安卓无响应问题概述ANR,应用程序无响应即Application not Responding,以下简称“无响应”或“anr”。在安卓系统中,当应用因为Java Exception与Native Exception发生异常.
2021-04-30 15:15:38 2836 2
原创 【安卓IPC-Binder通信】第三篇:binder驱动内核解析
本章主要介绍binder驱动的三个重要函数,binder_open()、binder_mmap()以及binder_ioctl()。在介绍这三个函数的过程中,简单提binder中的数据结构。在上一篇《ServiceManager启动过程》中,在servicemanager.c的main方法中,servicemanager进程调用了自己的binder_open()方法,申请了128K大小的内存空间,我们从这里开始说起。在servicemanager自己实现的binder_open()中,它分别调用了.
2021-04-30 15:01:23 352 1
原创 【安卓IPC-Binder通信】第二篇:ServiceManager启动过程
【Binder通信】第二篇:ServiceManager启动过程consumedServiceManager进程是Binder进程间通信机制中一个非常重要的守护进程,它是由init进程解析init.rc文件而创建出来的。其作为binder服务的大管家,用于管理系统中的各种服务。ServiceManager最核心的两个功能为查询和注册服务:1.注册服务:记录服务名和handle信息,保存到svcinfo链表中;2.查询服务:根据服务名查询相应的的handle信息。ServiceManage
2021-04-30 14:54:30 147
原创 【安卓IPC-Binder通信】第一篇:media进程注册
Binder初探在调查ANR问题的过程中,经常会遇到一些应用主线程trace显示其正在调用目标进程的方法,进行bindercall。由于经常看到这一类的trace,所以对binder call产生了它到底做了哪些事的疑问。当trace的native层中显示正在talkWithDriver()的时候,一般就显示此次bindercall成功。这是什么原因呢?虽然binder又难又多,但是作为打通整个安卓系统各个进程的通信的binder 进程间通信,并一解心中的疑惑,我决定开始对它的第一步探索。注:本文
2020-09-26 00:07:17 842
原创 【安卓开机启动】AMS启动流程
安卓系统框架学习_AMS启动流程本文参考https://blog.csdn.net/renshuguo123723/article/details/85332146AMS的启动流程1:SystemServer#main -> 2:SystemServer#run -> 3:SystemServiceManager#startBootstrapServices1:首先System...
2019-11-25 20:18:26 639
原创 【安卓稳定性之ANR】第三篇:anr小结
ANR问题类型及产生原理ANR(Application Not Responding):即应用无响应. 在日常使用安卓手机的过程中, 对最anr最直接的印象就是手机弹框显示应用未响应. 选择继续等待或者关闭.如果应用程序的主线程在规定的时间内, 没有完成特定操作和事件, 就会发生ANR.四种ANR类型KeyDispatchTimeout : input事件在5S内没有处理完成发生ANR...
2019-11-19 14:40:57 422
原创 【安卓四大组件】startService启动流程(未)
安卓系统框架学习_startService()启动流程1:进程A(发起调用端)方法调用过程:MyActivity.startService() -> ContentWrapper#startService -> ContentImpl#startService -> ContentImpl#startServiceCommon看startServiceCommon()方法...
2019-11-18 20:28:54 246
原创 【安卓Handler】Handler消息机制
Android消息机制1_Handler(Java层)由于以后以后要从事安卓系统方面的工作,然而本人半个月前还是Android小白. 这几天学习了gityuan的Android操作系统架构, 按照自己喜欢的方式总结一下. 有兴趣的同学可以直接看原博客地址:http://gityuan.com/2016/01/01/handler-message-usage/.Android消息机制的四个类都是...
2019-11-08 11:57:11 257
原创 安卓学习笔记4_ContentProvider 内容提供器
安卓学习笔记_4 ContentProvider 内容提供器读完<第一行代码>第七章, 单纯的总结一下 内容提供器的使用和创建.一. 内容提供器简介内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能, 它提供了一套完整的机制, 允许一个程序访问另一个程序中的数据, 同时还能保证被访问数据的安全性.目前, 使用内容提供器是Android...
2019-11-05 18:06:09 134
原创 安卓学习笔记3_Android数据持久化
安卓学习笔记3_Android数据持久化今天刚简单学习了安卓数据持久化, 现在梳理一下.一:文件存储安卓中的文件存储就是使用了Context类中提供的openFileOutput()和openFileInput()分别对应着文件的持久化以及反持久化.其中,调用openFileOutPut()方法返回一个FileOutputStream对象,调用openFileInput()会返回一个Fil...
2019-10-30 20:46:03 188
原创 安卓学习笔记2_Broadcast
安卓学习笔记2_Broadcast今天看了<第一行代码>的第五章"全局大喇叭-详解广播机制".刚学完总结一下.广播的接收也是根据,Intent接收的.与Activity使用Intent互相启动类似,Broadcast也是使用Intent进行广播.区别在于广播的发送,sendBoradcast(Intent intent),是全局广播形式的发送,所有可以接收到该广播的组件都可以进行...
2019-10-29 17:12:22 150
原创 安卓学习笔记1_内部类
@TOC加粗样式安卓学习笔记1_局部内部类和匿名内部类最近开始学习安卓,所以把安卓学习过程中遇到的知识记录一下笔记我在button按钮的设置点击监听器这里,使用匿名内部类的方法创建了监听器对象,这个匿名内部类既是匿名内部类,又是局部内部类.所以如果要把Edit editText = findViewById(R.id.edit_text)放在内部类外面的话,有两种方式.第一种就是放在o...
2019-10-25 14:32:04 208
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人