草庐IT

<漫漫Android路>AOSP源码获取编译及问题处理

Six.Plus 2023-07-01 原文

漫漫Android路---1.AOSP源码获取编译及导入

写在前面

年轻时候的他,发际线尤在,互联网某厂开发Android多年,退三四线某城市苟且
空有撸码双手,却无处安放,子曰温故而知新可以为师矣…故记录此系列以防失能

环境准备

  • 1.Ubuntu22.04(700G+8核+8G DDR4)
  • 2.VMware® Workstation 16 Pro

AOSP源码获取

AOSP源码较为庞大,相关各模块均是基于git工具进行项目管理与代码提交,整个源码是基于多个git目录分模块整合的
Google基于Python开发了辅助开发者进行多个项目管理的工具Repo,Repo就是封装了git命令的python脚本

1.Repo下载配置

# 在home下创建bin文件夹
mkdir ~/bin     

# 把bin文件夹加入环境变量的  																								
PATH=~/bin:$PATH

#下载repo脚本    																						
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo  

#添加权限	
chmod a+x ~/bin/repo      																				

若提示curl提示需要安装

sudo apt install curl

2.Git安装及配置

sudo apt-get install git 
git config --global user.name YourName
git config --global user.email YourEmail@example.com

3.AOSP获取

由于某些不可控的网络因素,需要从清华源去获取对应的AOSP源码

https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar
AOSP项目所有的分支列表:代号、标记和 Build 号 | Android 开源项目 | Android Open Source Project

具体流程如下:

# 讲代码包下载到当前目录
wget https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar

# 解压对应的压缩包得到aosp源码目录
tar xf aosp-latest.tar

# 进入源码目录
cd aosp

# 初始化仓库
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest

# repo制定android版本,末尾的-b android-9.0.0_r46用于指定具体的源码的版本
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-9.0.0_r46

# 同步源码,正常同步后即可获得完整目录
# 同步中提示无法连接到 gerrit.googlesource.com
# 需要修改~/bin/repo文件
# 找到REPO_URL,修改为https://mirrors.tuna.tsinghua.edu.cn/git/git-repo
repo sync

# 遇到同步失败,可以将如下内容复制到shell脚本中(遇到错误,让循环同步源码)
repo sync -j4
while [ $? -ne 0 ] 
do 
    repo sync -j4
done

AOSP源码编译

官方参考:搭建构建环境 | Android 开源项目 | Android Open Source Project

1.安装编译依赖

sudo apt install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib 
sudo apt install -y git flex bison gperf build-essential libncurses5-dev:i386 
sudo apt install tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386 
sudo apt install dpkg-dev libsdl1.2-dev libesd0-dev
sudo apt install git-core gnupg flex bison gperf build-essential  
sudo apt install zip curl zlib1g-dev gcc-multilib g++-multilib 
sudo apt install libc6-dev-i386 
sudo apt install lib32ncurses5-dev x11proto-core-dev libx11-dev 
sudo apt install libgl1-mesa-dev libxml2-utils xsltproc unzip m4
sudo apt install lib32z-dev ccache

2.开始执行编译

2.1 初始化环境

执行envsetup.sh脚本初始化环境

# 进入源码目录
cd aosp
# 前面的点要加上 不然提示权限被拒绝
. build/envsetup.sh

2.2 选择编译目标

通过lunch命令指定编译目标,即编译出的镜像文件运行在哪个型号的Android设备,我这边编译aosp_x86-eng,执行命令

lunch aosp_x86-eng

2.3 开始编译镜像

通过make指令进行代码编译,该指令通过-j 参数设置编译线程数
以提高编译速度.比如这里我们设置4个线程同时编译:

make -j4

参与编译的线程并不是越多越好,通常是根据设备CPU的核心来确定core*2,也就是CPU核心的2倍

3.编译相关问题

3.1 Java与Python环境变量引起的

Java与Python两个版本共存及切换
原先配置的Java环境变量为Oracle的(路径为/home/主机名称/DevTools/jdk1.8.0/bin/)
AOSP编译需要指定为OpenJDK的

#add java alternatives orcale-jdk
sudo update-alternatives --install /usr/bin/java java /home/主机名称/DevTools/jdk1.8.0/bin/java 1
sudo update-alternatives --install /usr/bin/javac javac /home/主机名称/DevTools/jdk1.8.0/bin/javac 2
sudo update-alternatives --config java
#接下来选择对应的所需版本即可

Utuntu22.04系统内置Python版本为3.10,AOSP编译需要的Python版本为2.7
编译中经常会遇到Python2与Python3的语法不一致导致的问题

#add python alternatives python2.7 python3.10
sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.10 2
sudo update-alternatives --config python
#接下来选择对应的所需版本即可

3.2 flex编译引起的问题

system/extras/micro_bench/micro_bench.cpp:434:12: warning: unused variable 'alloc_size' [-Wunused-variable]
    size_t alloc_size = size * 2 + 3 * cmd_data.dst_align; // should alloc_size be used?
           ^
1 warning generated.
[  6% 5444/79608] target  C++: micro_bench_static <= system/extras/micro_bench/micro_bench.cpp
system/extras/micro_bench/micro_bench.cpp:434:12: warning: unused variable 'alloc_size' [-Wunused-variable]
    size_t alloc_size = size * 2 + 3 * cmd_data.dst_align; // should alloc_size be used?
           ^
1 warning generated.
[  7% 5599/79608] Build hyb out/target/product/generic_x86/obj/ETC/hyph-hu_intermediates/hyph-hu.hyb <- external/hyphenation-patterns/hu//hyph-hu.pat.txt
21515 unique nodes, 102669 total
[  7% 5964/79608] Target buildinfo: out/target/product/generic_x86/obj/ETC/system_build_prop_intermediates/build.prop
Target buildinfo from: build/make/target/board/gsi_system.prop
[  9% 7810/79608] //external/one-true-awk:awk_vendor yacc awkgram.y
external/one-true-awk/awkgram.y: conflicts: 43 shift/reduce, 85 reduce/reduce
[ 10% 8039/79608] //external/one-true-awk:awk yacc awkgram.y
external/one-true-awk/awkgram.y: conflicts: 43 shift/reduce, 85 reduce/reduce
[ 10% 8088/79608] //external/selinux/checkpolicy:checkpolicy lex policy_scan.l [linux_glibc]
FAILED: out/soong/.intermediates/external/selinux/checkpolicy/checkpolicy/linux_glibc_x86_64/gen/lex/external/selinux/checkpolicy/policy_scan.c 
prebuilts/misc/linux-x86/flex/flex-2.5.39 -oout/soong/.intermediates/external/selinux/checkpolicy/checkpolicy/linux_glibc_x86_64/gen/lex/external/selinux/checkpolicy/policy_scan.c external/selinux/checkpolicy/policy_scan.l
flex-2.5.39: loadlocale.c:130: _nl_intern_locale_data: Assertion `cnt < (sizeof (_nl_value_type_LC_TIME) / sizeof (_nl_value_type_LC_TIME[0]))' failed.
Aborted (core dumped)
[ 10% 8091/79608] //system/netd/bpfloader:bpfloader clang++ BpfLoader.cpp
ninja: build stopped: subcommand failed.
01:18:07 ninja failed with: exit status 1

分析日志

prebuilts/misc/linux-x86/flex/flex-2.5.39
oout/soong/.intermediates/external/selinux/checkpolicy/checkpolicy/linux_glibc_x86_64/gen/lex/external/selinux/checkpolicy/policy_scan.c 
external/selinux/checkpolicy/policy_scan.l

Flex这款语法解释器生成器(lexical analyser generator),作用是将以*.l为扩展名的源文件编译成解释器的C语言代码
checkpolicy这个用于检测SELinux策略(SELinux policy)的工具,正是使用flex来解析策略文件的语法的

解决方案

flex需要手动解压并进行编译配置,命令如下:

cd prebuilts/misc/linux-x86/flex
rm flex-2.5.39
tar zxf flex-2.5.39.tar.gz
cd flex-2.5.39
./configure
make
mv flex  ..
cd ..
rm flex-2.5.39
mv flex flex-2.5.39

AOSP源码导入AS

1.编译生成idegen.jar

源码根目录执行如下命令:

source build/envsetup.sh
make idegen

终端输出:

============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=9
TARGET_PRODUCT=aosp_x86
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_ARCH=x86
TARGET_ARCH_VARIANT=x86
HOST_ARCH=x86_64
HOST_2ND_ARCH=x86
HOST_OS=linux
HOST_OS_EXTRA=Linux-5.15.0-52-generic-x86_64-Ubuntu-22.04.1-LTS
HOST_CROSS_OS=windows
HOST_CROSS_ARCH=x86
HOST_CROSS_2ND_ARCH=x86_64
HOST_BUILD_TYPE=release
BUILD_ID=PQ3A.190801.002
OUT_DIR=out
============================================
ninja: no work to do.
ninja: no work to do.
No need to regenerate ninja file
No need to regenerate ninja file
[100% 5/5] Install: out/host/linux-x86/framework/idegen.jar

#### build completed successfully (8 seconds) ####

2.生成 android.ipr 和 android.iml

$ development/tools/idegen/idegen.sh
Read excludes: 13ms
Traversed tree: 51647ms

3.AndroidStudio打开AOSP源码

File->Open->选择源码aosp目录下的android.ipr文件

导入完成后即可看到整个Android源码的目录,接下来从Java开始学习吧

有关<漫漫Android路>AOSP源码获取编译及问题处理的更多相关文章

  1. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

  2. ruby - 通过 rvm 升级 ruby​​gems 的问题 - 2

    尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub

  3. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  4. ruby - 通过 RVM (OSX Mountain Lion) 安装 Ruby 2.0.0-p247 时遇到问题 - 2

    我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search

  5. ruby - Fast-stemmer 安装问题 - 2

    由于fast-stemmer的问题,我很难安装我想要的任何ruby​​gem。我把我得到的错误放在下面。Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingfast-stemmer:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcreatingMakefilemake"DESTDIR="cleanmake"DESTDIR=

  6. ruby - 简单获取法拉第超时 - 2

    有没有办法在这个简单的get方法中添加超时选项?我正在使用法拉第3.3。Faraday.get(url)四处寻找,我只能先发起连接后应用超时选项,然后应用超时选项。或者有什么简单的方法?这就是我现在正在做的:conn=Faraday.newresponse=conn.getdo|req|req.urlurlreq.options.timeout=2#2secondsend 最佳答案 试试这个:conn=Faraday.newdo|conn|conn.options.timeout=20endresponse=conn.get(url

  7. ruby - 安装 Ruby 时遇到问题(无法下载资源 "readline--patch") - 2

    当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub

  8. ruby - 从 Ruby 中的主机名获取 IP 地址 - 2

    我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge

  9. ruby - 获取模块中定义的所有常量的值 - 2

    我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c

  10. ruby-on-rails - 获取 inf-ruby 以使用 ruby​​ 版本管理器 (rvm) - 2

    我安装了ruby​​版本管理器,并将RVM安装的ruby​​实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby​​。有没有办法让emacs像shell一样尊重ruby​​的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el

随机推荐