瑞芯微Rockchip开发者社区
直播中

绝代双骄

11年用户 1094经验值
私信 关注
[问答]

怎样去编译RK3288平台上的Android系统源码呢

怎样使用Linux操作系统去搭建一种服务器环境呢?
怎样去编译RK3288平台上的Android系统源码呢?

回帖(1)

潘飘稚

2022-3-10 10:30:20
RK3288平台Android系统源码编译爬坑笔记

1、平台环境

使用Linux操作系统,搭建服务器环境以及编译系统,不同的硬件平台、软件环境,可能引发的问题也不相同,在此有必要简要列举一下本次工作的软硬件环境:



  • Dell Vostro 商用台式机,i7、8G
  • Ubuntu-16.04.1-server-amd64



Note:改型电脑安装系统时,会出现一些问题,反正对戴尔没啥好感,呵呵。Linux系统的安装步骤,在此也就不详细赘述,无非就是:1、使用Ultra ISO软碟通、LinuxLiveCreater等工具制作启动U盘;2、电脑USB启动U盘,进入安装,按步骤走就是了。

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

      
    找到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
      

    #就是用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


    • {project}/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.11-4.6/x86_64-linux/bin

    • {project}/build/core/clang/HOST_x86_common.mk

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



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


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

更多回帖

发帖
×
20
完善资料,
赚取积分