Ubuntu18.04下编译android7.0过程详解以及常见问题

经过几天的挣扎终于编译成功,为了记录下这过程中碰到的问题以免以后再次碰到,同时也是对整个过程的一个梳理,故写下这篇文章。

 


 

一 搭建编译环境 

在linux Ubuntu系统下只需要在终端输入以下命令

sudo apt-get install openjdk-8-jdk

sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib
sudo apt-get install -y flex bison gperf build-essential libncurses5-dev:i386
sudo apt-get install tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386
sudo apt-get install libsdl1.2-dev curl libc6-dev-i386 lib32ncurses5-dev
sudo apt-get install lib32z-dev ccache

 

 然后是源码的下载,由于我是用的是拷贝的源码,这里不再细说,可以参考链接:https://www.jianshu.com/p/88d84dd7abd4

这里在下面的编译就有个坑,下面会详细说明

二 编译源码

编译说明:

1.$ source build/envsetup.sh 
2.$ lunch 选 XXX-userdebug
3.$ make -j8
#-j后面的参数一般是你机器的核心数的两倍


make clean #清空整个工程
make -j8  #全部编译
make -j8 bootimage #编译内核,改动kernel文件夹下的东西
make -j8 aboot #编译aboot,改动bootable文件夹下的东西
make systemimage  #编译system.img
make userdataimage-nodeps 快速编译userdata.img

make recovery recoveryimage 编译recovery

在编译之前你应该了解make 如何输出错误日志,这对调试很重要,例子如下,export LC_ALL=C是为了去除所有本地化的设置,让命令能正确执行,注意当这个窗口关闭这个export不再生效。2>&1是让错误信息也输出到控制台,最后tee 是让控制台输出的同时也输出到bulid.log中,详细请参考https://www.cnblogs.com/ifzy/p/3854560.html,这让你可以清楚的知道你的错误出现在什么地方

export LC_ALL=C && make -j8 2>&1 | tee build.log

 

 

常见问题

我所碰见的第一个问题是权限问题,为了避免麻烦,请使用管理员账号或者使用root用户,如果条件不允许请将源码目录的权限设置下

然后便是一个常见的jack server 问题,有些问题在这个笔记:https://note.youdao.com/ynoteshare1/index.html?id=66388c1dbdc6a1e679d093576a7fff3a&type=note都有解决办法,还有多用户同时编译无法启动jack server的问题,在这个这个网址https://blog.csdn.net/lizekun2010/article/details/52535591也有说明不再赘述,下面讲的是还没有完善解决方法的通用方案

=适用于你碰到下列这个问题

ninja: build stopped: subcommand failed.
build/core/ninja.mk:148: recipe for target 'ninja_wrapper' failed 

  1. 切换成root用户或者确保你拥有足够的权限
  2. 确定jack server正确运行,具体在上面的笔记有讲
  3. 在运行make命令前增加export LC_ALL=C,这是为了去除所有本地化的设置,让命令能正确执行。
  4. 到这里还不行的话请下载openssl1.0源码,删除/usr/bin的openssl文件(或者重命名备份下),然后按照这个博客https://www.cnblogs.com/testlife007/p/6543711.html安装openssl1.0,因为1.1改动过多可能对android7.0会有影响
  5. 最后每次都安装编译说明来source一下

    最后还有一点就是你可能会碰到无法fork,内存不足的问题,请增加内存或者增加进程最大数量

free查看内存
查看最大进程数 sysctl kernel.pid_max
ps -eLf | wc -l查看进程数
确认是进程数满了

修改最大进程数后系统恢复
echo 1000000 > /proc/sys/kernel/pid_max

永久生效
echo "kernel.pid_max=1000000 " >> /etc/sysctl.conf
sysctl -p

也有可能是你make -j后面的参数过大,请重新选择适合的参数 

2019/8/5

后面按照罗老师的https://blog.csdn.net/Luoshengyang/article/details/6567257博客弄了一下,发现打包后停在安卓页面开不了机,logcat的消息是一些内核服务起不来,估计是改systemserver.java改的,后来挣扎许久最终用git checkout . 撤销了修改再重新编译打包,发现还是启动不了,没办法问了下前辈,用了这个命令

make installclean
      这条命令清除out目录下对应板文件夹中的内容,也就是相当于make clean,通常如果改变了一些数据文件(如去掉)、最好执行以下make installclean,否则残留在out目录下的还会被打包进去。

 

然后重新编译打包就好了,记录下来免得再走死胡同。


写的比较粗糙,有空更新详细说明,最后推荐一本驱动有关的书籍和一些学习链接

https://lwn.net/Kernel/LDD3/

https://www.cnblogs.com/skynet/archive/2010/04/16/1713740.html

https://blog.csdn.net/Luoshengyang/article/details/6567257

https://www.runoob.com/w3cnote/android-tutorial-contents.html

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值