Android系统首次编译及问题记录

本帖最后由 as-null 于 2020-10-9 22:03 编辑

    编译Android对系统机器的配置要求较高:
  • 64位CPU
  • 16GB物理内存+交换内存
  • 30GB空闲的磁盘空间用于构建,源代码树另外占用大约8GB(共需要38GB)
  • Ubuntu系统(官方推荐12.04,可以使用更新系统),本次构建使用ubuntu16.04
  • Jdk 环境 openjdk1.7

Ubuntu系统在编译android前需要安装编译用到的系统库:

ubuntu 12.04 软件包安装:

sudo apt-get install git gnupg flex bison gperf build-essential \

zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev \ libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 \ g+±multilib mingw32 tofrodos gcc-multilib ia32-libs\ python-markdown libxml2-utils xsltproc zlib1g-dev:i386

Ubuntu 13.10/14.04 软件包安装:

sudo apt-get install git-core gnupg flex bison gperf libsdl1.2-dev \

libesd0-dev libwxgtk2.8-dev squashfs-tools build-essential zip curl \ libncurses5-dev zlib1g-dev pngcrush schedtool libxml2 libxml2-utils
xsltproc lzop libc6-dev schedtool g+±multilib lib32z1-dev lib32ncurses5-dev \ lib32readline-gplv2-dev gcc-multilib libswitch-perl

安装 ARM 交叉编译工具链和编译内核相关软件包:

sudo apt-get install gcc-arm-linux-gnueabihf \

lzop libncurses5-dev \ libssl1.0.0 libssl-dev

下载rk3288的Androidsdk,rk3288最新sdk为5.1的起下载地址:百度网盘

下载完成后先验证一下 MD5 码:

$ md5sum /path/to/firefly-rk3288_android4.4_git_20141211.tar.gz

8fe99f519d487ff40c8bc7b5ded62887 firefly-rk3288_android4.4_git_20141211.tar.gz

确认无误后,就可以解压:

mkdir -p ~/proj/firefly-rk3288
cd ~/proj/firefly-rk3288
tar xf /path/to/firefly-rk3288_android4.4_git_20141211.tar.gz
git reset --hard
git remote add bitbucket https://bitbucket.org/T-Firefly/firefly-rk3288.git
以后就可以直接从 bitbucket 处更新

:git pull bitbucket master:master
也可以到 https://bitbucket.org/T-Firefly/ … mmits/branch/master 在线浏览源码。 另外,linux-rockchip 社区搭建了 git 镜像服务器,详见这里。 如果要下载源码,请用以下命令(可选其它镜像服务器):

git clone -b firefly/master git://git.us.linux-rockchip.org/rk3288_r-box_android4.4.2_sdk.git

编译android

编译内核

编译正式版(0930)开发板的内核:

cd ~/proj/firefly-rk3288/kernel

make firefly-rk3288_defconfig

make -j8 firefly-rk3288.img

编译公测版(0809)开发板的内核:

cd ~/proj/firefly-rk3288/kernel

make firefly-rk3288_beta_defconfig

make -j8 firefly-rk3288_beta.img

编译 Android

cd ~/proj/firefly-rk3288 make -j8

./mkimage.sh

烧写分区映像

上一步骤的 ./mkimage.sh 会重新打包 boot.img 和 system.img, 并将其它相关的映像文 件拷贝到目录 rockdev/Image-rk3288/ 中。以下列出一般固件用到的映像文件:

  • boot.img :Android 的初始文件映像,负责初始化并加载 system 分区。
  • kernel.img :内核映像。
  • misc.img :misc 分区映像,负责启动模式切换和急救模式的参数传递。
  • recovery.img :急救模式映像。resource.img :资源映像,内含开机图片和内核的设备树信息。
  • system.img :Android 的 system 分区映像,ext4 文件系统格式。
  • 请参照 如何升级固件 一文来烧写分区映像文件。

如果使用的是 Windows 系统,将上述映像文件拷贝到 AndroidTool (Windows 下的 固件升级工具)的 rockdev\Image 目录中,之后参照升级文档烧写分区映像即可,这样的好 处是使用默认配置即可,不用修改文件的路径。

打包成统一固件

编译完可以使用Firefly的脚本打包成统一固件,执行如下命令:

./FFTools/mkupdate/mkupdate.sh -l rk3288_box-userdebug

编译问题

编译问题按编译过程的顺序列出:

  • 报错信息

clang: error: linker command failed with exit code 1 (use -v to see invocation)

build/core/host_shared_library_internal.mk:44: recipe for target ‘out/host/linux-x86/obj32/lib/libnativehelper.so’ failed

make: *** [out/host/linux-x86/obj32/lib/libnativehelper.so] Error 1

make: *** Waiting for unfinished jobs…

clang: error: linker command failed with exit code 1 (use -v to see invocation)

build/core/host_shared_library_internal.mk:44: recipe for target ‘out/host/linux-x86/obj32/lib/libnativehelper.so’ failed

make: *** [out/host/linux-x86/obj32/lib/libnativehelper.so] Error 1

make: *** Waiting for unfinished jobs…

host C++: dalvikvm <= art/dalvikvm/dalvikvm.cc

host StaticLib: libsigchain_32 (out/host/linux-x86/obj32/STATIC_LIBRARIES/libsigchain_intermediates/libsigchain.a)

make: *** wait: No child processes. Stop.

#### make failed to build some targets (42:14 (mm:ss)) ####

解决方案:

  • 修改[source_android]/art/build/Android.common_build.mk 如下:

# Host.

ART_HOST_CLANG := false

# Kevin modified below for Ubuntu 16.04

#ifneq ($(WITHOUT_HOST_CLANG),true)

ifneq ($(WITHOUT_HOST_CLANG),false)

# By default, host builds use clang for better warnings.

ART_HOST_CLANG := true

endif

  1. 拷贝系统/usr/bin/ld.gold覆盖

[source_android]/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.11-4.6/x86_64-linux/bin/ld

  • 报错信息


意思是部分api已经过时,需要处理或者升级。

解决方案:

执行命令 make update-api