Ubuntu16.04编译Android源码7.1.2踩坑

Ubuntu16.04编译Android源码7.1.2踩坑

参考链接:

1.    https://blog.csdn.net/u012195899/article/details/82078384

2.    https://www.jianshu.com/p/266155193716

3.    https://www.jianshu.com/p/5e63b8aedd5f?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation


一、前言

        本文不涉及源码下载过程,主要记录自己的编译源码过程及其中遇到的问题,并最终运行在真机上。

二、预置环境

        1、ubuntu16.04,16G内存,130G硬盘

        2、上位机:RK3399

        3、编译源码版本为android-7.1.2

        版本选择参考链接:https://source.android.google.cn/setup/start/build-numbers#source-code-tags-and-builds,根据你的真机型号选择对应的源码版本。

三、编译要求:编译RK3399  Android7.1 Industry 固件(主要维护)

要求

参考链接:http://wiki.t-firefly.com/zh_CN/Firefly-RK3399/compile_android_industry_firmware.html

需要jdk、python、gnu make、git

下载编译须知:

Android7.1 industry 版本(主要维护)在工业和平板和盒子等领域的使用上范围更加广泛,而且性能稳定大批量生产验证过, 该版本也作为我司主要维护版本,适用于我司RK3399系统的所有机型。

准备工作

编译 Android 对机器的配置要求较高:

  • 64 位 CPU

  • 16GB 物理内存+交换内存

  • 30GB 空闲的磁盘空间用于构建,源码树另外占用大约 25GB

官方推荐 Ubuntu 14.04 操作系统,经测试,Ubuntu 12.04 也可以编译运行成功,只需要满足 http://source.android.com/source/building.html 里的软硬件配置即可。编译环境的初始化可参考 http://source.android.com/source/initializing.html

  • a、设置java环境   安装 OpenJDK 8

           此时要编译源码7.1.2版本,Ubuntu下要求java环境为OpenJDK8

            执行命令安装:

            //正常来说命令行配置jre即可
            sudo apt-get install openjdk-8-jre
            //但我同时安装了jdk
            sudo apt-get install openjdk-8-jdk

            执行命令查看是否安装成功:

            java -version
            javac -version

            如果安装过程没有出错,那么此时应该能够看到openjdk1.8环境

提示:安装 openjdk-8-jdk,会更改 JDK 的默认链接,这时可用:

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

  • b、设置python

            ubuntu中自带python环境,且版本为2.7,可通过执行python命令查看。

  • c、设置gnu make

            ubuntu中自带gnu make,版本为4.1,但由于我们此时编译Android版本为7.1,可以在该版本执行,因此也不作改变。可通过执行make命令查看版本。

  • d、安装需要的库文件

        sudo apt install g++-multilib
        sudo apt install gperf
        sudo apt install libxml2-utils
        sudo apt install curl
        sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386
        sudo apt-get install m4

  • 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 \
lzop libssl1.0.0 libssl-dev
  • Ubuntu 14.04 软件包安装:FAILED: 

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 \
libssl1.0.0 libssl-dev   

四、下载 Android SDK

Android SDK 源码包比较大,可以通过如下方式获取Android7.1源码包: [下载链接]

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

$ md5sum /path/to/rk3399-firefly-industry-71-20190926.7z.001

afb279a7d2966908bcf53ce2c2c05edc  rk3399-firefly-industry-71-20190926.7z.001

$md5sum /path/to/rk3399-firefly-industry-71-20190926.7z.002

2bc5a41fd1056f1d1ab1f7e84f666bee  rk3399-firefly-industry-71-20190926.7z.002

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

mkdir -p ~/proj/firefly-rk3399-Industry
cd ~/proj/firefly-rk3399-Industry
7z x /path/to/rk3399-firefly-industry-71-20190926.7z.001 -r -o.
git reset --hard

注意:解压后务必要先更新下远程仓库。 以下为从 gitlab 处更新的方法:

1. 进入SDK根目录
cd ~/proj/firefly-rk3399-Industry  

2. 下载远程bundle仓库
git clone https://gitlab.com/TeeFirefly/rk3399-industry-nougat-bundle.git .bundle

3. 若下载仓库失败,目前bundle仓库大约1.4G左右,所以同步的时候可能会出现卡住或失败的问题,
可以从下方百度云链接下载并解压到SDK根目录,解压指令如下:

7z x rk3399-industry-nougat-bundle.7z  -r -o. && mv rk3399-industry-nougat-bundle/ .bundle/

4. 更新SDK,并且后续更新不需要再次拉取远程仓库,直接执行以下命令即可
.bundle/update

5. 按照提示已经更新内容到 FETCH_HEAD,同步FETCH_HEAD到firefly分支
git rebase FETCH_HEAD  

bundle压缩包

Firefly-RK3399 整体编译打包方法

  • 默认为 HDMI+DP 显示编译

整体编译:
./FFTools/make.sh -j8 -d rk3399-firefly -l rk3399_firefly-userdebug
打包固件:
./FFTools/mkupdate/mkupdate.sh -l rk3399_firefly-userdebug

打包完成会在 rockdev/Image-rk3399_firefly/ 生成打包好的固件.

make -j8

这里的工作线程数可以设置为物理内核数-逻辑内核数之间的数字,我的电脑物理内核为4,逻辑内核数为8,因此设置-j参数为8.

五、编译7.1踩坑

有时候编译的时候会一直报错,这个时候可以执行make clobber/make clean命令清除之前编译生成的环境和文件,全部重新执行生效。

a、JACK报错处理&多用户编译:参考 https://www.jianshu.com/p/266155193716

FAILED: /bin/bash -c "(prebuilts/sdk/tools/jack-admin install-server prebuilts/sdk/tools/jack-launcher.jar prebuilts/sdk/tools/jack-server-4.11.ALPHA.jar  2>&1 || (exit 0) ) && (JACK_SERVER_VM_ARGUMENTS=\"-Dfile.encoding=UTF-8 -XX:+TieredCompilation\" prebuilts/sdk/tools/jack-admin start-server 2>&1 || exit 0 ) && (prebuilts/sdk/tools/jack-admin update server prebuilts/sdk/tools/jack-server-4.11.ALPHA.jar 4.11.ALPHA 2>&1 || exit 0 ) && (prebuilts/sdk/tools/jack-admin update jack prebuilts/sdk/tools/jacks/jack-4.32.CANDIDATE.jar 4.32.CANDIDATE || exit 47 )"
Jack server already installed in "/home/system1/.jack-server"
Communication error with Jack server (35), try 'jack-diagnose' or see Jack server log
SSL error when connecting to the Jack server. Try 'jack-diagnose'
SSL error when connecting to the Jack server. Try 'jack-diagnose'

报错原因

jack不支持多用户同时编译,所以经常出现jack server报错的现象

解决方法

编辑 $home/.jack$home/.jack-settings$home/.jack-server/config.properties,修改SERVER_PORT_SERVICESERVER_PORT_ADMIN的端口号,然后保存。

执行:

./prebuilts/sdk/tools/jack-admin stop-server
./prebuilts/sdk/tools/jack-admin start-server

如果权限不对可以执行下面的命令修改权限:

chmod 600 .jack
chmod 600 .jack-settings
chmod 700 .jack-server

报错的处理

建议先清理.jack-server/logs/内的文件,然后再编译验证,出错后,可以查看此路径下的日志文件中的具体错误,再根据错误进行处理。

b、

ninja: Entering directory `.'
bison/bison: m4 subprocess failed: No such file or directory
[  0% 1/34696] Yacc: aidl <= system/tools/aidl/aidl_language_y.yy
FAILED: /bin/bash -c "prebuilts/misc/linux-x86/bison/bison -d  --defines=out/host/linux-x86/obj/STATIC_LIBRARIES/libaidl-common_intermediates/aidl_language_y.h -o out/host/linux-x86/obj/STATIC_LIBRARIES/libaidl-common_intermediates/aidl_language_y.cpp system/tools/aidl/aidl_language_y.yy"
/bin/bash: prebuilts/misc/linux-x86/bison/bison: No such file or directory
ninja: build stopped: subcommand failed.
build/core/ninja.mk:148: recipe for target 'ninja_wrapper' failed
make: *** [ninja_wrapper] Error 1

修复:

sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386
c、

FAILED: /bin/bash -c "prebuilts/misc/linux-x86/flex/flex-2.5.39 -oout/host/linux-x86/obj/STATIC_LIBRARIES/libaidl-common_intermediates/aidl_language_l.cpp system/tools/aidl/aidl_language_l.ll"
flex-2.5.39: fatal internal error, exec of /usr/bin/m4 failed
[  1% 760/49025] target Java: core-all (out/targe...bj/JAVA_LIBRARIES/core-all_intermediates/classes)
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
ninja: build stopped: subcommand failed.
build/core/ninja.mk:148: recipe for target 'ninja_wrapper' failed
make: *** [ninja_wrapper] Error 1

修复:

sudo apt-get install m4

d、

Communication error with Jack server (52). Try 'jack-diagnose'

修复:

./prebuilts/sdk/tools/jack-admin stop-server
./prebuilts/sdk/tools/jack-admin start-server

这里需要注意的是,当执行kill-server时,查看jack服务器是否已经成功停止。

启动时,查看启动是否成功。如果启动成功,可继续编译。通常如果机器配置不够,再次执行会报问题e错误。

e、

Out of memory error (version 1.2-rc4 'Carnac' (298900 f95d7bdecfceb327f9d201a1348397ed8a843843 by android-jack-team@google.com)).
GC overhead limit exceeded.

修复:

./prebuilts/sdk/tools/jack-admin stop-server
./prebuilts/sdk/tools/jack-admin start-server

这也是Jack服务器编译过程中会报的错,修改启动参数即可。

打开文件prebuilts/sdk/tools/jack-admin,搜索 JACK_SERVER_VM_ARGUMENTS关键字符串,在-cp参数前添加--Xmx3g 即可。

1.    JACK_SERVER_COMMAND="java -XX:MaxJavaStackTraceDepth=-1 -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -Xmx3g -cp $LAUNCHER_JAR $LAUNCHER_NAME"

2.    JACK_SERVER_VM_ARGUMENTS="${JACK_SERVER_VM_ARGUMENTS:=-Dfile.encoding=UTF-8 -XX:+TieredCompilation -mx3g}"

此时再按照d问题解决方案,首先stop-server,然后重新启动start-server,并查看启动返回日志中的参数是否有我们修改后的-Xmx3g

f、 报错如下:

Internal compiler error (version 1.2-rc4 'Carnac' (298900 f95d7bdecfceb327f9d201a1348397ed8a843843 by android-jack-team@google.com)).
no mapping specified for register.

问题原因:是推行 Jack 工具遇到了极大的困难,对Java 8 特性的支持方式将转向 javac和dx,将会在Android Studio中做相关支持。

解决方法:参考 Android 新一代编译 toolchain Jack 初探

https://www.jianshu.com/p/5e63b8aedd5f?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

在android_sdk/external/jetty/Android.mk中添加如下:

LOCAL_MODULE_SUFFIX := $(COMMON_JAVA_PACKAGE_SUFFIX)
LOCAL_BUILT_MODULE_STEM := javalib.jar
LOCAL_UNINSTALLABLE_MODULE := false

修改后的代码如下:

include $(CLEAR_VARS)

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := \
        servlet-api:lib/javax.servlet-3.0.0.v201112011016.jar \
        slf4j-api:lib/slf4j-api-1.6.1.jar \
        slf4j-jdk14:lib/slf4j-jdk14-1.6.1.jar \

include $(BUILD_MULTI_PREBUILT)

include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := JAVA_LIBRARIES
LOCAL_MODULE := jetty-util
LOCAL_SRC_FILES := lib/jetty-util-6.1.26.jar
LOCAL_JACK_FLAGS := -D jack.import.jar.debug-info=false
#LOCAL_UNINSTALLABLE_MODULE := true

LOCAL_MODULE_SUFFIX := $(COMMON_JAVA_PACKAGE_SUFFIX)
LOCAL_BUILT_MODULE_STEM := javalib.jar
LOCAL_UNINSTALLABLE_MODULE := false

include $(BUILD_PREBUILT)

总结

1 Jack 的目的是让 Android 支持更多的 Java 8 特性;
2 Google 将会把 Jack 的功能转移到 javac 和 dx 上;

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

a746742897

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值