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

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
    ...

    修改第三行的truefalse

    • {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-engarm64-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文件中,并未完全使用该变量,以致于生成的releasetarget目录分开了,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.mkcp /usr/bin/ld.gold等,最好都用一下。

  • Api deprecation

    问题好似是这么个描述,意思就是系统级的java源码,有些是不公开的,会提示要么将java文件注释@hide要么就运行make update-api一般运行一下make update-api即可。

  • 其他问题

    由于硬件以及系统平台的差异,可能有些文档中没有提及一些简单的工具包的安装,rk3288平台的Android系统编译中,就需要lzop,bc,zip,unzip等工具,本文也在上文中列举安装了,若是平台遇到command not found之类的错误,根据提示,安装相应的工具,再次编译尝试。

:本文为简要笔记,难免不全,容后再做充实,希望对其他网友有点帮助。

你可能感兴趣的:(编程开发)