《Framework 开发》3、开发工具及命令行知识装备

1、AIDEGen

AIDEGen 是 google 推出的一个工具,用于方便开发者使用 IDE 来查看和修改系统源码。

AIDEGen + Android Studio 非常适合用于阅读与修改 Android 系统 Java 代码。

使用 AIDEGen 之前我们需要做一些准备工作:

编译 sdk:

bash 复制代码
cd aosp
source build/envsetup.sh
lunch sdk-eng
# 或者 #lunch sdk-userdebug # or #lunch sdk-user make sdk
make sdk

ps:如果自己的磁盘够,建议用上面的 make sdk,这样不容易出问题;但是磁盘有限的话,可以使用下面的方式:

↓↓↓↓↓↓省硬盘空间方式 start↓↓↓↓↓↓

bash 复制代码
#安装 Python 3.9 (系统不改变默认 Python)

Ubuntu 22.04 默认没有 3.9,需要用 deadsnakes PPA:

sudo add-apt-repository ppa:deadsnakes/ppa -y
sudo apt update
sudo apt install python3.9 python3.9-venv python3.9-distutils -y
# `python3.9-venv` 是创建虚拟环境必需的
# `python3.9-distutils` 是 pip 安装依赖
# 创建 Python 3.9 虚拟环境 
python3.9 -m venv ~/aidegen-venv
# 激活环境:
source ~/aidegen-venv/bin/activate
# 此时虚拟环境里的 python 就是 3.9:
python --version
# 输出 Python 3.9.x
# 安装兼容 protobuf
pip install --upgrade pip
pip install protobuf==3.19.4
# protobuf 3.19.4 在 Python 3.9 下与 aidegen / Soong 兼容,不会报 `MutableMapping` 错误。

# 运行 aidegen,确保虚拟环境激活,然后运行:
cd aosp
source ~/aosp/build/envsetup.sh
lunch aosp_x86_64-eng
aidegen packages/apps/Launcher3 -p ~/android-studio/bin/studio.sh
 
 
# 使用完毕退出虚拟环境
deactivate

这样,就把python3.9的虚拟环境创建好,并且调试通了

后续只需要使用下方的命令即可:

bash 复制代码
# **测试**
source ~/aidegen-venv/bin/activate
source ~/aosp/build/envsetup.sh
lunch aosp_x86_64-eng
aidegen packages/apps/Launcher3 -p  studio.sh

↑↑↑↑↑↑省硬盘空间方式 end↑↑↑↑↑↑

2、VScode

我们可以使用 vscode 中的 file -> open folder 选择我们的系统源码目录,即可打开整个系统源码。 另外为了使我们的 vscode 更好用更好看,通常我们会安装一下一些插件:

  • C/C++ Extension Pack
  • Extension Pack for Java
  • Makefile Tools
  • RC Script language
  • Android System Tools
  • Android Studio Color Theme

3、find + grep 命令使用

Android 系统源码繁杂,通常我们通过 find 命令来查找我们关心的文件。使用 find + grep 命令查找我们关心的文件内容。

  • 找文件,比如 service_manager.c
arduino 复制代码
find . -name "service_manager.c" 
./frameworks/native/cmds/servicemanager/service_manager.c
  • 找文件内容,找 recyclerview 库
bash 复制代码
find . -name "Android.bp" | xargs grep "name: \".*recyclerview.*\"" 
输出:
./prebuilts/sdk/current/androidx/Android.bp: name: "androidx.recyclerview_recyclerview-selection-nodeps", 
./prebuilts/sdk/current/androidx/Android.bp: name: "androidx.recyclerview_recyclerview-selection", 
./prebuilts/sdk/current/androidx/Android.bp: name: "androidx.recyclerview_recyclerview-nodeps", 
./prebuilts/sdk/current/androidx/Android.bp: name:"androidx.recyclerview_recyclerview", ./prebuilts/sdk/current/support/Android.bp: name: "android-support-recyclerview-selection-nodeps", 
./prebuilts/sdk/current/support/Android.bp: name: "android-support-recyclerview-selection", 
./prebuilts/sdk/current/support/Android.bp: name: "android-support-v7-recyclerview-nodeps", 
./prebuilts/sdk/current/support/Android.bp: name: "android-support-v7-recyclerview",

4、通过第一步中的编译 sdk后,再来配置 Android Studio

① 首先,选择我们的目标 Product:

bash 复制代码
# 进入aosp目录后,再执行
source build/envsetup.sh 
lunch aosp_x86_64-eng

② 打开系统模块,我们以 Settings 为例:

bash 复制代码
# Settings 可以更换为其他模块名 or 模块存在的路径,即可打开其他模块 
# -i 表示使用ide,s 表示 Android Studio
aidegen Settings -i s 

如果出现了如下问题:

arduino 复制代码
AttributeError: module 'collections' has no attribute 'MutableMapping'

原因是 Python 3.10 及以上版本中常见的问题。原因是:在 Python 3.10+ 中,collections.MutableMapping 被移到了 collections.abc.MutableMapping,旧写法会报错。而我们用到的 aidegen 或者 protobuf 版本还在用旧的写法。

解决方法

创建 Python 3.9 虚拟环境(推荐)

这样不会影响系统 Python,环境干净:

bash 复制代码
cd ~/aosp
python3.9 -m venv venv39
source venv39/bin/activate
pip install --upgrade pip
pip install protobuf

再把 Android Studio 放到 /opt 目录下 。 我这里用的是android studio 2021 redirector.gvt1.com/edgedl/andr...

接着在虚拟环境里直接运行:

css 复制代码
aidegen Settings -i s

进入

等待片刻:

点击 configure

点击ok。

然后,点 File 菜单下的 project structure,配置 jdk 和 sdk

点击 SDKS:

添加 jdk,配置上 aosp 内的jdk9

bash 复制代码
prebuilts/jdk/jdk9/linux-x86

然后再添加 sdk,配置上我们上面 make 好的 sdk(API 29)

bash 复制代码
out/host/linux-x86/sdk/sdk/android-sdk_eng.用户名_linux-x86

然后为了区分这个是咱们专门编译 aosp 的 sdk,给他改个名字

点击ok,保存之后,再次进入 project structure, 给 priject 配置 sdk

选择咱们的专用 sdk

点击 apply;

然后接着设置 modules 的 sdk,如下图所示,dependencies-Settings的Module SDK保持就好:

然后点击 modules ,再点击 Settings(咱们要调试的系统 app),选择 dependencies,配置上我们的专属 sdk:

点击apply,到此,android studio的环境就配置好了。

未完待续。。。

退出虚拟环境:

复制代码
deactivate

后续操作步骤:

bash 复制代码
source build/envsetup.sh 
lunch aosp_x86_64-eng
source venv39/bin/activate
#比如说加载 settings
aidegen Settings -i s
#打开studio后做自己的调试工作
#最后退出虚拟环境
deactivate

5、开启emulator,并调试

① 同样,在这样的环境中去打开 emulator

bash 复制代码
source build/envsetup.sh 
lunch aosp_x86_64-eng
source venv39/bin/activate
emlator

② 打开 Settings 应用的主 Activity

通过清单文件判断主 Activity 大致是这个,打上断点

③打开调试窗口

选择 Settings 应用,然后点击调试按钮

然后直接敲上 setting 就定位到了。

点击ok,此时就打开了 Settings 应用的调试。

④ 打开emulator,上滑,找到 Settings 应用,打开

此时,Settings 应用会停在空白页面,再打开我们的 android studio,查看断点 这样,我们就可以针对某个具体的页面,或者功能调试了!!!

相关推荐
安卓理事人1 小时前
安卓图表MpAndroidChart使用
android
奋斗的小鹰2 小时前
在已有Android工程中添加Flutter模块
android·flutter
介一安全2 小时前
【Frida Android】实战篇13:企业常用非对称加密场景 Hook 教程
android·网络安全·逆向·安全性测试·frida
lin62534223 小时前
Android右滑解锁UI,带背景流动渐变动画效果
android·ui
鹏多多6 小时前
Flutter输入框TextField的属性与实战用法全面解析+示例
android·前端·flutter
2501_916008896 小时前
iOS 开发者工具全景图,构建从编码、调试到性能诊断的多层级工程化工具体系
android·ios·小程序·https·uni-app·iphone·webview
Winter_Sun灬7 小时前
CentOS 7 编译安卓 arm64-v8a 版 OpenSSL 动态库(.so)
android·linux·centos
柯南二号7 小时前
【大前端】【Android】用 Python 脚本模拟点击 Android APP —— 全面技术指南
android·前端·python
龚礼鹏7 小时前
图像显示框架六——SurfaceFlinger的初始化以及任务调度(基于Android 15源码分析)
android
壮哥_icon7 小时前
Android 使用 PackageInstaller 实现静默安装,并通过 BroadcastReceiver 自动重启应用
android·gitee·android-studio·android系统