Posts by Year

2024

Android 12编译系统-5 ninja介绍

1 minute read

最开始,Ninja是用于Chromium浏览器中,Android在SDK7.0中也引入了Ninja。Ninja其实就是一个编译系统,如同make,使用Ninja主要目的就是因为其编译速度快

Android 12编译系统-4 kati介绍

less than 1 minute read

Kati是为了提高Android编译速度而产生的实验性的GNU make克隆的工具。本身没有提供快速编译,而是将Makefile文件转换为Ninja文件,再通过Ninja进行编译提速。 目前Android 12上,Kati(即prebuilts/build-tools/linux-x86/bin/ckati...

Android 12编译系统-3 打包image镜像流程

3 minute read

在Android 12 AOSP源码的build/core/main.mk中定义了很多伪目标,我们可以直接通过make 目标名称进行编译,镜像的生成定义也在该文件中。本篇主要以system镜像为例,进行流程梳理分析。

Android 12编译系统-1 编译框架介绍(源码&out&编译模块结构)

8 minute read

基于Android 12 AOSP源码(android-12.0.0_r3),对Android编译系统框架作学习梳理。 开篇从Android的源码结构入手,让我们先知道Android源码架构包含了哪些内容、Android编译结果目录有哪些内容。然后了解Android编译系统模块的结构组成。

Back to top ↑

2023

Back to top ↑

2022

Android Automotive Framework调试技巧

24 minute read

Android系统调试技巧积累笔记,主要包含Android Framework,以及日常接触的git、adb、linux系统等调试技巧。

Android SELinux权限概念和配置说明

5 minute read

本篇主要讲述Android SELinux的基本概念,包含类型、属性、规则,Sepolicy的核心模块、关键文件,SELinux配置的步骤、调试验证方法等。

Android DropBox模块笔记

11 minute read

Android DropBox是Android用来持续化存储系统数据的一个管理类,主要用于记录Android运行过程中, 内核, 系统进程, 用户进程等出现严重问题时的log。

Android UpdateEngine模块流程(含序列图)

7 minute read

Android A/B升级又称静默升级,它是一种在系统运行过程中进行的升级功能。为了减小系统运行负荷,整个升级过程会保持在一个较低的IO状态,所以升级时间比recovery升级明显要长。本文是基于Android 12 AOSP源码,对update engine模块的流程进行梳理,最主要的内容是绘制的几张序列...

Android 系统架构及HAL层概述

7 minute read

了解宏观上Android系统架构,硬件抽象层HAL层HIDL和AIDL接口定义语言、内核kernel、设备树叠加层DTO等

Android 项目构建编译概述

3 minute read

主要内容是Android AOSP源码的管理方式,项目源码的构建和编译,用到比如git、repo、gerrit一些命令工具,以及使用Soong编译系统,编写Android.bp文件的格式样式。

Android 动态分区配置原生示例

4 minute read

动态分区分为原生动态分区和改造动态分区两种配置方式,其中包含开关配置和参数配置,以Android Q源码给出的原生示例为参考。

Android 动态分区相关模块和常用工具

4 minute read

Android动态分区功能编译和调试用到的lpmake、lpdump、lpunpack、dmctl等命令工具,以及涉及到的一些库模块,比如liblp、lipdm等。

Android 动态分区概念了解

4 minute read

动态分区是Android的用户空间分区系统,从Android Q开始引入这个动态分区super的概念。使用此分区系统,可以在无线下载 (OTA) 更新期间创建、销毁分区或者调整分区大小。借助动态分区,供应商无需担心各个分区(例如 system、vendor 和 product)的大小。取而代之的是,设备分配...

Android AB升级(三) - update engine架构概述

2 minute read

update engine是通过AIDL对上层client端和server端分离,实现跨进程。上层提供服务绑定接口,以及升级触发和回调接口,底层实现升级的具体逻辑。本篇只是简单梳理下流程流转的过程。

Android badblock磁盘坏道检测调试

2 minute read

Android升级的时候在FilesystemVerifierAction出现某分区Buffer I/O error读写失败,上报错误码1(error)。从问题现象看需要针对该分区进行磁盘坏道检测,分析是否是因为磁盘损坏导致。

C++ Socket套接字概述

less than 1 minute read

socket套接字就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。要通过互联网进行通信,至少需要一对套接字,其中一个运行于客户端,我们称之为Client Socket,另一个运行于服务器端,我们称之为Server ...

Android AB升级(二) - Demo APP应用流程

7 minute read

Android源码有车机系统升级的demo app:SystemUpdater,使用原生settings UI画面。该应用可用于理解应用层同系统层进行交互,触发完成升级的逻辑流程。

Android AB升级(一) - 升级各层级模块概述

less than 1 minute read

Android A/B升级又称静默升级,它是一种在系统运行过程中进行的升级功能。为了减小系统运行负荷,整个升级过程会保持在一个较低的IO状态,所以升级时间比recovery升级明显要长。

Back to top ↑

2021

Android Vehicle HAL架构

6 minute read

文档内容:1.vehicle HAL架构介绍、详细的启动流程;2.部分车辆属性类型名称说明;3.上层carservice和hal层数据subscribe/set/get流程梳理;4.dbus和vehicle hal连接交互的流程;4.从dbus回调数据返回至APP层的详细流程梳理(最终梳理方法流转调用的流程...

数据结构之时间复杂度和线性表

4 minute read

《数据结构(C++语言版)》书,关于数据结构再读记录。主要包含数据结构的基本概念、算法概念、时间复杂度、线性表(顺序表&链表)

Android R Vsync相关梳理

11 minute read

为了理解systrace中HW Vsync, sf vsync, app vsync的含义和作用。这里主要参照Android R AOSP源码对这几种VSYNC的关系和调用流程进行大致的梳理。

Back to top ↑

2020

Android Q SurfaceFlinger合成(二)

18 minute read

继上篇《Android Q SurfaceFlinger合成(一)》中SF对INVALIDATE信息处理,针对Layer属性变化、显示设备变化等情况处理,将mCurrentState提交到mDrawingState。然后遍历mDrawingState的Layer,将新的Buffer内容更新绑定到Layer纹...

Android Q SurfaceFlinger合成(一)

12 minute read

在HWUI渲染完成后,Buffer会在frameworks/native/libs/gui/BufferQueueProducer.cpp中通过queueBuffer放入BufferQueue,在该函数中调用frameAvailableListener->onFrameAvailable(item)通...

Android protobuf(.proto文件)

2 minute read

最近碰到一个关于frameworks/base/core/proto/android/providers/settings/secure.proto文件中修改某个属性的问题,所以针对protobuf(.proto文件)进行一个学习了解。 Google Protocol Buffers,(简称Protobuf...

Android ANR基本Log分析

3 minute read

ANR(Application Not Responding),字面意思是应用无响应,即用户的一些操作无法从应用中获取反馈。关于发生ANR的trace.txt文件的请参考Android ANR traces.txt文件分析

Android 图形显示框架

3 minute read

本篇对Android图形显示框架做一个概述,内容主要包含:SurfaceSession创建和销毁(添加/删除窗口),Surface创建和销毁,BufferQueue创建,以及BufferQueue的dequeueBuffer和queueBuffer、acquire和release大致流程梳理。

Android NE分析(二)

less than 1 minute read

了解gcc将*.c/cpp编译成*.o,再将其链接为可执行程序或/lib库的过程,有助于我们将native从编译/加载/执行到崩溃一条路贯通起来。Android的Makefile只需要将source file填入LOCAL_SRC_FILES,然后include $(BUILD_SHARED_LIBRARY...

Android NE分析(一)

1 minute read

任何软件都可能存在BUG,调试和修复BUG伴随着整个开发流程,因此异常分析非常重要。如果是native层发生异常,我们一般称之为叫NE(native exception)

C++ 对象和类(案例代码)

2 minute read

C++类的声明、实现和使用,以及构造函数和析构函数。包含案例代码,可编译运行。

Android HWUI绘制流程

18 minute read

Android中绘图的API有很多,比如2D的绘图skia;3D的绘图OpenGLES,Vulkan等。Android在后来完善3D API支持的同时,也在更新View Widget渲染机制,提出了硬件加速机制。

Android ANR traces.txt文件分析

less than 1 minute read

trace.txt生成:当APP(包括系统APP和用户APP)进程出现ANR、应用响应慢或WatchDog的监视没有得到回馈时,系统会dump此时的top进程,进程中Thread的运行状态就都dump到这个Trace文件中了。 ANR:Application Not Responding,即应用无响应

Android 屏幕旋转流程

10 minute read

Android支持横屏和竖屏,用户可以选择锁定(rotation lock)也可以选择让传感器来自动转屏。而转屏时为了使用户体验更流畅,会对屏幕截屏,然后使用截屏的图来做转屏动画,直到转屏动作结束。

Android InputDispatcher获取点击事件

6 minute read

Input点击事件从InputReader会传到InputDispatcher进行处理。针对一些点击调试方式和日志打印,来分析InputDispatcher获取点击事件的部分流程。 参考上一篇《Android 触控事件分析》

Android Input事件ANR流程

3 minute read

Android Input体系中,大致有两种类型的事件:实体按键key事件,屏幕点击触摸事件。如果根据事件类型的不同,还能细分为基础实体按键的key(power,volume up/down,recents,back,home),实体键按键,屏幕点击(多点,单点),屏幕滑动等事件。在Android整个Inp...

C++字符串比较函数strcmp和strstr的用法

2 minute read

今天碰到一个细节bug,使用strcmp来比较两个字符串是否完全相同。但是忽略了一个问题,如果存在一个字符串包含在另一个字符串呢?此时就会发现需要用strstr函数。

Android 两种实时获取FPS的方法

1 minute read

通过ADB命令实时获取FPS帧率有两种方式,一种是dump gfxinfo,一种是dump SF --latency。其他还可以通过三方APP GameBooster(Google PlayStore可以下载)打开实时FPS监控查看。 如果是查看动画是否丢帧,可以通过视频工具QuickTime Player...

Android SELinux权限笔记

less than 1 minute read

在新增一个HIDL Service后,需要对其进行权限配置,不然通过adb shell ps -A|grep NAService会发现该service无法启动,也会通过抓取log发现一堆的avc: denied权限问题。关于SELinux可以推荐文档:https://www.pianshen.com/art...

Android RC文件分析

1 minute read

Android中最熟知的RC文件就是init.rc了,而在Hal接口服务定义中也会创建.rc文件。init.rc的语法分为行为(Actions),、命令(Commands) 、服务(Services)、选项(Options)。.rc文件是资源文件,包括比如对话框、菜单、图标、字符串等资源信息。使用.rc资源...

Android 触控事件分析

1 minute read

我们常见的触摸事件除了按下,弹起,移动之外还有很多,诸如长按,双击,Scroll,Fling等,他们是怎么判断的,还有这些长按,双击等事件的时间能否自由设置。可以在开发者选项中打开“显示点按操作反馈”和“指针位置”,同时可以打开inputflinger模块的log开关做一些调试,分析TP报点。

Back to top ↑

2019

Android SurfaceFlinger和HWC2概述

8 minute read

Android SurfaceFlinger和HWC2概述 参考Android Q AOSP源码添加修改部分内容 参考源码: http://aosp.opersys.com/xref/android-10.0.0_r14/

Android Binder实例

4 minute read

Binder通信是Android用的比较多的一种通信机制,它是一种client-server的通信结构。Binder通信具有以下特点: 用驱动程序来推进进程间的通信; 可以通过共享内存的方式来提供性能; 可以为进程请求分配每个进程的线程池; 针对系统中的对象引入了引用计...

Android色彩空间(ColorSpace)

less than 1 minute read

Android色彩空间类型概述,包含广色域WCG、sRGB、Adobe RGB、ProPhoto RGB、DCI-P3、Display P3

C++ 单例模式

less than 1 minute read

C++基础语法,主要是设计模式中的单例模式

Java 单例模式

less than 1 minute read

单例:保证一个类仅有一个实例,并提供一个访问它的全局访问点。 单例模式是一种常用的软件设计模式之一,其目的是保证整个应用中只存在类的唯一个实例。 比如我们在系统启动时,需要加载一些公共的配置信息,对整个应用程序的整个生命周期中都可见且唯一,这时需要设计成单例模式。如:spring容器,session工厂,缓...

nReal搭建Samepl APK

less than 1 minute read

nrsdk是nreal开发混合现实体验的平台。使用简单的开发过程和高级api,nrsdk提供了一组强大的mr特性,并使nreal眼镜能够了解真实世界。

Android WMS和View基本理解

7 minute read

Window 可以看做是Surface的一个包装,本质上,Window的本体就是一片Surface。将操作对象Surface,对象关联属性集以及操作方法等组合在一起便是 Window。Surface 其实是一块画布,应用可以随心所欲地通过 Canvas 或者 OpenGL 在其上作画,然后通过 Surfac...

Android init进程

1 minute read

init是Linux系统中用户空间的第一个进程。Android底层也是和linux原理一样。

C++对象和类

1 minute read

C++基础语法,包含C++对象和类

Android JNI理解

1 minute read

JNI,即Java Native Interface,Java本地调用。

Android中的makefile(Android.mk)

less than 1 minute read

makefile是和make命令一起使用,在Android中,可以使用mm、mmm、mma进行编译。 Makefile可以组织项目中各种库和代码之间的依赖,构建项目,和maven、gradle一样属于构建工具。 常用于大型项目。

C++复合类型之数组、字符串、结构、共用体

3 minute read

序: C++提供了基于整型和浮点类型创建的复合类型。影响最深远的复合类型是类。然而,C++还支持几种普通的复合类型。 例如,数组 可以存储多个同类型的值。 结构 可以存储多个不同类型的值。 指针 则是一种将数据所处位置告诉计算机的类型。

linux配置zsh终端

less than 1 minute read

从echo $SHELL可以查看当前使用的终端是/bin/bash。zsh是Ubuntu的一种终端工具,虽然听说功能很强很给力,事实上我只是被他的众多主题迷住了。 [具体查看文档](https://wiki.archlinux.org/index.php/Zsh_(%E7%AE%80%E4%BD%93...

Ubuntu安装后的环境配置注意点

less than 1 minute read

Ubuntu系统刚安装完成后,工作还只是进行了一小半,还有一大堆的环境需要配置搭建。比如说JDK, nodejs, python, vs code编译器 …

git stash储藏命令

less than 1 minute read

储藏(stashing)可以获取工作目录的中间状态,即被修改过的被追踪的文件和暂存的变更。并将它保存在一个未完结变更的堆栈中,随时可以重新应用。

C++变量

1 minute read

C++基础语法,变量的命名规则、类型概述

Use ADB

3 minute read

ADB是连接手机设备和电脑设备的调试桥。这种工具命令用于Android调试是基础而且重要的。

在Android源码调试函数的堆栈

less than 1 minute read

在Android代码中可以通过了解函数的CallStack加速调试和分析过程,本文说明如何在Android运行时加入CallStack及Android P上的注意点。

VS code常用插件

less than 1 minute read

vscode的一些常用插件和配置方法

Use VTS

1 minute read

为了确保Vendor层实现的前向兼容性,新的Vendor层接口会由供应商测试套件 (VTS) 进行验证,该套件类似于兼容性测试套件 (CTS)。

Use CTS

less than 1 minute read

CTS就是兼容性测试为了确保Android应用能够在所有兼容Android的设备上正确运行,并且保持相似的用户体验,在每个版本发布之时,Android提供了一套兼容性测试用例集合(Compatibility Test Suite, CTS)来认证运行Android系统的设备是否完全兼容Android规范,并...

Back to top ↑