最近在研究Android源码定制相关的内容,刚好在B站上看高乐高大佬的课程,就跟着学习,也顺便整理一下资料写点博客,毕竟目前互联网上关于这方面的内容确实比较少,同时也感谢高乐高大佬的免费课程,干货满满。
接下来我们进入正题:
本文在Ubuntu 22.04 下进行,由于Google推荐使用Ubuntu进行Android系统编译与开发,因此默认阅读本文的同学电脑中已经安装了了Ubuntu系统,并拥有一定的Linux基础。
同时,本文所使用的的Ubuntu已经配置了清华的Ubuntu软件源,若一些软件下载比较慢的同学可以参考如下地址进行配置:
ubuntu | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror
由于众所周知的原因,我们很难从Google的官方代码库中下载aosp,因此本文使用中科大的镜像,北方的同学可以使用清华的
中科大aosp镜像使用帮助:AOSP 镜像使用帮助 — USTC Mirror Help 文档
清华aosp镜像使用帮助:AOSP | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror
建议编译以及开发aosp时在一个专用的文件夹里面进行,我是在用户根目录下创建了一个Android目录,但是这个目录在安装Android Studio的时候SDK也是下载在该目录的,路径如下:~/Android/Sdk,而aosp的目录是~/Android/aosp其实并不冲突,但是介意的同学可以另建一个目录进行
cd ~ # 进入到用户根目录
mkdir Android # 创建Android 文件夹
cd Android # 进入刚创建的文件夹
下载之前我们需要保证Ubuntu中安装了wget,没有下载的同学可以使用如下命令安装:
# sudo apt update # 没有进行软件源更新的可以调用
sudo apt install wget -y
接下来我们使用中科大的镜像下载aosp
# 这里我们添加 -c 参数表示断点续传
wget -c https://mirrors.ustc.edu.cn/aosp-monthly/aosp-latest.tar
执行完该命令之后根据你的网速可能需要等待40分钟或更久(主要看你的网络情况,这个文件有70G,如果你的网速比较快的话可能下得比较快,反之越慢)
当下载完了之后我们对文件做一下md5码校验,以防没有下载完全或文件损坏等
md5sum aosp-latest.tar
我们拿运行的结果来跟https://mirrors.ustc.edu.cn/aosp-monthly/aosp-latest.tar.md5的内容做比对,若md5一致则表示文件没有问题,就可以进行下一步操作了
当文件下载无误之后我们就可以把aosp-latest.tar文件解压了
tar xvf aosp-latest.tar
由于这个文件比较大,因此可能需要等待20~30分钟,当然这跟你的硬盘性能有关。当文件解压完成之后我们就可以在该目录下看到有一个aosp文件夹了,如果我们这个时候进去会发现这个文件夹只有一个.repo文件夹,并没有任何代码,这是因为我们下载的仅仅是一个相当于一些配置文件的东西,我们还要进行代码同步,.repo文件夹的作用就与Git项目的.get文件夹类似
在等待的时候可以再开一个终端来参照下面的教程安装与配置一些需要的环境
在拉取Android源代码之前我们需要确认机器中安装了需要的环境
首先我们安装与配置git,已经安装并配置好的同学可以跳过这步
sudo apt install git -y
当安装好了之后我们再调用如下命令配置Git
git config --global user.email xxx@qq.com
git config --global user.name "xxxxx"
接下来我们安装repo
mkdir ~/.repo # 在用户根目录创建一个.repo的文件夹,用于下载repo
# 下载repo 到用户根目录下的.repo文件夹
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/.repo/repo
# 给repo文件授予权限
chmod a+x ~/.repo/repo
# 将.repo 目录添加到环境变量中
echo "PATH=~/.repo:\$PATH" >> ~/.bashrc
# 使.bashrc 生效
source ~/.bashrc
安装了repo之后我们还要给repo配置国内源,否则进行代码同步的时候可能会出现异常
export REPO_URL='https://gerrit-googlesource.proxy.ustclug.org/git-repo'
由于repo是由一系列python脚本组成,因此我们还需要安装python环境,repo其实用的是python2 但是为了避免出现一些状况我们就把python3 也安装了
#Ubuntu中默认安装了python3,可以调用一下python3命令,如果有了的话可以跳过这步
sudo apt install python3 -y
sudo apt install python2 -y
如果安装好了之后我们调用一下 python2命令可以发现已经开启了python2终端,但是我们调用python命令的话还是提示没有找到该命令,因此我们需要添加一个软链接
sudo ln -s /usr/bin/python2 /usr/bin/python
注意如果执行python命令的时候提示的python版本是python3 也要执行一下这个命令才可以,但是在执行之前需要先执行如下命令删除掉之前设置的软链接
sudo rm -rf /usr/bin/python
如果这里成功了我们就可以运行python命令了
网上的一些教程是要我们安装openjdk 8 但是我在编译的时候提示了jvm版本过低的错,因此我们直接安装openjdk11 即可
sudo apt update # 更新Ubuntu软件源
sudo apt install openjdk-11-jdk -y # 安装openjdk 11
安装好了上面的软件那之后我们要再安装一些软件包来支持源码编译
sudo apt-get install -y git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig libncurses5
当我们配置好了所需的环境之后我们就可以同步Android源代码了,这里我同步的是android-13.0.0_r24
cd aosp # 进入源码目录
指定源码版本,建议指定前先查看aosp镜像有没有该版本
repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-13.0.0_r24
如果我们看到repo has been initialized in /home/zhen/Android/aosp这个提示表示已经初始化完成,此时就可以进行下一步了
同步Android 源码
repo sync
由于Android源码比较庞大,所以这个步骤需要等待20分钟左右
当Android源码同步完了之后,我们就可以开始编译Android源码了
首先我们要初始化编译环境
source build/envsetup.sh
执行这个命令没有任何报错即可进行下一步,值得注意的是,这个命令在每次我们重新打开一个终端进行编译等操作的时候都要执行一遍
第一次编译的时候我们需要将之前编译的内容清除掉(按理说这步不用也可以,但是为了防止后面出现什么乱七八糟的问题所以就执行一下)
make clean
接下来我们要先选择一个要编译的版本之后就可以进行编译了
这个部分我们可以执行lunch命令之后再选择你想要编译的版本
You're building on Linux
Lunch menu .. Here are the common combinations:
1. aosp_arm-eng
2. aosp_arm64-eng
3. aosp_barbet-userdebug
4. aosp_bluejay-userdebug
5. aosp_bluejay_car-userdebug
6. aosp_bramble-userdebug
7. aosp_bramble_car-userdebug
8. aosp_car_arm-userdebug
9. aosp_car_arm64-userdebug
10. aosp_car_x86-userdebug
...
65. rb5-userdebug
66. sdk_car_arm-userdebug
67. sdk_car_arm64-userdebug
68. sdk_car_portrait_x86_64-userdebug
69. sdk_car_x86-userdebug
70. sdk_car_x86_64-userdebug
71. sdk_pc_x86_64-userdebug
72. silvermont-eng
73. uml-userdebug
74. yukawa-userdebug
75. yukawa_sei510-userdebug
Which would you like? [aosp_arm-eng]
Pick from common choices above (e.g. 13) or specify your own (e.g. aosp_barbet-eng):
也可以在lunch命令后添加参数,添加参数有两种方式,我使用的是第二种方式
- 使用序号编译
lunch 1 # 与 lunch aosp_arm-eng 等价
- 使用版本名称编译使用序号编译
lunch sdk_phone_x86_64-userdebug
phone-> 编译的是手机的固件
x86_64-> 编译的是x86架构 64位的系统
userdebug-> 这个是指编译的固件类型,可选参数有user、userdebug、eng,其中user是最终打包给用户的版本,用过MIUI的朋友可以把MIUI的正式版看做是这个版本;userdebug是给开发人员的版本,可以root但默认不带root,这个版本对应的就是MIUI的开发板、内测版本;eng是给工程师用的版本,开放所有权限,这个版本一般是工程师在做开发的时候使用的。需要注意的是,从Android12 开始,如果需要编译虚拟机固件需要编译带sdk前缀的版本
选择完了编译版本之后我们就可以开始进行编译了
make -j8
这个j6代表使用6的线程进行编译,这个参数看你的CPU参数与内存,即最大线程数不能超过CPU支持的最大线程数,但是如果你的内存比较小就得选择较小的线程数,我们可以在编译报了137错误的时候适当选择小一点的线程数或者增加交换空间大小,但是建议交换空间大小不超过内存的一半,比如你的内存是16G的就可以设置为8G,如果你的内存是32G的就可以设置为16G
交换空间的设置方法可以参考这篇博客:ubuntu调整交换空间 - 简书
编译这个部分的时间是最久的,可能得等上4个小时以上,当然如果你的CPU性能比较好时间就会少一点
当我们编译完了之后就可以执行如下命令来启动虚拟机,以验证是否编译成功
emulator
这个错误表示repo有更新的版本,因此我们要将~/.repo目录下的repo文件替换为.repo/repo 下的repo文件
# 在aosp目录下执行
cp .repo/repo/repo ~/.repo/repo
然后再执行刚刚报这个错误的命令就看可以了
我有一台旧主机,i5-6500 - 16G内存的,我在上面编译就会出现这个问题,然后换到新主机上就没事,暂时不知道是内存小还是什么原因
这里只是部分参考的文献,有一些文章因为我当时急于解决问题所有忘了记录了,后面就找不到了,因此就不贴出来了
高乐高521的个人空间-Android13 逆向 ROM定制ART定制入门系列-哔哩哔哩视频
jdk版本对应的java版本数字-青岛软件培训-Java培训-Python培训学校-万码学堂
AOSP 镜像使用帮助 — USTC Mirror Help 文档
我正在编写一个小脚本来定位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
当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub
我不知道为什么,但是当我设置这个设置时它无法编译设置: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.
一、引擎主循环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
?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------
运行bundleinstall后出现此错误:Gem::Package::FormatError:nometadatafoundin/Users/jeanosorio/.rvm/gems/ruby-1.9.3-p286/cache/libv8-3.11.8.13-x86_64-darwin-12.gemAnerroroccurredwhileinstallinglibv8(3.11.8.13),andBundlercannotcontinue.Makesurethat`geminstalllibv8-v'3.11.8.13'`succeedsbeforebundling.我试试gemin
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
我将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
这会导致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
我已经通过提供MagickWand.h的路径尝试了一切,我安装了命令工具。谁能帮帮我?$geminstallrmagick-v2.13.1Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingrmagick:ERROR:Failedtobuildgemnativeextension./Users/ghazanfarali/.rvm/rubies/ruby-1.8.7-p357/bin/rubyextconf.rbcheckingforRubyversion>=1.8.5...yescheckingfor/