草庐IT

Framework学习之下载AOSP源码编译详解

Android开发编程 2023-03-28 原文
一.准备工作

Android 官方声明 AOSP 历来是在 Ubuntu LTS 版本中进行开发和测试。所以为了避免任何其他不必要的麻烦,请使用 Ubuntu 及其他基于 Ubuntu 的发行版

最低环境要求:

  • Ubuntu 14.04+
  • JDK1.8+
  • python3
  • GNU make
  • git
二.下载Aosp源码

1.安装GIT

首先需要安装Git,因为源码是用Git管理的。

sudo apt-get install git
接下来创建一个bin文件夹,并加入到PATH中,有点像Windows的环境变量。

mkdir ~/bin
PATH=~/bin:$PATH
然后初始化Git,邮箱和姓名。
git config --global user.email "xxx@gmail.com"
git config --global user.name "xxx"

2.安装Python环境

sudo apt-get install python

3.安装repo及配置

repo 是一个python 脚本(所以我们上面要配置Python环境),因为Android源码包含数百个git库,简化帮助管理git Android版本库的工具。

(1)安装curl下载的库:

sudo apt-get install curl

(2)下载repo并设置可以运行权限。

curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo
chmod a+x ~/bin/repo

(3)添加下载源

google 的AOSP 的话,因为FQ和数据量太大,且需要需要翻墙影响速度,因此优先考虑国内的镜像(本文使用的是清华的源)。

export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'

4.初始化及同步源码

(1)创建文件夹

创建一个AOSP文件夹,cdd到文件夹里面去待会儿需要把源码下载到这里:

mkdir aosp
cd aosp

(2)初始化Aosp仓库

repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest

(3)初始化并指定版本

repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-8.0.0_r36

AOSP对应关系查看地址: 对应关系

(4)开始同步源码

repo sync -j4
-j表示并发数.

因为Android的源码越来越大,repo sync失败的概率也越来越高。所以我们可以避开使用repo sync的方式,而采用下载预下载包的方式来实现下载源码

5.预下载包的方式

1. 下载预下载包

在windows或者Linux上面通过迅雷下载https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar
wget -c https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar #下载初始化包

2. 解压预下载包

tar xf aosp-latest.tar
cd AOSP->解压得到的 AOSP 工程目录,这时 ls 的话什么也看不到,因为只有一个隐藏的 .repo 目录

3. 查看分支

cd .repo/manifests
git branch -a

4. 在aosp目录选择需要同步的版本

repo init -b android-9.0.0_r55
repo sync # 正常同步一遍即可得到完整目录
或者直接在aosp目录设置好你要同步的分支:
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-8.0.0_r36
repo sync # 正常同步一遍即可得到完整目录
如果仅加载具体模块:
repo sync platform/prebuilts/clang/host/darwin-x86

5.防止下载源码执行脚本卡死

通过自定义Shell脚本启动源码下载可以有效防止,同步源码时脚本被卡死的问题。

(1)在AOSP文件夹中新建down.sh文件

#!/bin/bash
echo “======= start repo sync =======
cd ~/Desktop/AOSP
repo sync -j4
while [ $? == 1 ]; do
echo “====== sync failed! re-sync again =====
sleep 3
repo sync -j4

(2)执行down.sh文件

sh down.sh

三.AOSP源码目录结构

  • abi Application Binary Interface 应用程序二进制接口,abi相信同学们在SO库调用上遇到过,如果不支持该平台的话就说不ABI不支持
  • art Android Runtime 安卓运行时。这个会提前把字节码编译成二进制机器码保存起来,执行的时候加载速度比较快。Dalvik虚拟机则是在加载以后再去编译的,所以速度上ART会比Dalvik快一点。牺牲空间来赢取时间
  • bionic 基础库,Android系统与Linux内核的桥梁。Bionic 音标为 bīˈänik,翻译为"仿生"
  • bootable 系统启动引导相关程序
  • build 用于构建Android系统的工具,也就是用于编译Android系统的
  • cts Compatibility Test Suite 兼容性测试
  • dalvik dalvik虚拟机,用于解析执行dex文件的虚拟机
  • developers 开发者目录
  • developerment 开发目录,比如说应用,application就在里面了,apps
  • devices 设备相关的配置信息,什么索尼、HTC、自己的产品,就可以定义在这个目录下了
  • docs 文档
  • external 开源模组相关文件
  • frameworks 系统架构,Android的核心了
  • hardware hal层代码,硬件抽象层
  • libcore 核心库
  • libnativehelper native帮助库,实现JNI的相关文件
  • ndk native development kit
  • out 输出目录,编译以后生成的目录,相关的产出就在这里了
  • packages 应用程序包。一些系统的应用就在这里了,比如说蓝牙,Launcher,相机,拨号之类的。
  • pdk Plug-in Development Kit (PDK) is designed to help you build your own pattern projects
  • platform_testing 平台测试
  • prebuilts x86/arm架构下预编译的文件
  • sdk software development kit
  • system 底层系统文件
  • toolchain 工具链
  • tools 工具文件
  • Makefile mk文件,用于控制编译
四.AOSP源码整编

编译AOSP源码需要配置好JAVA环境.

1.安装Java编译环境

sudo apt-get update
sudo apt-get install openjdk-8-jdk

2.进入AOSP文件夹,进行编译

(1)初始化编译环境

source build/envsetup.sh

(2)删除上一次编译的结果,初次编译可以不需要这一步

make clobber

(3)选择与设备对应的编译版本

lunch XX

选择与设备对应的编译版本.如:编译开发工程师的版本lunch aosp_x86-eng,可以方便debug

编译版本选择

如果lunch命令没有加对应的编译版本则会有以下信息输出:

You're building on Linux
Lunch menu... pick a combo:
1. aosp_arm-eng
2. aosp_arm64-eng
3. aosp_mips-eng
4. aosp_mips64-eng
5. aosp_x86-eng
6. aosp_x86_64-eng
7. full_fugu-userdebug
8. aosp_fugu-userdebug
9. mini_emulator_arm64-userdebug
10. m_e_arm-userdebug
11. m_e_mips64-eng
12. m_e_mips-userdebug
13. mini_emulator_x86_64-userdebug
14. mini_emulator_x86-userdebug
15. aosp_dragon-userdebug
16. aosp_dragon-eng
17. aosp_marlin-userdebug
18. aosp_sailfish-userdebug
19. aosp_flounder-userdebug
20. aosp_angler-userdebug
21. aosp_bullhead-userdebug
22. hikey-userdebug
23. aosp_shamu-userdebug
Which would you like? [aosp_arm-eng]

这里需要选择编译目标的格式(选择前面的序号,按回车即可),编译目标的格式组成为BUILD-BUILDTYPE,比如aosp_arm-eng的BUILD为aosp_arm,BUILDTYPE为eng。 其中BUILD表示编译出的镜像可以运行在什么环境,aosp代表Android开源项目,arm表示系统是运行在arm架构的处理器上;

BUILDTYPE 指的是编译类型,有以下三种:

  • user:用来正式发布到市场的版本,权限受限,如没有 root 权限,不能 dedug,adb默认处于停用状态。
  • userdebug:在user版本的基础上开放了 root 权限和 debug 权限,adb默认处于启用状态。一般用于调试真机。
  • eng:开发工程师的版本,拥有最大的权限(root等),具有额外调试工具的开发配置。一般用于模拟器。
  • 如果你没有Nexus设备,只想编译完后运行在模拟器查看,那么BUILD可以选择aosp_x86,BUILDTYPE选择eng。
(4)开始编译

make -j8

j后面数字几就是多少线程,最多不超过你的cpu总线程,

编译成功会显示如下:

Creating filesystem with parameters:
Size: 2147483648
Block size: 4096
Blocks per group: 32768
Inodes per group: 8192
Inode size: 256
Journal blocks: 8192
Label: system
Blocks: 524288
Block groups: 16
Reserved block group size: 127
Created filesystem with 2216/131072 inodes and 199826/524288 blocks
[100% 7669/7669] Install system fs ima.../target/product/generic_x86/system.img
out/target/product/generic_x86/system.img+ maxsize=2192446080 blocksize=2112 total=2147483648 reserve=22146432
#### make completed successfully (01:24:41 (hh:mm:ss)) ####

会在源码跟目录out/target/product/angler目录下生成镜像文件:

  • system.img:系统镜像
  • ramdisk.img:根文件系统镜像
  • userdata.img:用户数据镜像
  • recovery.img:recovery镜像
  • boot.img:启动镜像
  • vendor.img:驱动镜像
最终会在 out/target/product/generic_x86/目录生成了三个重要的镜像文件: system.img、userdata.img、ramdisk.img。大概介绍着三个镜像文件:

  • system.img:系统镜像,里面包含了Android系统主要的目录和文件,通过init.c进行解析并mount挂载到/system目录下。
  • userdata.img:用户镜像,是Android系统中存放用户数据的,通过init.c进行解析并mount挂载到/data目录下。
  • ramdisk.img:根文件系统镜像,包含一些启动Android系统的重要文件,比如init.rc。
3.编译错误解决

(1)缺少libncurses.so.5

报错信息:

error while loading shared libraries: libncurses.so.5: cannot open shared object file: No such file or directory

解决方式:

sudo apt-get update
for 32-bit binaries :
sudo apt-get install libncurses5:i386
for 64-bit binaries :
sudo apt-get install libncurses5

(2)缺少M4

报错信息:

/bin/bash: m4: command not found

解决方式:

sudo apt-get install m4

(3)去除所有本地化设置

报错信息:

FAILED: out/host/linux-x86/obj/EXECUTABLES/checkpolicy_intermediates/policy_scan.c

解决方法:

export LC_ALL=C
LC_ALL=C 是为了去除所有本地化的设置,让命令能正确执行, 但是不可以修改~/.bashrc,会导致终端内中文显示为数字(应该是对应的编码)

(4)xmllint的问题

报错信息:

/bin/bash: xmllint: command not found

解决方案:

sudo apt-get install libxml2-utils

(5)编译内存不足

报错信息

Try increasing heap size with java option '-Xmx<size>'错误

解决方案:

export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4g"
jack-admin kill-server
jack-admin start-server

五.运行模拟器

启动模拟器

在编译完成之后,就可以通过以下命令运行Android虚拟机了,由于之前已经执行过source和lunch命令了,可以直接运行:

source build/envsetup.sh
lunch aosp_x86-eng
emulator

就会启动模拟器

六.AOSP源码编译某个单独的模块

上面的编译我们都是对整个Android系统进行编译的.如果我们要编译系统的Settings应用模块,这就属于源码单编某一个模块.

在AOSP根目录执行:

source build/envsetup.sh
lunch aosp_x86-eng

进入Settings的目录:

cd packages/apps/Settings

通过mm编译当前目录下的模块,不编译依赖模块。

mm

编译成功后会有提示生成文件的存放路径。除了Settings.odex文件,还会在out/target/product/generic_x86/system/priv-app/Settings目录下生成Settings.apk。

此外还有以下命令可以进行单编:

  • mmm:编译指定目录下的模块,不编译它所依赖的其它模块。
  • mma:编译当前目录下的模块及其依赖项。
  • mmma:编译指定路径下所有模块,并且包含依赖。
如果对系统模块的源码进行修改,查看生成的APK文件,有两种方式:

  • 通过adb push或者adb install 来安装APK。
  • 使用make snod命令,重新生成 system.img,运行模拟器查看


有关Framework学习之下载AOSP源码编译详解的更多相关文章

  1. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

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

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

  3. ruby - Sinatra set cache_control to static files in public folder编译错误 - 2

    我不知道为什么,但是当我设置这个设置时它无法编译设置:static_cache_control,[:public,:max_age=>300]这是我得到的syntaxerror,unexpectedtASSOC,expecting']'(SyntaxError)set:static_cache_control,[:public,:max_age=>300]^我只想将“过期”header设置为css、javaascript和图像文件。谢谢。 最佳答案 我猜您使用的是Ruby1.8.7。Sinatra文档中显示的语法似乎是在Ruby1.

  4. UE4 源码阅读:从引擎启动到Receive Begin Play - 2

    一、引擎主循环UE版本:4.27一、引擎主循环的位置:Launch.cpp:GuardedMain函数二、、GuardedMain函数执行逻辑:1、EnginePreInit:加载大多数模块int32ErrorLevel=EnginePreInit(CmdLine);PreInit模块加载顺序:模块加载过程:(1)注册模块中定义的UObject,同时为每个类构造一个类默认对象(CDO,记录类的默认状态,作为模板用于子类实例创建)(2)调用模块的StartUpModule方法2、FEngineLoop::Init()1、检查Engine的配置文件找出使用了哪一个GameEngine类(UGame

  5. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  6. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  7. ruby - 下载位置 Selenium-webdriver Cucumber Chrome - 2

    我将Cucumber与Ruby结合使用。通过Selenium-Webdriver在Chrome中运行测试时,我想将下载位置更改为测试文件夹而不是用户下载文件夹。我当前的chrome驱动程序是这样设置的:Capybara.default_driver=:seleniumCapybara.register_driver:seleniumdo|app|Capybara::Selenium::Driver.new(app,:browser=>:chrome,desired_capabilities:{'chromeOptions'=>{'args'=>%w{window-size=1920,1

  8. ruby-on-rails - HTTParty 的内存问题和下载大文件 - 2

    这会导致Ruby出现内存问题吗?我知道如果大小超过10KB,Open-URI会写入TempFile。但是HTTParty会在写入TempFile之前尝试将整个PDF保存到内存吗?src=Tempfile.new("file.pdf")src.binmodesrc.writeHTTParty.get("large_file.pdf").parsed_response 最佳答案 您可以使用Net::HTTP。参见thedocumentation(特别是标题为“流媒体响应机构”的部分)。这是文档中的示例:uri=URI('http://e

  9. .net - 是否有 Ruby .NET 编译器? - 2

    是否有适用于Ruby语言的.NETFramework编译器?我听说过DLR(动态语言运行时),这是否将使Ruby能够用于.NET开发? 最佳答案 IronRuby是Microsoft支持的项目,建立在动态语言运行时之上。 关于.net-是否有Ruby.NET编译器?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/199638/

  10. ruby - 强制浏览器下载文件而不是打开文件 - 2

    我要下载http://foobar.com/song.mp3作为song.mp3,而不是让Chrome在其native中打开它浏览器中的播放器。我怎样才能做到这一点? 最佳答案 您只需要确保发送这些header:Content-Disposition:attachment;filename=song.mp3;Content-Type:application/octet-streamContent-Transfer-Encoding:binarysend_file方法为您完成:get'/:file'do|file|file=File.

随机推荐