【我的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}
相关推荐
Lei活在当下4 小时前
【业务场景架构实战】8. 订单状态流转在 UI 端的呈现设计
android·设计模式·架构
小趴菜82274 小时前
Android中加载unity aar包实现方案
android·unity·游戏引擎
qq_252924194 小时前
PHP 8.0+ 现代Web开发实战指南 引
android·前端·php
Jeled4 小时前
Android 本地存储方案深度解析:SharedPreferences、DataStore、MMKV 全面对比
android·前端·缓存·kotlin·android studio·android jetpack
2501_9159184111 小时前
掌握 iOS 26 App 运行状况,多工具协作下的监控策略
android·ios·小程序·https·uni-app·iphone·webview
2501_9159090614 小时前
iOS 混淆实战,多工具组合完成 IPA 混淆与加固(源码 + 成品 + 运维一体化方案)
android·运维·ios·小程序·uni-app·iphone·webview
*才华有限公司*15 小时前
安卓前后端连接教程
android
氦客15 小时前
Android Compose中的附带效应
android·compose·effect·jetpack·composable·附带效应·side effect