【我的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}
相关推荐
2601_9498333910 分钟前
flutter_for_openharmony口腔护理app实战+知识实现
android·javascript·flutter
晚霞的不甘11 分钟前
Flutter for OpenHarmony从基础到专业:深度解析新版番茄钟的倒计时优化
android·flutter·ui·正则表达式·前端框架·鸿蒙
鸟儿不吃草43 分钟前
android的Retrofit请求https://192.168.43.73:8080/报错:Handshake failed
android·retrofit
Minilinux20181 小时前
Android音频系列(09)-AudioPolicyManager代码解析
android·音视频·apm·audiopolicy·音频策略
李子红了时1 小时前
【无标题】
android
Android系统攻城狮2 小时前
Android tinyalsa深度解析之pcm_close调用流程与实战(一百零四)
android·pcm·tinyalsa·音频进阶·音频性能实战·android hal
weixin_411191842 小时前
LifecycleEventObserver和DefaultLifecycleObserver使用
android
、BeYourself3 小时前
Intent :跳转与数据传递的正确打开方式
android·android-studio
灵感菇_3 小时前
Android 列表控件全面解析:ListView 与 RecyclerView
android·ui
2601_949809593 小时前
flutter_for_openharmony家庭相册app实战+照片详情实现
android·java·flutter