【我的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}
相关推荐
成都大菠萝14 小时前
Android Auto开发(3)-Audio Integration
android
成都大菠萝15 小时前
Android Auto开发(5)-Audio Integration
android
泡沫·15 小时前
7.LAMPLNMP 最佳实践
android
码码宁15 小时前
六个故事搞懂Fragment 故事1-初识Fragment - NewsHub的模块化革命
android
成都大菠萝15 小时前
Android Auto开发(0)-引言
android
q***333717 小时前
SpringMVC新版本踩坑[已解决]
android·前端·后端
F***741717 小时前
数据库课设---酒店管理系统(MySQL、VBNet)
android·数据库·mysql
踢球的打工仔17 小时前
PHP面向对象(5)
android·java·php
zhaoyufei1331 天前
Android13删除Taskbar
android
6***B481 天前
存储过程(SQL)
android·数据库·sql