
Android系统源码分析
文章平均质量分 70
大家平时在写Android应用时,肯定会调用到Framework层相关API接口。其实Framework就是为Android应用开发提供一系列的服务和API的接口使用的,所以其作用是不言而喻的,所以对其有一定的了解,也帮助我们更好的掌握Android机制。
雪舞飞影
喜欢钻研Android源码的程序猿
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Android屏幕旋转流程(2)
在Framework中,屏幕旋转功能主要是由WMS模块中的DisplayRotation对象来完成,在启动WindowManagerService过程中,创建DisplayContent对象时,会创建一个对应的DisplayRotation负责屏幕旋转逻辑,一个DisiplayContent对象对应一个DisplayRotation对象,或者说DisplayContent对象中持有一个DisplayRotation对象。否则设置成USER_ROTATION_LOCKED,由user_rotation决定。原创 2024-10-10 14:40:15 · 2887 阅读 · 1 评论 -
Android屏幕旋转流程(1)
SensorService通过SystemServer启动,后调用到hal kernel。I2C -->App过程:通过JNI调用到SystemSensorManager中的SensorEventQueue.dispatchSensorEvent,然后通过App向SensorEventQueue注册的mListener,来回调数据到App的onSensorChanged()方法。应用注册使用,通过enable和disable来控制注册和取消注册。后续文章所提及的屏幕旋转方向等都和这里事件分发相关。原创 2024-06-15 17:24:46 · 747 阅读 · 0 评论 -
dumpsys相关解析
在新起的线程中,执行某个service的dump函数,如此我们就只要看某个service的dump函数实现就好了,注意我们这些处理逻辑目前都是在native层,但是我们知道安卓是建立在Binder通信的CS架构,该dump()函数的声明是在Binder类中的,也就是我们需要找到服务端的dump()函数的真正实现哪里,如果是dumpsys activity a,那么真正实现是在java层的ActivityManagerService中,其他服务同理。原创 2023-11-30 20:16:45 · 1487 阅读 · 0 评论 -
MTK平台电池信息查询
Android系统默认可通过dumpsys获取如下的电池信息:adb shell dumpsys battery。以上也可通过节点来查看信息:/sys/class/power_supply/battery,等其他属性值。当以上两者相乘是会得到其充电功率,上层软件以此基础确定当前是否为慢/快速充电。原创 2023-10-25 17:21:29 · 1253 阅读 · 0 评论 -
MTK平台的SWT异常的简单总结(3)——常见SWT/ANR类型
线程状态为"Native",确认callstack中有"Process.zygoteSendArgsAndGetResult",对于Zygote fork进程时卡住的问题,一般是由于底层memory问题引起的,请检查是否有memory不足或者memory leak的问题。线程状态为"Native",根据native方法找到对应模块,进一步确认该native方法为何执行时间过长,例如是否等待硬件返回或者硬件本身存在问题等。无论是通过Tid来查找,还是通过locked锁来定位,都可以最终定位到问题代码的部分。原创 2023-06-15 10:32:02 · 2142 阅读 · 0 评论 -
MTK平台的SWT异常的简单总结(2)——SWT原理和分析
Android user/userdebug版本因受Security限制,导致在M版本之后打开mtklogger也只能抓到fatal db,不能抓普通的ANR db,O版本开始默认不会抓取第三方APP的ANR db。当SWT的两次有效trace打印的call stack完全一样时,才认为是block issue,重点从call stack来入手分析,常规分析流程如上图。SWT —— (swt_time – swt_timeout – 10s)~ (swt_time + 10s),之间的两次trace。原创 2023-06-05 16:39:19 · 2054 阅读 · 0 评论 -
MTK平台的SWT异常的简单总结(1)——WatchDog
SWT系列资料很多来源于Google。原创 2023-05-19 15:22:53 · 2192 阅读 · 0 评论 -
Android事件拦截(3)——系统拦截和应用拦截
本文主要分析触摸事件和按键事件在不同阶段被拦截的流程,总结在不同阶段不同方法中返回值的含义。原创 2023-03-06 09:39:28 · 4897 阅读 · 0 评论 -
动态隐藏导航栏和状态栏
通过以上属性来隐藏状态栏和导航栏,发现上下拉还是会出现状态栏和导航栏,现在的需求是不要出现状态栏和导航栏。可从如上回调函数位置屏蔽相关滑动事件,从而实现不在出现状态栏和导航栏。原创 2023-02-23 09:54:36 · 2258 阅读 · 0 评论 -
Framework阻止应用安装
在系统开发中,如果不需要某个应用,最好的情况下就是将应用不参与编译,但是这样修改有时候需要修改的代码较多,这里有一个便捷的方法可以让应用不进行安装。系统在开机时会在PMS当中遍历和解析所有应用并进行安装,此时我们可以对其进行过滤操作。原创 2023-02-01 14:52:11 · 1411 阅读 · 0 评论 -
Android监听UEvent之UEventObserver分析
初始化完之后,进入一个while的死循环,不停的调用native层的nativeWaitForNextEvent()函数来获取Event事件,然后将Event事件转换成message,再通过sendEvent()将message事件传递给外设对应的Observer。原创 2022-12-13 10:46:47 · 3895 阅读 · 1 评论 -
Android中几种常见的播放声音组件
这里要说到MediaPlayer和AudioTrack之间的联系,MediaPlayer在framework层也实例化了AudioTrack,其实质是MediaPlayer在framework层进行解码后,生成PCM流,然后代理委托给AudioTrack,最后AudioTrack传递给AudioFlinger进行混音,然后才传递给硬件播放。比较常见使用AudioTrack,CPU占用率低,内存消耗也比较少。适合播放比较短的音频片段,比如游戏声音,按键声音,铃声片段等,并且可以同时播放多个音频。...原创 2022-08-17 20:56:38 · 2933 阅读 · 1 评论 -
MTK平台双击Power打开Camera(一)——SystemUI简单流程
双击Power打开Camera流程原创 2022-07-04 17:35:47 · 1232 阅读 · 0 评论 -
MTK平台双击Power打开Camera(二)——Framework层长短按Power键简单流程
源码解释:(A)PowerManagerService.java//frameworks/base/services/core/java/com/android/server/power/PowerManagerService.javaprivate void handleKeyGesture(KeyEvent event, boolean interactive) { if (mKeyCombinationManager.interceptKey(event, interactiv原创 2022-05-30 10:13:24 · 804 阅读 · 0 评论 -
Android系统Crash/ANR类型弹框
Android系统在应用发生Crash/ANR的时候,总会弹出一个提示对话框,但是现在部分客户不想要这样的对话框,要求移除。可从源码的如下入手://frameworks/base/services/core/java/com/android/server/am/ProcessRecord.javavoid forAllDialogs(List<? extends BaseErrorDialog> dialogs, Consumer<BaseErrorDialog> c) {原创 2022-04-18 11:30:25 · 3801 阅读 · 3 评论 -
利用addr2line命令定位backtrace的Error行数
(1)发生Error的backtrace我们就以经常出现NE为例,来说明这个情况,一般出现NE之后,main Log会有如下信息:03-03 11:34:35.971851 10105 10105 I AEE_AED : pid: 690, tid: 10062, >>> /vendor/bin/hw/camerahalserver <<<03-03 11:34:35.971953 10105 10105 I AEE_AED : read_request: rece原创 2022-04-07 09:49:55 · 1189 阅读 · 0 评论 -
MTK平台如何获取所有异常的AEE db文件
(1)需要开启的prop默认情况下部分异常的db文件并不会产生,有如下Log显示:01-10 11:57:31.292 384 384 D AEE_AED : $===AEE===AEE===AEE===$01-10 11:57:31.293 384 384 D AEE_AED : p 2 poll events 1 revents 101-10 11:57:31.293 384 384 D AEE_AED : PPM cpu cores:4, online:401-10原创 2022-01-26 09:57:55 · 4345 阅读 · 2 评论 -
简单分析系统开机时间
(1)Android通用开机Logadb logcat -b events | grep boot_p12-29 15:32:47.020 526 526 I boot_progress_start: 1621312-29 15:32:49.720 526 526 I boot_progress_preload_start: 1891312-29 15:32:54.702 526 526 I boot_progress_preload_end: 2389512-29 15原创 2021-12-29 16:06:27 · 2523 阅读 · 0 评论 -
Frameworks的config.xml配置项
(1)文件位置 //frameworks\base\core\res\res\values\config.xml//低电量警告<integer name="config_lowBatteryWarningLevel">15</integer><integer name="config_lowBatteryCloseWarningBump">5</integer>//隐藏wifiDisplay<bool name="config_enabl原创 2021-12-15 18:10:12 · 1728 阅读 · 0 评论 -
Mtk平台系统启动设置属性
(1)系统启动时设置属性//vendor/mediatek/proprietary/bootable/bootloader/lk/app/mt_boot/mt_boot.cint boot_linux_fdt(void *kernel, unsigned *tags, unsigned machtype, void *ramdisk, unsigned ramdisk_sz) { void *fdt = tags; int ret; int offse原创 2021-11-29 19:54:37 · 2174 阅读 · 0 评论 -
Android 给app默认权限(不弹窗申请权限)
系统签名应用在grantDefaultSystemHandlerPermissions中修改//frameworks/base/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.javaprivate void grantDefaultSystemHandlerPermissions(PackageManagerWrapper pm, int userId) { Log.i(TAG, "Gran原创 2021-11-22 16:38:28 · 1516 阅读 · 0 评论 -
Android SeLinux权限问题
(1)权限确认&示例avc: denied { 操作权限 } for pid=7201 comm=“进程名” scontext=u:r:源类型:s0 tcontext=u:r:目标类型:s0 tclass=访问类别 permissive=0Kenel log:avc: denied { execheap } for pid=7201 comm="com.baidu.input" scontext=u:r:untrusted_app:s0 tcontext=u:r:untrusted原创 2021-09-29 16:40:30 · 2957 阅读 · 2 评论 -
Android开机动画流程(三)——结束阶段(开机广播)
(1)Launcher的启动在前面的 Android开机流程可以知道,SystemServer最后会调用到AMS.systemReady。//frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.javapublic void systemReady(final Runnable goingCallback, TimingsTraceLog traceLog) { traceBeginAnd原创 2021-09-08 11:55:09 · 4805 阅读 · 0 评论 -
Android开机动画流程(二)——执行阶段
(1)动画文件的存在位置static const char OEM_BOOTANIMATION_FILE[] = "/oem/media/bootanimation.zip";static const char PRODUCT_BOOTANIMATION_DARK_FILE[] = "/product/media/bootanimation-dark.zip";static const char PRODUCT_BOOTANIMATION_FILE[] = "/product/media/bootan原创 2021-09-08 11:54:44 · 1556 阅读 · 0 评论 -
Android开机动画流程(一)——启动阶段
(1)前述Android系统在启动的过程中,最多可以出现四个画面,每一个画面都用来描述一个不同的启动阶段。Linux uboot显示(静态)Linux 内核的启动画面(静态)init 进程的启动画面(静态)BootAnimation启动动画(动态)无论是哪一个画面,它们都是在一个称为帧缓冲区(frame buffer,简称fb)的硬件设备上进行渲染的。接下来,我们就单独分析BootAnimation是如何开始显示的。(2)BootAnimation启动阶段开机动画是由应用程序bootan原创 2021-09-08 11:54:10 · 4852 阅读 · 0 评论 -
浅谈JVM相关原理(一)
(1)什么是JVMJVM是Java Virtual Machine(Java虚拟机)的缩写,是运行所有Java程序的抽象计算机,是Java语言的运行环境,java的跨平台是必须要有jvm的支持,就是不同平台支持jvm,然后才能一份java程序在不同平台运行。我们都知道java一直宣传的口号是:一次编译,到处运行。 Java的跨平台功能和它的Java虚拟机(简称 JVM)的作用是分不开的。所谓跨平台的“平台”指:操作系统。没错,就是我们接触的Linux和Windows等操作系统。Java跨平台,通俗的解释原创 2021-07-07 22:23:55 · 307 阅读 · 1 评论 -
Android虚拟机与Java虚拟机区别(二)
(1)概念介绍前文已经介绍了JVM相关的知识,这里重点介绍Android虚拟机。在Android的体系框架中有一部分叫做Android Runtime,即Android运行时环境,这个环境包括了两个部分,一个是Android的核心类库,还有一个就是Dalvik虚拟机了。Android之所以开发Dalvik虚拟机而不使用JAVA自带的JVM可能是基于以下两点考虑:版权问题:如果使用JVM就涉及到了版权问题,所以google需要在JVM的基础上做一些改进,创造自己的虚拟机。性能问题:jvm虚拟机对J原创 2021-07-07 22:24:37 · 1049 阅读 · 1 评论 -
Android系统启动流程完整分析(一)
接触Android也有几年了,最近想对Android系统的启动流程做一个完整的分析总结,以便后续学习 。(1)Android架构介绍我们先来看一下Android文档给的一份系统架构图。从以上可以看到,Android大体上被分为4个模块(Kernel,Hal/Native,Java Framework,Apps)。接下来我们从系统启动的角度来看两种更加详细的图。从上图可以看出,系统启动我们底层将其主要分为三个部分。Android设备上电后,首先会从处理器片上ROM的启动引导代码开始执行,片原创 2021-07-05 22:49:31 · 1355 阅读 · 2 评论 -
Android系统启动流程完整分析(二)
(1)init的初始化当Linux内核启动之后,运行的第一个进程是init,这个进程是一个守护进程,确切的说,它是Linux系统中用户控件的第一个进程,所以它的进程号是1,可以通过adb shell ps | grep init查看进程号。Linux Kernel启动后,会调用/system/core/init/Init.cpp的main()方法。//system/core/init/init.cppint main(int argc, char** argv) { if (!strcmp原创 2021-07-05 23:06:53 · 795 阅读 · 0 评论 -
Android系统启动流程完整分析(三)
(1)zygote进程入口从上文的rc文件可以知道,zyogte进程的原型是:service zygote /system/bin/app_process64代码路径为:frameworks/base/cmds/app_process,先来看一下mk文件。LOCAL_PATH:= $(call my-dir)app_process_common_shared_libs := \ libandroid_runtime \ libbinder \ libcutils \原创 2021-07-05 23:17:55 · 828 阅读 · 0 评论 -
Android系统启动流程完整分析(四)
(1)ZygoteInit.main()函数接下来进入ZygoteInit.main()函数,main()函数的主要作用就是启动SystemServer服务,并用socket监听。//frameworks/base/core/java/com/android/internal/os/ZygoteInit.javapublic static void main(String argv[]) { //**************** 第一部分 ********************** Zy原创 2021-07-05 23:58:46 · 797 阅读 · 0 评论 -
Android系统启动流程完整分析(五)
(1)SystemServer启动SystemServer的进程名实际上叫做“system_server”,通常简称为SS。是系统中的服务驻留在其中,常见的比如WindowManagerServer(WmS)、ActivityManagerSystemService(AmS)、 PackageManagerServer(PmS)等,这些系统服务都是以一个线程的方式存在于SystemServer进程中。 //frameworks/base/services/java/com/android/server原创 2021-07-06 00:07:36 · 555 阅读 · 0 评论 -
总结Android系统启动完整流程(六)
先总体来看一下Android系统启动的完整流程图:(1)内核启动Android设备上电后,首先会从处理器片上ROM的启动引导代码开始执行,片上ROM会寻找Bootloader代码,并加载到内存。Bootloader开始执行,首先负责完成硬件的初始化,然后找到Linux内核代码,并加载到内存。Linux内核开始启动,初始化各种软硬件环境,加载驱动程序,挂载根文件系统,并执行init程序,由此开启Android的世界。(2)init启动当Linux内核启动之后,运行的第一个进程是init,这是原创 2021-07-06 00:11:36 · 2956 阅读 · 0 评论 -
Android系统设置属性详解
(一)Android上有三种主要途径来get/set属性。(1)native code当编写本地应用程序时,可以使用property_get和property_set 这两个API来读取/设置属性。要使用它们,我们需要include cutils/properties.h,并链接libcutils库。//frameworks/native/services/surfaceflinger/StartPropertySetThread.cpp#include <cutils/properties原创 2021-07-03 23:32:07 · 3235 阅读 · 2 评论 -
Activity显示三部曲(一)——Activity 从加载布局文件到显示的过程分析
Activity 从加载布局文件到显示的过程分析SetContentView在Activity的onCreate()生命周期函数中,会调用setContentView()来设置我们的布局文件,先来了解下setContentView()函数。 public void setContentView(@LayoutRes int layoutResID) { getWindow().setContentView(layoutResID);//调用了getWindow() i原创 2021-07-03 22:45:52 · 656 阅读 · 2 评论 -
Activity显示三部曲(二)——ViewManager、ViewRootImpl、WindowManagerImpl、WindowSession等详细解析
从前文Activity显示三部曲(一):Activity 从加载布局文件到显示的过程分析介绍到,承载了布局文件的DecorView通过ViewManger添加进行显示,那添加之后的显示过程又是怎么样的呢?本篇文章主要分析它接下来显示的过程。ViewManager WindowManger WindowMangerImplActivity的makeVisible()还是ActivityThread的handleResumeActivity()函数中,都出现过下面这段代码if (!mWindowAdded原创 2021-07-03 22:51:22 · 955 阅读 · 1 评论 -
Activity显示三部曲(三)——ViewRootImpl、Surface、SurfaceFlinger简介
在前面两篇文章中我们可以知道,Window的顶层View为DecorView、DecorView、LayoutParams以及对应的ViewRootImpl保存在一个全局单例WindowMangerGlobal中,ViewRootImpl通过W和WindowSession与WindowManagerService进行通信。那么DecorView是如何传递给WindowMangerService的?然后又是如何显示到屏幕上的呢?先来看看View是如何绘制的。View的绘制ViewRootImpl的se原创 2021-07-03 23:11:40 · 982 阅读 · 4 评论 -
OnClick与android:focusableInTouchMode=true
也许这是一个老问题,但是遇到了。所以将自己找的解决办法写下来。程序中有一个button,它设置了android:focusableInTouchMode=”true”,并且也设置了按键onClick方法。那么第一次点击的时候,它将取得焦点,而第二次点击的时候,才执行onClick方法。我所需要的效果是,同时在第一次点击的时候了得焦点,并且执行onClick方法。button.setOnTouchLi原创 2017-09-19 15:41:34 · 942 阅读 · 1 评论 -
优快云博客中部分文章缺失图片处理
缘由之前写的文章中由于很多文章都包含图文解析,但是不知何原因导致很多文章的图片丢失,从而使影响阅读体验,也有部分网友评论图片问题,所以今天专门写一篇博客,将缺失的图片共享到百度云盘,大家可以自由去查看了。在此附上共享链接。链接:https://pan.baidu.com/s/1nvBpjNb 提取码:zrn2分类(1)Activity启动流程(1)ActivityManagerService与原创 2017-11-23 15:47:07 · 797 阅读 · 0 评论 -
Android 5.1 Settings模块源码分析
前述:本人已工作两年多,但是依然感觉还是Android的门外汉,之前一直从事Android的应用开发,每天就是各种调用SDK方法,各种拷贝网上的源码以及jar包,从来也不管为啥这样用,由于换了一份工作才开始接触到Android的源码,感觉Android的水好深啊。今天这篇博客也是我的处女作啊,以后也希望通过多多研究源码来写出更多的博客,我觉得写博客主要还是作为一个记录吧,不然感觉有的东西真原创 2016-07-21 10:08:51 · 5204 阅读 · 5 评论