您的位置:首页 > 移动开发 > Android开发

RK3288平台Android系统源码编译爬坑笔记

2017-01-11 13:06 591 查看

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:

sudo add-apt-repository ppa:openjdk-r/ppa
sudo apt-get update
sudo apt-get install openjdk-7-jdk


可能你会安装多个jdk版本,是有时候,最好根据要求,使用对应版本

sudo update-alternatives --config java
sudo update-alternatives --config javac


然后添加到系统环境变量中

sudo vim /etc/profile


在文件末尾追加

# Edit by binglumeng Add jdk environment

export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64  ## 注释,此处为openjdk的安装路径,请根据自己电脑的时间安装路径来修改
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin


然后保存运行

source /etc/profile

# 运行java命令,确认环境变量配置是否成功

java
javac
java -version


注意:建议使用root用户操作Ubuntu,虽然普通用户可以使用sudo,但是有时候可能还会出现权限的问题

安装依赖指令与库

sudo apt install repo bc vim gcc g++ ssh git python m4 lzop
sudo 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


修改配置

echo export  CCACHE_DIR=~/.ccache >>~/.bashrc
echo export USE_CCACHE=1 >> ~/.bashrc

## 在源码工程根目录下,提高编译器的效率,设置缓存

prebuilds/misc/linux-x86/ccache/ccache -M 50G


更新和升级系统

sudo apt update
sudo apt upgrade
sudo apt autoremove
sudo apt autoclean


修改文件

此处鉴于本人编译源码过程中,所遇问题以及搜索的解决方案,在此先罗列出需要修改的文件和内容

{project}/art/build/Android.common_build.mk

在rk3288,葡萄雨提供的源码中,暂时没有修改该文件,其实可以修改一下,找到下面内容

# Host.

ART_HOST_CLANG := false
ifneq ($(WITHOUT_HOST_CLANG),true)
# By default, host builds use clang for better warnings.
ART_HOST_CLANG := true
endif
...


修改第三行的
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 \


# Shared by HOST_x86.mk and HOST_x86_64.mk.

ifeq ($(HOST_OS),darwin)

# nothing required here yet

endif

ifeq ($(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-as

CLANG_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

#就是用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系统的编译,可以参考官方教程,主要步骤:

source build/envsetup.sh
lunch
make -j8


其中第二步骤,会出现选项,选择对应平台的编译对象,如
arm-eng
arm64-eng
等,第三步的
-j8
表示开启的线程数,一般线程数=core*2也就是cpu核数的2倍,i5一般为双核四线程,算作虚拟4核,可以用
-j8
,而i7可以用
-j16
,个人理解,呵呵。

#编译错误,重新编译
make clean
# 或者
make clobber

# 编译成功的话,可以用虚拟机看看镜像如何
cd {project}/out/targe/product/generic/
emulator


RK3288系统编译

#在源码根目录下
sudo vim ./mk.sh
#修改里面的JAVA_HOME路径为本机jdk路径
./mk.sh -u ## 编译uboot
./mk.sh -k ## 编译kernel
./mk.sh -s ## 编译文件系统


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
之类的错误,根据提示,安装相应的工具,再次编译尝试。

:本文为简要笔记,难免不全,容后再做充实,希望对其他网友有点帮助。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息