记录一次Debug AOSP system_server遇到的问题
Debug AOSP system_server系统环境:android-13.0.0_r78
问题描述:
在一次调试system_service dexopt的过程中发现一个很奇怪的现象:
“局部变量指拿不到”
问题线索:其实这个很容易就能想到,大概率就是被混淆了。导致局部变量的名称发生变化。
信息检索CSDN博客——“AOSP 14 framework debug无法看到变量的问题原创”
通过上文我们可以知道,主要原因是framework/base/services模块有一处定义了代码混淆逻辑
解决问题尝试注销掉这部分代码。
frameworks/base/services/Android.bp
重新编译
1mmm frameworks/base/services/
编译完成后刷入设备中
当然也可以全部分区flush. 但是没那个必要。
12345678910# 笔者设备为Pixel 5因此路径中会有redfincd out/target/product/redfin/system/framework# 以root权 ...
AOSP源码阅读环境配置
AOSP阅读环境配置
硬件环境DIY主机
CPU:AMD R9 7950X
内存:光威 6400Hz 32G(16G * 2)
主板:GIGABYTE 冰雕小板
硬盘:ZhiTai TiPlus 7100 Gen4 2TB
软件配置系统:Ubuntu 24.04
源代码安装具体流程可分为
1.repo工具下载
2.源代码下载
略
安装流程可参考
清华镜像源帮助问题
工程基础配置
注意这里不是说repo工具需要做一些配置。
而是说需要使用repo做一些工程上的配置。
1.repo start branchName –all
将所有工程开启新分支(方便后续拉取多分支)
2.配置脚本
可将常用的脚本书写复用
如下是笔者封装的lunch脚本。(用于source aosp脚本)
123source build/envsetup.sh# 自定义output路径,防止在不同分支check的时候输出相互覆盖。打包异常。export OUT_DIR=out/$(repo branch | grep "\*" | awk -F ' ' ' ...
BCC工具安装
BCC工具安装pre:阅读本文章,最好具备eBPF的基础了解。知晓BPF,eBPF基础概念。
BCC github地址
pre环境前提条件:
1.内核版本4.1以上
Linux kernel version 4.1 or newer is required
2.内核参数
123456789101112131415CONFIG_BPF=yCONFIG_BPF_SYSCALL=y# [optional, for tc filters]CONFIG_NET_CLS_BPF=m# [optional, for tc actions]CONFIG_NET_ACT_BPF=mCONFIG_BPF_JIT=y# [for Linux kernel versions 4.1 through 4.6]CONFIG_HAVE_BPF_JIT=y# [for Linux kernel versions 4.7 and later]CONFIG_HAVE_EBPF_JIT=y# [optional, for kprobes]CONFIG_BPF_EVENTS=y# Need kernel headers th ...
Dex Load Process
pre对一些环境信息做阐述和说明
1.本文分析的是AOSP android-13.0.0_r78的流程(aosp_redfin_userdebug)
2.本文使用设备为pixel5
Dex加载过程解析install time
安装过程中PMS会做一些操作将我们的apk的Manifest进行解析
具体的分析思路如下:
1.准备一个demo app.(其实什么demo都可以)
2.在PMS上打断点
com.android.server.pm.pkg.parsing.ParsingPackageUtils#parsePackage
3.安装APP
4.等待断点停下
PMS解析
如下是解析XML的堆栈
Text1234567891011121314parsePackage:372, ParsingPackageUtils (com.android.server.pm.pkg.parsing)parsePackage:168, PackageParser2 (com.android.server.pm.parsing)parsePackage:150, PackageParser2 (co ...
记一次在AOSP上装Google Play的尝试
记一次在AOSP上装Google Play的尝试结果
背景
最近在工作中有需要用到 Google Play 来验证一些事情。
但是我手中的测试机Pixel5刷了 AOSP 是不具备 Google Play 的环境的。
经过多次调研 & 尝试在 AOSP 上安装 Google Play都已失败告终
1.NikeGapps(Pixel 5 不能刷 Recovery)
2.bitgapps(Pixel 5 不能刷 Recovery)
3.microGapps(存在一些兼容问题)
在无意间发现了一篇文章StackOverflow
文章大致内容是说可以通过提取官方镜像中的 APK,导入到 AOSP 中。
虽然这篇文章很早之前都看过,但是觉得比较麻烦,就没尝试。
本文章也算是最终尝试的记录。(要是还不行我真撂挑子了 这个 GP 谁爱装谁装了 : )
过程12.14日——失败确认官方镜像的版本通过Settings -> About Phone -> Build Number 可知AOSP 的版本
我的是 TQ3A.230901.001.C2 其实也就是 androi ...
SurfaceViewSync机制
Android13 SurfaceView Sync机制引入
1.当我是一名初级Android开发者的时候,有一个概念一直灌输给我——Android是单线程渲染,有且只有主线程能渲染UI.
实际上并不是如此,除开普通的普通的View如TextView,ImageView .
Android其实是支持子线程渲染的——SurfaceView.
2.SurfaceView的渲染帧不跟随View渲染,也就是说不归ViewRootImpl管。单独的Surface,单独渲染
特立独行是有代价的,SurfaceView的异步绘制会带来一些UI呈现的问题。
比如View渲染和SurfaceView的渲染不同步,只要SurfaceView or View渲染任意一个渲染快了就会导致UI呈现上的不一致。
假如有一个需求场景:简单来说是一个视频播放的页面,其中包含一些普通的控件 & 用于播放视频的SurfacView.具体的需求如下
需要播放器和页面中的其他控件一起渲染。因为SurfaceView渲染早了会导致只有一个光秃秃的视频在播,渲染晚了SurfaceView会有黑屏。这都是不好的用户体 ...
Magisk基础
Magisk基础项目源代码地址
Magisk是什么?有什么用?
Magisk是一个开源的用于获取Root权限的框架
Magisk可以用于获取手机Root权限
Magisk如何使用
具体的使用可见手册
官方手册
简单来说:
环境需要:
已经解除BootLoader锁。
已经安装adb、fastboot工具(以及驱动)
系统boot镜像
使用步骤:
根据是否有ramdisk分区确认初始镜像,如果有获取系统的boot/init_boot镜像,如果没有获取recovery镜像
使用Magisk App对初始进行进行patch操作
使用fastboot刷入boot/init_boot/recovery镜像
Magisk项目源代码环境配置
具体内容可见
官方手册
1.设置环境
先下载Magisk项目
1git clone --recurse-submodules https://github.com/topjohnwu/Magisk.git
然后下载Magisk定制的ndk
1./build.py ndk
2.编译项目
12345678910 ...
Compose源码环境搭建
Compose源码环境搭建
进行Compose源代码环境构建。
Compose Compiler:1.5.1
前言
为什么需要使用Linux作为搭建环境?(指跑源代码)
这肯定不是我想用Linux开发,因为Compose项目的限制
a. 我们可以看一部分project的manifest声明,发现什么?项目依赖了ios的sdk,linux的sdk,就是没有Windows。这想表明什么就不言而喻了
b. 通过查看Compose项目的一部分的文件你也能发现一些端倪,没有gradlew.bat?所以使用Windows跑环境会有一些问题的。
(不清楚是否能跑。但是绝对是要做一些配置的。)
为什么选择配置Compose Compiler的Release环境?
很简单,如果你拉取最新的commit项目未必能跑起来,是否稳定你只能求助开发者。
这是因为开发分值是feature最多的分值,而且你不清楚他是否是开发完成的,这种项目的不稳定因素肯定就尽可能控制下。
(问就是踩过坑。)
Release的版本号为什么选择1.5.1
我们可以查看下目前的Compose Compiler Rel ...
Gradle构建流程
Gradle构建流程
前面我们分析了Gradle的Daemon启动。后续我们需要对Gradle的构建流程进行分析(粗略分析)
缘起
前面分析到,Gradle的Daemon启动源于Client Connector连接。
由于Client连接了Server,Server在没有启动的时候才会进行Fork启动。
启动后的Server并不会构建,因为Server也不知道Client要干嘛,因为Server还没有Client的构建信息。
所以接下来会介绍Gradle构建的触发。
(其实上部分Daemon启动的解析中有提到——也就是Connect accept过程会触发构建流程)
1234567891011121314151617181920212223242526272829303132public class DaemonTcpServerConnector implements DaemonServerConnector { // ...... @Override public Address start(final IncomingConnection ...
Gradle Daemon启动分析
Gradle Server Start
Server的启动主要是进行初始化和环境的准备
主要可以分为如下几个过程
Bootstrap:启动进程,设置ClassLoader
Init:初始化成员,初始化Socket
Wait:进程keep-alive,防止main线程死亡,休眠等待。
Bootstrap
前面分析到了Gradle会通过ProcessBuilder开启一个Deamon进程
并调用shell
12java -cp *gradle-launcher-7.6.jar org.gradle.launcher.daemon.bootstrap.GradleDaemon
BootStrap
和Client启动类似
12345public class GradleDaemon { public static void main(String[] args) { ProcessBootstrap.run("org.gradle.launcher.daemon.bootstrap.DaemonMain", args) ...