【我的AOSP第一课】AOSP 下载、编译与运行

引言

最近下载编译了 AOSP 源码,最初以为会很困难,但实践下来基本没遇到什么阻碍,一些小问题也都很容易看出问题所在,从而在互联网上找到解决方案。这里只是简单记录下当时遇到的各种各样地问题。

配置

设备 等级
OS Ubuntu20.04
CPU 6核12线程
Memory 32GB
Disk 1TB
Java 1.8
Python 2.7.15

下载

下载AOSP的主要困难在于 gitrepo 以及镜像的配置。repo 并不是一个新的代码管理工具,它只是Google基于Python编写的 多git 仓库管理工具

安装git

这一步就不多说了,git 实在太过于常用了

bash 复制代码
sudo apt install git
git config --global user.email "you@example.com"
git config --global user.name "Your Name"

repo

bash 复制代码
# 下载
mkdir ~/bin
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo
# 配置环境
chmod a+x ~/bin/repo
export PATH=~/bin:$PATH
# 配置repo镜像源
export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'

配置镜像并下载

bash 复制代码
# 代码目录
mkdir WORKING_DIRECTORY
cd WORKING_DIRECTORY
# 同步代码
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-8.1.0_r1
repo sync

参考

juejin.cn/post/720411...

mirrors.tuna.tsinghua.edu.cn/help/AOSP/

编译

编译主要的困难在于各种各样的编译错误。主要集中在

libncurses.so 找不到

这个时候需要安装对应的依赖

bash 复制代码
sudo dpkg --add-architecture i386  
sudo apt-get update
sudo apt-get install libncurses5:i386 
sudo apt-get install libncurses5-dev  libncurses5

Python except getopt.GetoptError, err:

AOSP 在编译时应该使用 Python2,而现在的Ubuntu一般内置的为 Python3。这就需要我们重新设置环境变量,使用update-alternatives可以快捷切换软件版本

bash 复制代码
# sudo update-alternatives --install <链接> <名称> <路径> <优先级>
sudo update-alternatives --install /usr/bin/python python /usr/bin/python2  1
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3  2
sudo update-alternatives --config python  (选择切换Python版本)
python --version 

flex 的 locate bug

flex 是一个词法分析器生成工具,在 Android 编译过程中用于从 lexer.ll 文件生成 C++ 代码。

一些预编译 flex 版本存在 locale 相关的 bug ,当系统的 LC_ALLLANG 环境变量设置为某些值(尤其是中文 locale zh_CN.UTF-8)时,会触发断言失败并崩溃。

通常可以设置相关环境变量来解决

bash 复制代码
# 编辑 ~/.bashrc 或 ~/.zshrc 
echo 'export LC_ALL=C' >> ~/.bashrc 
source ~/.bashrc

Jack server SSL error

这个问题,主要是Java版本导致的,在Java8的一些后期发布版本中,默认禁用了TLSv1, TLSv1.1,而在编译 AOSP 的时候,恰恰需要这俩个东西,所以要去修改相关的配置

bash 复制代码
cd /etc/java-8-openjdk/security
code java.security

然后将

ini 复制代码
jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, \
    DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \
    include jdk.disabled.namedCurves

改为

ini 复制代码
jdk.tls.disabledAlgorithms=SSLv3, RC4, DES, MD5withRSA, \
    DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \
    include jdk.disabled.namedCurves

参考

blog.csdn.net/yyzsyx/arti...

juejin.cn/post/704144...

dev.t-firefly.com/thread-1005...

segmentfault.com/a/119000003...

运行

运行基本没困难,依靠AOSP自带的模拟器

bash 复制代码
elmulator

镜像找不到

没有产生镜像

不过我在编译时出现了一些问题。虽然编译成功结束,但是并没有弹出绿色提示条,同时模拟器也无法启动。经查发现System.img文件根本没有生成,导致模拟器根本找不到系统镜像。

尤其没有任何错误产生,故这里优先尝试了重新编译,最终也是成功弹出了绿色提示条,生成了System.img文件,也启动了elmulator

故编译是否成功,以是否弹出build completed successfully为准

镜像生成位置有误

其次,如果你使用过 ASFP 打开过项目,可能会导致 OUT_DIR 路径被修改,导致 lunch 目标路径与 make 目标路径不一致,这个时候需要自定义 out 路径

sh 复制代码
export OUT_DIR=${out}
相关推荐
HLC++10 小时前
Linux的进程间通信
android·linux·服务器
爱笑鱼14 小时前
Binder(二):AIDL 生成的 Proxy、Stub 和 Parcel 到底在做什么?
android
爱笑鱼14 小时前
Binder(一):一次方法调用,究竟怎样跨进程执行?
android
壮哥_icon15 小时前
【Android 系统开发】使用 BAT 脚本高效自动化管理 /system/priv-app/ 系统应用(安装与卸载)
android·运维·自动化
用户693717500138416 小时前
Claude Code终端日志Token占用实测:一个过滤器砍掉60%-90%
android·前端·后端
蝉蜕日记17 小时前
AccumuPDF高级版 v2.57 | 视图文转换PDF,合并分割压缩
android·智能手机·pdf·生活·软件需求
吐了啊取名字太难17 小时前
美颜系统AI修图本地跑并支持Mac、win、安卓、iOS不卡顿
android·人工智能·windows·数码相机·mac·ai编程
阿pin18 小时前
Android随笔-Retrofit
android·retrofit
想取一个与众不同的名字好难18 小时前
安卓自定义颜色选择器
android
我命由我1234519 小时前
Android 开发问题:java.lang.NoSuchMethodError:No virtual method readAllBytes()
android·java·java-ee·kotlin·android studio·android-studio·android runtime