本次趟地雷来源: https://blog.csdn.net/w359593616/article/details/50345109 。吐槽:这位兄台的排版实在是难以令我接受,只能将就着看看。我将这位兄台的文字重新排版一下,并且加入我在编译和调试的过程中 趟过的雷尽数标出

前言

我所使用的编译系统为Ubuntu 14.04.2。考虑到AllWinner A20的rom也是上古时代的产物了,用18.04可能需要重新配置很多东西,为了避免一些不必要的麻烦,故选择了这个版本的系统。

在系统位数选择上,推荐使用64位系统。当然也可以使用32位系统,不过会有一些限制,比如说 12.04 的32位系统默认最大支持8个cpu核心(8c16t只能利用8个核心),内存大小也有限制,不能进行打包等等。之前我就是因为盲信rom是32位的,就应该用32位的ubuntu进行编译,结果到后面编译成功后准备打包的时候发现打包程序居然是个64位的程序。。。

搭建编译环境

安装必要的依赖

下面是基础的依赖:

root@ubuntu: ~# sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev  gcc-multilib  g++-multilib  libc6-dev-i386  lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip
root@ubuntu: ~# sudo apt-get install bison texinfo u-boot-tools flex libswitch-perl

链接一个so文件,不链接好像也没啥问题:(32位系统可能不需要这个操作)

sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so

安装JDK 1.6

不要问为什么要jdk1.6,没有为什么,就是需要jdk1.6

这个jdk1.6也是相当古老了,在Oracle网站上找起来很费劲,不过在另外一篇博客的文章里找到了下载链接:http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-javase6-419409.html#jdk-6u41-oth-JPR

下载下来的文件是个bin文件,这里以 jdk1.6.0_45 为例,添加执行权限后直接在终端中执行,jdk会被解压到当前目录中,接下来就是把它放到一个找得到的位置,比如/usr/lib/jvm/jdk1.6.0_45,修改权限为755,所有者和所有人群组为root

然后修改/etc/profile,追加以下内容到文件末尾。注意:只要改profile即可,不要去修改/etc/environment,因为这个 environment 万一修改出错会导致开机卡登录界面,tty中找不到某些命令等问题(本质上是PATH路径损坏),修复起来会很麻烦

export JAVA_HOME=/usr/lib/jvm/jdk1.6.0_45
export JRE_HOME=$JAVA_HOME/jre
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/:$JRE_HOME/lib:$CLASEEPATH

请不要照抄那位兄台的export,要抄也要抄我提供的。因为他的排版格式问题,导致export后面的空格存在异常,不能被shell识别

接下来配置java,全程root权限执行:

#!/bin/bash
JAVA_PATH=/usr/lib/jvm/jdk1.6.0_45
update-alternatives --install /usr/bin/java java $JAVA_PATH/bin/java 300
update-alternatives --install /usr/bin/javac javac $JAVA_PATH/bin/javac 300
update-alternatives --install /usr/bin/jar jar $JAVA_PATH/bin/jar 300
update-alternatives --install /usr/bin/javah javah $JAVA_PATH/bin/javah 300
update-alternatives --install /usr/bin/javap javap $JAVA_PATH/bin/javap 300
update-alternatives --install /usr/bin/javadoc javadoc $JAVA_PATH/bin/javadoc 300
update-alternatives --config java
update-alternatives --config javac
ln -s $JAVA_PATH/bin/jar  /bin/jar
ln -s $JAVA_PATH/bin/java  /bin/java
ln -s $JAVA_PATH/bin/javac  /bin/javac
ln -s $JAVA_PATH/bin/javah  /bin/javah
ln -s $JAVA_PATH/bin/javadoc  /bin/javadoc

配置Swap分区

为了保证能成功编译,需要调整swap分区的大小。

以M为单位查看swap的大小

free -m

在当前用户home目录创建一个2GB大小的swap文件

dd if=/dev/zero of=~/swapfile bs=1024 count=2000000

建立交换分区

mkswap ~/swapfile

转化并激活swap分区文件

swapon swapfile

取消分区

swapoff ~/swapfile

替换gcc和g++

更新:咨询了厂商,得到的回复是14.04中不需要替换!替换之后反而会出现各种编译不过去的问题,所以这个到底要不要替换,看个人,可以多尝试尝试,记得做好备份,万一不行可以回档重来

gcc和g++版本问题,需要降为4.4 (不知道是否必须要这样做,反正先这样做着),下载完成之后替换系统原有的链接至4.4的版本

apt-get install gcc-4.4
apt-get install g++-4.4
cd /usr/bin
mv gcc gcc.bak
ln -s gcc-4.4 gcc
mv g++ g++.bak
ln -s g++-4.4 g++
# 查看两者版本
gcc -v
g++ -v

最后还需要安装:

apt-get install g++-4.4-multilib
apt-get install libc6-dev-i386

下载源码

我这边源码是合作厂商基于AllWinner A20的源码定制过后的版本,不过和网络上流传的版本基本一致,源码中分为android文件夹和lichee文件夹两个目录。

开始编译

编译lichee

这里有个小技巧,在改动必要文件之后,开始编译之前,利用git命令创建个本地仓库,将所有文件添加进版本控制。万一编译出了什么问题,可以通过git将文件夹中的内容完全重置回最初的状态,这样就省的去clean的工作了

接下来开始编译:

cd lichee
./build.sh -p sun7i_android

中途过程中可能会跳出若干选项,比如选择wifi驱动,3g/4g模块驱动等,按照实际需求进行选择即可

若看到以下输出,即表示lichee编译成功:

INFO: build u-boot OK.
INFO: build rootfs ...
INFO: skip make rootfs for android
INFO: build rootfs OK.
INFO: build lichee OK.

编译android

进入源码的另一个目录android,然后执行以下命令:

cd android
source build/envsetup.sh

注意,不要直接执行 ./build/envsetup.sh,据说会有问题

lunch
admin@ubuntu:android$ lunch

You're building on Linux

Lunch menu... pick a combo:
     1. full-eng
     2. full_x86-eng
     3. vbox_x86-eng
     4. full_mips-eng
     5. full_grouper-userdebug
     6. full_tilapia-userdebug
     7. mini_armv7a_neon-userdebug
     8. mini_armv7a-userdebug
     9. mini_mips-userdebug
     10. mini_x86-userdebug
     11. full_maguro-userdebug
     12. full_manta-userdebug
     13. full_toroplus-userdebug
     14. full_toro-userdebug
     15. sugar_evb-eng
     16. sugar_ref001-eng
     17. sugar_standard-eng
     18. wing_evb_v10-eng
     19. full_panda-userdebug

Which would you like? [full-eng]

根据自己开发平台选择方案,接下来的操作是 “拷贝内核和模块到Android中”,据传编译内核 一般需要接近1个小时???完成后将会在out/target/product/sun7i-xxx/目录下生成boot.img、recovery.img、system.img三个文件镜像。Boot.img包括kernel和ramdisk,system.img为系统文件

extract-bsp
make clean
make -j8

如果编译环境没有什么大的问题的话,应该就能编译成功。如果出现make提示源码中有什么东西找不到,请先确认源码是否完整,其次就是编译环境问题了。如果提示少了什么依赖,就按照提示安装即可

打包镜像

用pack命令打包出编译好的镜像文件

pack

完成后会提示你,出来的镜像文件是保存在哪里的

编译android过程中出现的各种问题

make: *** No rule to make target `out/target/product/sugar-ref001/obj/STATIC_LIBRARIES/libv8_intermediates/export_includes', needed by `out/target/product/sugar-ref001/obj/SHARED_LIBRARIES/libwebcore_intermediates/import_includes'.  Stop.

这就是降级了gcc和g++后使用多线程编译可能会出现的奇葩问题。这种情况下,使用单线程make不会有这个错误。如果不嫌编译慢,可以慢慢等。


Can't Locate Switch.pm in @INC (you may need to install the Switch module) (@INC contains: /etc/perl /usr/local/lib/perl/5.18.2 /usr / Local/share/perl/5.18.2 /usr/lib/perl5 /usr /share/perl5 /usr/Lib/perl/5.18 /usr /share/perl/5.18 /usr/Local/lib/site_ perl .) at external/webkit/Source/WebCore/make -hash- tools.pl line 23.
BEGIN failed-- compilation aborted at external/webki t/Source /WebCore /make-hash- tools.pl line 23.
target Generated: libwebcore <= external/webkit/ Sour ce/WebCore / dom/make_ names. pl
make: *** [out/target/product/sugar-ref001/obj/STATIC LIBRARIES/libwebcore intermediates/Source/WebCore/html/DocTypestr ings.cpp] Error 2

缺少了 libswitch-perl ,安装上即可解决问题


external/dbus/bus/activation.c:26:20: fatal error: config.h: No such file or directory
compilation terminated.

这个还是编译环境问题,具体是什么情况我也没搞清楚