RK3288平台Android系统源码编译爬坑笔记
博主自认为永远都是IT界的技术小白,最近开始接触Android系统源码的编译,由于工作需要,使用的是国产瑞芯微rk3288芯片平台的核心板,选择的服务商是阿里巴巴上相对知名的葡萄雨科技,虽然他们提供了系统源码和简单的操作步骤,但是实际过程中,任然很多问题,在此简要笔记之,亦希望有助于其他网友。
1、平台环境
使用Linux操作系统,搭建服务器环境以及编译系统,不同的硬件平台、软件环境,可能引发的问题也不相同,在此有必要简要列举一下本次工作的软硬件环境:
- Dell Vostro 商用台式机,i7、8G
- Ubuntu-16.04.1-server-amd64
Note:改型电脑安装系统时,会出现一些问题,反正对戴尔没啥好感,呵呵。Linux系统的安装步骤,在此也就不详细赘述,无非就是:1、使用Ultra ISO软碟通、LinuxLiveCreater等工具制作启动U盘;2、电脑USB启动U盘,进入安装,按步骤走就是了。
Linux系统安装、Windows系统安装、PE系统制作、有时出现CD-ROM的问题,请移步http://blog.csdn.net/binglumeng/article/details/54287010;
2、依赖安装
Google官方推荐使用Ubuntu LST版本的系统作为Android系统源码开发环境,虽说其他Linux发行版也可以,但是毕竟可能会出现这样那样的问题,普通开发者没必要去自找太多坑。
Android官网的教程Android源码编译教程还是Ubuntu14.04,此处本人使用的是Ubuntu Server16.04,稍有不同,还是建议网友使用和官方一致的版本比较好。环境配置搭建参照了官方的教程,也有网上的梧桐那时雨的一篇博客,以及StackOverFlow上的解答。一同表示感谢。
不论是RK平台、MTK平台、高通或者其他平台的Android系统编译,其实都是Google官方Android的一个定制修改,需求环境也大体相同。
源码下载
本文简述的是RK3288芯片平台的Android系统编译,源码也基本都是服务商提供,博主使用的是葡萄雨科技的系统源码,而关于Android官方的系统编译,可以参照如上源码链接的教程。
使用Google源码的话,需要Out door,作为技术员这应该是基本技能哦。
安装JDK
根据Google官方要求,5.x–6.x使用的是openjdk7、不支持Oracle的JDK,否则会提示错误,如有兴趣,你也可以去跳坑:monkey:
123sudo add-apt-repository ppa:openjdk-r/ppasudo apt-get updatesudo apt-get install openjdk-7-jdk可能你会安装多个jdk版本,是有时候,最好根据要求,使用对应版本
12sudo update-alternatives --config javasudo update-alternatives --config javac然后添加到系统环境变量中
1sudo vim /etc/profile在文件末尾追加
12345Edit by binglumeng Add jdk environmentexport JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64 ## 注释,此处为openjdk的安装路径,请根据自己电脑的时间安装路径来修改export JRE_HOME=$JAVA_HOME/jreexport CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$JAVA_HOME/lib/tools.jarexport PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin然后保存运行
12345source /etc/profile运行java命令,确认环境变量配置是否成功javajavacjava -version注意:建议使用root用户操作Ubuntu,虽然普通用户可以使用sudo,但是有时候可能还会出现权限的问题
安装依赖指令与库
12sudo apt install repo bc vim gcc g++ ssh git python m4 lzopsudo apt install zip unzip git-core gnupg flex bison gperf build-essential 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修改配置
1234echo export CCACHE_DIR=~/.ccache >>~/.bashrcecho export USE_CCACHE=1 >> ~/.bashrc## 在源码工程根目录下,提高编译器的效率,设置缓存prebuilds/misc/linux-x86/ccache/ccache -M 50G更新和升级系统
1234sudo apt updatesudo apt upgradesudo apt autoremovesudo apt autoclean修改文件
此处鉴于本人编译源码过程中,所遇问题以及搜索的解决方案,在此先罗列出需要修改的文件和内容
{project}/art/build/Android.common_build.mk
在rk3288,葡萄雨提供的源码中,暂时没有修改该文件,其实可以修改一下,找到下面内容
1234567# Host.ART_HOST_CLANG := falseifneq ($(WITHOUT_HOST_CLANG),true)# By default, host builds use clang for better warnings.ART_HOST_CLANG := trueendif...修改第三行的
true
为false
{project}/build/core/clang/HOST_x86_common.mk
找到
CLANG_CONFIG_x86_LINUX_HOST_EXTRA_ASFLAGS
在下面增加-B$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/x86_64-linux/bin \
12345678910111213141516# Shared by HOST_x86.mk and HOST_x86_64.mk.ifeq ($(HOST_OS),darwin)# nothing required here yetendififeq ($(HOST_OS),linux)CLANG_CONFIG_x86_LINUX_HOST_EXTRA_ASFLAGS := \--gcc-toolchain=$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG) \--sysroot=$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/sysroot \-B$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/x86_64-linux/bin \-no-integrated-asCLANG_CONFIG_x86_LINUX_HOST_EXTRA_CFLAGS := \--gcc-toolchain=$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG) \-no-integrated-as{project}/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.11-4.6/x86_64-linux/bin
12#就是用linux系统的ld文件替换源码中的ld文件cp /usr/bin/ld.gold /prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.11-4.6/x86_64-linux/bin/ld
3、系统编译
Android原生AOSP系统的编译,可以参考官方教程,主要步骤:
|
|
其中第二步骤,会出现选项,选择对应平台的编译对象,如arm-eng
、arm64-eng
等,第三步的-j8
表示开启的线程数,一般线程数=core*2也就是cpu核数的2倍,i5一般为双核四线程,算作虚拟4核,可以用-j8
,而i7可以用-j16
,个人理解,呵呵。
|
|
- RK3288系统编译
|
|
4、错误分析
\
failed 先前根据Android官方编译教程,设置了
OUT_DIR_COMMON_BASE
环境变量,这个会让编译出来的文件镜像,到指定的out目录下。但是在rk3288的mk文件中,并未完全使用该变量,以致于生成的release
和target
目录分开了,target
到变量指定的目录下了,release
还在工程目录下的out
目录下,如此就不能合并打包成功。unsupported reloc 43
这个问题一般就是因为Android C语言编译mk文件的配置问题,也是上文所说的
/build/core/clang/HOST_x86_common.mk
中的新增那句话。注意,在Android7.0以下版本,记得要保留-no-integrated-as
这句话。对于这个问题的解决,有好些说法,修改
/art/build/Android.common_build.mk
和cp /usr/bin/ld.gold
等,最好都用一下。Api deprecation
问题好似是这么个描述,意思就是系统级的java源码,有些是不公开的,会提示要么将java文件注释
@hide
要么就运行make update-api
一般运行一下make update-api
即可。其他问题
由于硬件以及系统平台的差异,可能有些文档中没有提及一些简单的工具包的安装,rk3288平台的Android系统编译中,就需要
lzop,bc,zip,unzip
等工具,本文也在上文中列举安装了,若是平台遇到command not found
之类的错误,根据提示,安装相应的工具,再次编译尝试。
注:本文为简要笔记,难免不全,容后再做充实,希望对其他网友有点帮助。