Ubentu编译Android源码(AOSP)
前⾔:
⼀直想要编译⼀下Android 源码,之前去google 看,下载要下载repo。
当时很懵逼,repo 是个什么?(repo 是⼀个python 脚本,因为Android 源码git 仓库太多,帮助管理git 仓库的,你不需要知道⾥⾯什么实现。会⽤就⾏。)
然后往下看,看到⽹上说,编译Android AOSP 只能⽤Ubuntu,当时⾃⼰的⼼也哇哇凉啊。
⾃⼰只有⼀个⼯作的电脑,⾃⼰的电脑配置太低。看⽹上说,还要200G 的空间。(有⼀个拦路虎)
之前⾃⼰给⾃⼰的windos 安装过双系统,但是好像⼀直启动不了。现在想想,应该是因为当时没有设置引导盘的顺序吧。现在我⽤⼀个usb 连接了⼀个1T的硬盘,⾥⾯安装了Ubentu . 如果我插了这个硬盘,启动的就是ubuntu, 如果没有,就是⼯作的windows 。⼯作学习两不误。
不知道什么动⼒让我突破了所有上⾯的拦路虎,依然决然去编译源码。⾯试的时候,别⼈提到过,我说我想,但是没有做到,别⼈说,那么你为了编译源码,你第⼀步应该怎么
做? 我说⾸先下载源码,安装Ubuntu。终于⼀步⼀步⾛过来了。感谢⾯试的那个⼈给我指点,让我思考。
⼀路⾛来,少些艰⾟。下载代码⽤了两天,还是下载的清华镜像的,公司的⽹太慢了,43G 下载了两天,然后正好周末,编译成功花费了两天周末时间,但是还是很值得的。⾥
⾯有很多坑,给⼤家分享下。
下载AOSP:
google 的AOSP 的话,因为FQ和数据量太⼤,考虑国内的镜像。
这个⽹址是清华⼤学的镜像站。
由于⾸次同步需要下载约 30GB 数据,过程中任何⽹络故障都可能造成同步失败,我们强烈建议您使⽤初始化包进⾏初始化。也就是我们直接下载⼀个git仓库。这样的话,不会
说,⽂件太⼤,git clone 的时候⽼是中断。
下载下载完成后记得根据 的内容校验⼀下。
当时我是⽤Windows 迅雷下载的⽂件。
当然如果你直接是Ubuntu 系统,也可以⽤下⾯的⽅法:
wget -c mirrors.tuna.tsinghua.edu/aosp-monthly/aosp-latest.tar # 下载初始化包
tar xf aosp-latest.tar
cd AOSP # 解压得到的 AOSP ⼯程⽬录
# 这时 ls 的话什么也看不到,因为只有⼀个隐藏的 .repo ⽬录
repo sync # 正常同步⼀遍即可得到完整⽬录
# 或 repo sync -l 仅checkout代码
安装Ubentu
⼀定要安装Ubentu ,这个可以让你少⾛⼀些坑。
之前我⽤迅雷下载了清华⼤学的AOSP,是tar ⽂件,我⽤Windows 解压之后,当时的想法很简单,就是只想简单的看下源码先。当时解压之后,执⾏python repo sync,报了乱七⼋
糟的错。我还调试了repo 的源码。花了不少时间。
后来发现config ⽂件,解压之后和压缩包⾥⾯的不⼀样,我就知道了,可能tar ⽂件,Windows 解压之后,会有问题。
果断去安装Ubuntu。
安装之后,把下载的⽂件copy 到 Ubentu 的/usr/lib/下⾯。(当然你可以随便copy 到任何地⽅)
由于太⼤,该过程⼤约⼗多分钟。
copy 完成之后,解压缩:
tar -xvf ***.tar -C /usr/lib/AOSP
这也是⼀个漫长的过程,⼤概半个多⼩时。毕竟40G的代码。
安装Python 2.7,git(如果有,请忽略)
因为repo 是python 脚本⼯具,你的Ubuntu需要Python 运⾏环境。Python 3.5 可能会有问题,最好安装python 2.7
sudo apt-install python
sudo add-apt-repository ppa:git-core/ppa //添加源
sudo apt-get update //更新
sudo apt-get install git //⾃动安装git
git --version //确认git版本
//第⼀次使⽤前
git config --global user.name "your name" //设置⽤户名,注意git config命令的--global参数,⽤了这个参数,表⽰你这台机器上所有的Git仓库都会使⽤这个配置,当然也可以对某个仓库指定不同的⽤户名和Email地址。git config --ail "your email" //设置电⼦邮箱
git config user.name //查看⽤户名
git ail //查看电⼦邮箱
初始化仓库:
解压缩完成之后,因为.repo 是隐藏⽂件夹,所以,需要ls -a 才能看到:
执⾏以下命令,同步以下代码。
cd .repo
python repo sync
中间可能执⾏失败,注意,你的⽹络⼀定要ok。可以设置代理,但是要保证有代理的情况下,可以访问清华镜像的⽹站。
但是最好不要设置代理。我当时就浪费了很多时间。
如果执⾏python repo sync失败了,那么在执⾏⼀次。多执⾏⼏次。同时排除⽹络原因。
成功之后,切换到AOSP ⽬录:
也就是.repo ⽗⽬录。
执⾏:
source build/envsetup.sh
注意:source 是⼀个系统命令。
执⾏之后,可能没有任何的提⽰。那么就是成功了。
当然有的电脑可能会有其他提⽰。都⼀样。
如果出现source: not found错误
运⾏ls -l /bin/sh后显⽰/bin/sh -> dash
这说明是⽤dash来进⾏解析的。
解决⽅案:
命令⾏执⾏:dpkg-reconfigure dash(需要root权限)
在界⾯中选择no
再运⾏ls -l /bin/sh 后显⽰/bin/sh -> bash
执⾏source build/envsetup.sh不报错,即OK。
补充⼀点:
编译环境初始化(即执⾏source build/envsetup.sh)之后,我们可以得到⼀些有⽤的指令,除了上边⽤到的lunch,还有以下:
- croot: Changes directory to the top of the tree.
- m: Makes from the top of the tree.
- mm: Builds all of the modules in the current directory.
- mmm: Builds all of the modules in the supplied directories.
- cgrep: Greps on all local C/C++ files.
- jgrep: Greps on all local Java files.
- resgrep: Greps on all local res/*.xml files.
- godir: Go to the directory containing a file.
其中mmm指令就是⽤来编译指定⽬录.通常来说,每个⽬录只包含⼀个模块.⽐如这⾥我们要编译Setting 模块,执⾏指令:
mmm packages/apps/Settings/
接着执⾏lunch
lunch
选择编译的⽬标版本:
如果你的电脑是64位的话,选择27,因为x86版本的虚拟机运⾏⽐较快。不要编译arm 版本的了,我当时编译过,但是运⾏起来太慢,⽽且运⾏不起来。浪费了⼀晚上。
编译之前:
编译之前⼀定要保证⼀些库安装了,不然编译了⼏个⼩时之后报错,某个库没有安装,岂不是很难受?
//防⽌出现/bin/bash:m4:command not found
sudo apt-get install m4
///防⽌出现bin/bash: xmllint: command not found
sudo apt-get install libxml2-utils
编译
make -j8
如果遇到了下⾯的错误:
/usr/lib/aosp_dir/aosp/frameworks/base/media/java/android/media/MediaDrm.java:1207: warning: Returning unexpected constant SECURITY_LEVEL_MAX; is @SecurityLevel missing this constant? Expected one of SECURITY_LEVEL_UNKNOWN, SECURITY_LEVEL_SW_SECURE_CRYPTO,
SECURITY_LEVEL_SW_SECURE_DECODE, SECURITY_LEVEL_HW_SECURE_CRYPTO, SECURITY_LEVEL_HW_SECURE_DECODE,
SECURITY_LEVEL_HW_SECURE_ALL [ReturningUnexpectedConstant]
15:58:20 ninja failed with: exit status 1
在执⾏⼀次make -j8
如果遇到下⾯的错误:
如果你提⽰了no such file /…/.lunchrc 出现只能说明之前你没有执⾏source build/envsetup.sh:
最终编译成功:
Unsparsing /media/caoxinyu/TomasYu/out/target/product/generic_x86_64/system.img
[100% 8408/8408] Creating /media/caoxinyu/TomasYu/out/target/product/generic_x86_proto
#### build completed successfully (37:36 (mm:ss)) ####
编译success 之后:
启动模拟器
emulator
如果遇到⼀下错误:
emulator: ERROR: x86_64 emulation currently requires hardware acceleration!
Please ensure KVM is properly installed and usable.
CPU acceleration status: KVM is not installed on this machine (/dev/kvm is missing).
检查你的电脑⽀不⽀持虚拟机
egrep -c '(vmx|svm)' /proc/cpuinfo
如果显⽰0表⽰不⽀持,如果是1,以以上,表⽰⽀持。
然后去boss ⾥⾯启⽤虚拟机。
Open Virtual machine setting.
Go to the processor.
Check the virtualize Intel VT-x/EPT or AMD-RVI option.
Click ok and run the Virtual machine, it should work fine with you.
之后执⾏下⾯命令:
sudo apt-get install qemu-kvm libvirt-bin ubuntu-vm-builder bridge-utils
sudo adduser `id -un` libvirtd
ubuntu怎么安装pythonsudo adduser `id -un` kv
如果遇到这个错误:
emulator: ERROR: x86 emulation currently requires hardware acceleration!
Please ensure KVM is properly installed and usable.
CPU acceleration status: This user doesn't have permissions to use KVM (/dev/kvm).
或者提⽰
emulator: ERROR: x86 emulation currently requires hardware acceleration!
Please ensure KVM is properly installed and usable.
CPU acceleration status: Could not open /dev/kvm :Permission denied
使⽤ root 权限执⾏以下三条命令后注销当前⽤户或者直接重启电脑即可
(本例⼦中当前登录图形界⾯的⽤户是 sman)
groupadd kvm
usermod -G kvm -a sman
echo 'KERNEL=="kvm",GROUP="kvm",MODE="0660"' >> /etc/udev/rules.d/androidUseKVM.rules
这三条命令的作⽤分别是:
#创建⽤户组kvm
#将⽤户sman添加到kvm⽤户组
#开机时⾃动赋予⽤户组kvm拥有0660的权限
如果第三条执⾏错误,没有关系。
继续执⾏emulator
如果报错:
grant current user access to /dev/kvm 以及/dev/kvm devices: permission denies
解决⽅法:执⾏ sudo chown username -R /dev/kvm 注意username是你⽤的⽤户名
继续执⾏emulator
总结:
1.编译源码其实没有那么难,只是你要付出时间去做这件事情。
2.遇到问题,百度、google解决问题。毕竟代码都是别⼈上传的没有问题的,你只是编译。
可能遇到的错误:
OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x0000000090e00000, 283115520, 0) failed; error='Not enough space' (errno=12) #
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 283115520 bytes for committing reserved memory.
# An error report file with more information is saved as:
# /usr/lib/aosp_dir/aosp/hs_err_pid425.log
[ 98% 111020/112583] //frameworks/base/services:services d8 [common]
原因:内存不够,可能是你开的线程太多了。⽐如make -j20 这种。还有⼀种原因是可能没有设置交换区。
设置交换区参考:
blog.csdn/qq_35976351/article/details/79363760
感谢:
AOSP 编译
安装搜狗输⼊法
安装git
ubuntu系统shell 中source: not found错误
/bin/bash: m4: command not found
CPU acceleration status: KVM is not installed on this machine (/dev/kvm is missing).
AOSP 编译
CPU acceleration status: This user doesn’t have permissions to use KVM (/dev/kvm).
grant current user access to /dev/kvm 以及/dev/kvm devices: permission denies
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论