固件构建指南——环境搭建与编译步骤
目录
编译环境搭建
安装Ubuntu操作系统
建议装在本机(编译速度快),没有条件的可以装在虚拟机中。
推荐版本:16.04LTS Desktop AMD64(其他版本也可(必须为64位),但可能会存在软件包源依赖问题导致配置步骤和预期效果与本文不符,有能力的用户可以尝试!)
安装所需组件
在终端窗口内输入下列命令:
sudo apt-get install bison build-essential ccache curl flex gcc-multilib g++-multilib git gnupg gperf lib32ncurses5-dev
sudo apt-get install lib32z1-dev libc6-dev-i386 libgl1-mesa-dev libreadline6-dev:i386 libx11-dev:i386 libxml2-utils m4
sudo apt-get install python-markdown tofrodos unzip x11proto-core-dev xsltproc zip zlib1g-dev:i386 bc u-boot-tools
sudo apt-get install gawk #A133编译必需
安装JDK
安装Oracle JDK 1.6(针对Android 4.4)
1. 下载jdk-6u45-linux-x64.bin(可在资料光盘/环境搭建中下载)
2. 在Ubuntu系统中创建JDK安装目录(若已存在则可跳过):
sudo mkdir /usr/lib/jvm
3. 拷贝jdk-6u45-linux-x64.bin到此目录:
sudo cp jdk-6u45-linux-x64.bin /usr/lib/jvm
4. 执行安装:
cd /usr/lib/jvm
sudo chmod 777 jdk-6u45-linux-x64.bin
sudo ./jdk-6u45-linux-x64.bin
安装完成后会在当前目录下生成jdk1.6.0_45文件夹。
5. 配置环境变量
编辑/etc/profile文件:
sudo gedit /etc/profile
在文件结尾添加:
export JAVA_HOME=/usr/lib/jvm/jdk1.6.0_45
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
保存后重启系统生效。
安装OpenJDK 7(针对Android 5.1/6.0)
由于目前16.04LTS软件源已移除OpenJDK 7,无法通过apt-get安装,这里提供一个较老版本的离线安装包。
1. 下载openjdk-7u75-b13-linux-x64-18_dec_2014.tar.gz(可在资料光盘/环境搭建中下载)
2. 在Ubuntu系统中创建JDK安装目录(若已存在则可跳过):
sudo mkdir /usr/lib/jvm
3. 拷贝openjdk-7u75-b13-linux-x64-18_dec_2014.tar.gz到此目录:
sudo cp openjdk-7u75-b13-linux-x64-18_dec_2014.tar.gz /usr/lib/jvm
4. 解压并重命名:
cd /usr/lib/jvm
sudo tar xvf openjdk-7u75-b13-linux-x64-18_dec_2014.tar.gz -C .
sudo mv java-se-7u75-ri java-7-openjdk-amd64
目前不需要配置环境变量,因为Android BSP的Makefile可以自动查找java-7-openjdk-amd64这个路径并调用它。
安装OpenJDK 8(针对Android 7.1/10/13)
在终端窗口中输入下列命令:
sudo apt-get update
sudo apt-get install openjdk-8-jdk
注意:目前发现最新的OpenJDK 8(运行命令/usr/lib/jvm/java-8-openjdk-amd64/bin/java -version查看版本为8u292-b10-0ubuntu)与Android 7.1(可能10/11也存在此问题)BSP中的Jack编译工具存在兼容性问题,导致Jack Server不能正常启动,无法完成编译(禁用Jack后仍无法正常编译)。建议退回到老版本(1.8.0_03-Ubuntu或其他较老的版本),并关闭系统自动更新防止又自己升级到最新。方法:
1. 卸载原OpenJDK-8:sudo apt-get purge openjdk-8-jdk
2. 检查当前系统软件源有哪些OpenJDK-8可用版本:apt-cache madison openjdk-8-jdk
3. 安装老版本的OpenJDK-8:sudo apt-get install openjdk-8-jdk=版本名
注:可能需要先安装该版本的依赖库后才能安装成功,具体请参考apt的提示进行操作。另参考下面的资料:
Ubuntu通过apt-get安装指定版本和查询指定软件有多少个版本
降级make版本
1. 下载make-3.81.tar.gz(可在资料光盘/环境搭建中下载)
2. 解压、编译并安装:
tar xvf make-3.81.tar.gz -C .
cd make-3.81
./configure
make
sudo make install
3. 替换原有make
上述操作默认将make安装到/usr/local/bin下,我们备份下原版本(4.1)并链接当前版本(3.81):
cd /usr/bin
sudo mv make make.bak
sudo ln -s /usr/local/bin/make make
此时再执行make -v显示版本为GNU Make 3.81。
编译步骤
解压源代码
解压Lichee(Linux BSP)部分到当前目录:
$ tar -zxvf lichee.tar.gz -C .
解压Android部分到当前目录:
$ tar -zxvf android.tar.gz -C .
(对于A133:Linux BSP更名为Longan,注意辨别!)
源码结构
对于A33/A64/A40i:
SPL(底层引导代码):lichee/brandy
U-Boot:lichee/brandy/uboot-xxxx.xx
Linux内核:lichee/linux-3.x
系统配置(env.txt和fex文件等):lichee/tools/pack/chips/sunxiwxpx/config
Android源码:android
对于A133:
SPL(底层引导代码):longan/brandy
U-Boot:longan/brandy/brandy-2.0/uboot-2018
Linux内核:longan/kernel/linux-4.9
系统配置(env.txt和fex文件等):longan/device/config/chips/a133/config
Android源码:android
对于T527:
SPL(底层引导代码):longan/brandy
U-Boot:longan/brandy/brandy-2.0/uboot-2018
Linux内核:longan/kernel/linux-5.15
Allwinner BSP源码:longan/bsp(即全志自己的驱动、内核配置等已经与主线kernel分开存放了)
系统配置(env.txt和fex文件等):longan/device/config/chips/t527/config
Android源码:根目录(注意longan目录已经在Android源码根目录下了)
编译U-Boot
默认无需编译。若要修改U-Boot,编译方法如下:
在brandy/uboot-xxxx.xx目录下(对于A133/T527为brandy/brandy-2.0/uboot-2018)执行:
对于A33:make distclean & make sun8iw5p1 -j16
对于A64:make distclean & make sun50iw1p1_config & make -j16
对于A40i:make distclean & make sun8iw11p1_config & make -j16
对于A133:make distclean & make sun50iw10p1_config & make -j16
对于T527:make distclean & make sun55iw3p1_defconfig & make -j16
(编译生成的相关bin文件会自动拷贝到打包目录下)
编译Lichee/Longan
初次编译(使用原厂源码)请先配置编译选项,在lichee(A133为longan)目录下执行:
$ ./build.sh config
会依次显示若干选项,输入对应的数字按回车选择对应的选项,最终完成配置。
对于A33(Android 4.4):依次选 0.sun8iw5p1 -> 0.android-> 0.linux-3.4 -> 0.vstar
对于A64(Android 6.0):依次选 0.sun50iw1p1 -> 0.android -> 0.linux-3.10 -> 2.p2
对于A40i(Android 7.1):依次选 0.sun8iw11p1 -> 1.androidm -> 0.linux-3.10 -> 0.a40-p1
对于A133(Android 10):依次选 0.android -> 0.a133 -> 2.c3
对于T527(Android 13):依次选 0.android -> 2.t527 -> 0.hdevb -> 2.default
(弘迪开源源码默认已经进行了此配置,可无需执行!)
然后进行编译:
$ ./build.sh
编译Android并打包
在android目录下依次执行以下命令:
$ source build/envsetup.sh
$ lunch
会显示若干选项,输入对应的数字按回车选择对应的选项,最终完成配置。
对于A33(Android 4.4):选 vstar-eng
对于A64(Android 6.0):选 tulip_p2-eng
对于A40i(Android 7.1):选 a40_p1-eng
对于A133(Android 10):选 ceres_c3-eng
$ extract-bsp
$ make -j8
CPU有几线程-j后面的数字就是几。例如使用i5 8250U,是4核8线程的处理器,则这里参数为-j8。若make过程中出现内存不足的情况可尝试参数降为-j4或更低。编译过程大概持续数小时,视电脑配置不同而定。
$ pack
对于A33/A64/A40i:打包好的固件位于lichee/tools/pack下面。
对于A133:打包好的固件位于longan/out下面。
清理源码(用于打包备份)
清理Linux BSP:
对于A33/A64/A40i:执行lichee下的./clean.sh即可。
对于A133:执行longan下的./build.sh clean即可。
清理Android:
在android目录下执行make clean即可清理已编译内容。
常见问题
A:关于A33 Android 4.4编译Lichee遇到的报错
Q:需要修改源码的下列部分:
lichee/brandy/u-boot-2011.09/Makefile中删掉-llounny
lichee/brandy/u-boot-2011.09/arch/arm/lib/board.c中删掉下列内容:
extern void setup_vga_output_mode(void);
extern void lounny_verify(void);
setup_vga_output_mode();
lounny_verify();
lichee/brandy/u-boot-2011.09/board/sunxi/Makefile中删掉COBJS-y += vga_output_mode.o和COBJS-y += lounny.o
lichee/linux-3.4/drivers/misc/Makefile中删掉下列内容:
obj-$(CONFIG_HDGM_ENCRYPT) += hdgm_encrypt.o
obj-$(CONFIG_HDGM_ENCRYPT) += liblounny.jmk
A:A64 Android 6.0编译android部分时遇到“unsupported reloc 42 (43) against global symbol art::Runtime::instance_”错误
Q:问题的原因在于AOSP中的预编译好的ld程序存在bug,我们使用Ubuntu系统默认的ld来替换它。具体步骤如下:
将aosp中的ld改名:
$ cd prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.15-4.8/x86_64-linux/bin
$ mv ld ld.old
使用soft link,链接到全局ld:
$ ln -s /usr/bin/ld.gold ld