使用linaro编译链编译MoKee Open Source

首先我们来认识下linaro。

linaro是一个非营利性的开源组织,目前已经获得了三星等多个巨头的支持。
linaro专注于嵌入式linux的优化,比如路由上的openwrt系统对mips架构等就使用了linaro编译链。
而在ICS时代,linaro就发布了用其编译链编译的android系统,在测试中个别数据竟有有高达100%的提升。
当然,实际上性能提升是没有那么高的。有句话说得很好,这不会发生奇迹。

不过既然有可以提升一点的性能为什么不用呢?下面我们就说下如何用linaro编译android(CM10.1为例)。

先说明下,你要已经有能力用源码中的编译链去编译出一个rom。如果还欠缺点的,请看这个教程。

1.首先,我们要先有linaro的arm架构编译链。
我们可以在linaro.org下载到最新发布的toolchain。目前,相对稳定的最新版本是4.7(2013-4)的版本,
下载后解压到source_dir/prebuilts/。我重命名了文件夹为linaro-4.7。

2.然后,我们就要修改源码的编译脚本和makefile去使用指定的编译链。
(建议建立新的分支进行修改,$repo start lianro –all)

a.修改soucre_dir/kernel/vendor_name/devcie_name/boot/arm/compressed/Makefile,否则在编译内核后打包时会出现未知CPU类型的错误。

加上:
AFLAGS_head.o += -Wa,-march=armv7-a$(plus_sec)
AFLAGS_misc.o +=-Wa,-march=armv7-a$(plus_sec)
AFLAGS_decompress.o += -Wa,-march=armv7-a$(plus_sec)

AFLAGS_lib1funcs.o +=-Wa,-march=armv7-a$(plus_sec)

AFLAGS_piggy.$(suffix_y).o += -Wa,-march=armv7-a$(plus_sec)

b.修改soucre_dir/device/vendor_name/devcie_name/BoardConfig.mk,
指定lianro编译链的位置,以及编译参数。

加上
#Linaro Stuff
USE_LINARO_COMPILER_FLAGS=yes
ANDROID_EABI_TOOLCHAIN_DIR=linaro-4.7
ARM_EABI_TOOLCHAIN_DIR=linaro-4.7

TARGET_EXTRA_CFLAGS := $(call-cc-option,-march=armv7-a) \
$(call-cc-option,-mcpu=cortex-a9) \
$(call-cc-option,-mtune=cortex-a9)

TARGET_EXTRA_CPPFLAGS := $(call-cpp-option,-march=armv7-a) \
$(call-cpp-option,-mcpu=cortex-a9) \
$(call-cpp-option,-mtune=cortex-a9)

USE_ALL_OPTIMIZED_STRING_FUNCS := true

注:source_dir为源码根目录,vendor_name为手机厂商的名称,devcie_name为手机的名称或开发代号。

c.修改MK源码
cd ~/mokee/libcore

git fetch http://review.cyanogenmod.org/CyanogenMod/android_libcore refs/changes/88/31388/1 && git cherry-pick FETCH_HEAD

cd ~/mokee/frameworks/native

git fetch http://review.cyanogenmod.org/CyanogenMod/android_frameworks_native refs/changes/91/31391/1 && git cherry-pick FETCH_HEAD

cd ~/mokee/frameworks/wilhelm

git fetch http://review.cyanogenmod.org/CyanogenMod/android_frameworks_wilhelm refs/changes/90/31390/1 && git cherry-pick FETCH_HEAD

cd ~/mokee/frameworks/ex

git fetch http://review.cyanogenmod.org/CyanogenMod/android_frameworks_ex refs/changes/92/31392/1 && git cherry-pick FETCH_HEAD

cd ~/mokee/frameworks/base

git fetch http://review.cyanogenmod.org/CyanogenMod/android_frameworks_base refs/changes/93/31393/1 && git cherry-pick FETCH_HEAD

cd ~/mokee/frameworks/av

git fetch http://review.cyanogenmod.org/CyanogenMod/android_frameworks_av refs/changes/94/31394/1 && git cherry-pick FETCH_HEAD

cd ~/mokee/external/webkit

git fetch http://review.cyanogenmod.org/CyanogenMod/android_external_webkit refs/changes/95/31395/1 && git cherry-pick FETCH_HEAD

cd ~/mokee/external/skia

git fetch http://review.cyanogenmod.org/CyanogenMod/android_external_skia refs/changes/98/31398/1 && git cherry-pick FETCH_HEAD

cd ~/mokee/external/stlport

git fetch http://review.cyanogenmod.org/CyanogenMod/android_external_stlport refs/changes/97/31397/1 && git cherry-pick FETCH_HEAD

cd ~/mokee/external/openvpn

git fetch http://review.cyanogenmod.org/CyanogenMod/android_external_openvpn refs/changes/99/31399/1 && git cherry-pick FETCH_HEAD

cd ~/mokee/external/openssl

git fetch http://review.cyanogenmod.org/CyanogenMod/android_external_openssl refs/changes/00/31400/1 && git cherry-pick FETCH_HEAD

cd ~/mokee/external/openssh

git fetch http://review.cyanogenmod.org/CyanogenMod/android_external_openssh refs/changes/01/31401/1 && git cherry-pick FETCH_HEAD

cd ~/mokee/external/lsof

git fetch http://review.cyanogenmod.org/CyanogenMod/android_external_lsof refs/changes/02/31402/1 && git cherry-pick FETCH_HEAD

cd ~/mokee/external/e2fsprogs

git fetch http://review.cyanogenmod.org/CyanogenMod/android_external_e2fsprogs refs/changes/03/31403/1 && git cherry-pick FETCH_HEAD

cd ~/mokee/external/dnsmasq

git fetch http://review.cyanogenmod.org/CyanogenMod/android_external_dnsmasq refs/changes/04/31404/1 && git cherry-pick FETCH_HEAD

cd ~/mokee/external/chromium

git fetch http://review.cyanogenmod.org/CyanogenMod/android_external_chromium refs/changes/05/31405/1 && git cherry-pick FETCH_HEAD

cd ~/mokee/external/bluetooth/bluedroid

git fetch http://review.cyanogenmod.org/CyanogenMod/android_external_bluetooth_bluedroid refs/changes/07/31407/1 && git cherry-pick FETCH_HEAD

cd ~/mokee/external/v8

git fetch http://review.cyanogenmod.org/CyanogenMod/android_external_v8 refs/changes/96/31396/1 && git cherry-pick FETCH_HEAD

cd ~/mokee/external/ping

git fetch http://review.cyanogenmod.org/CyanogenMod/android_external_ping refs/changes/09/31409/1 && git cherry-pick FETCH_HEAD

cd ~/mokee/external/ping6

git fetch http://review.cyanogenmod.org/CyanogenMod/android_external_ping6 refs/changes/10/31410/1 && git cherry-pick FETCH_HEAD

cd ~/mokee/system/security

git fetch http://review.cyanogenmod.org/CyanogenMod/android_system_security refs/changes/11/31411/1 && git cherry-pick FETCH_HEAD

cd ~/mokee/external/wpa_supplicant_8

git fetch http://review.cyanogenmod.org/CyanogenMod/android_external_wpa_supplicant_8 refs/changes/12/31412/1 && git cherry-pick FETCH_HEAD

cd ~/mokee/frameworks/rs

git fetch http://review.cyanogenmod.org/CyanogenMod/android_frameworks_rs refs/changes/15/31415/1 && git cherry-pick FETCH_HEAD

3.到了这里,需要修改的只是搞了一部分。如果你的机型编译没有依赖harware或更多的源码,现在编译基本上是可以通过的。但是,rom运行起来还是有bug的,例如,部分软件会因为shared libinaries的调用会出现闪退或无法开启的兼容性问题。我们可以根据这里cm10.1(linaro)分支的commit修改MK的源码,这样这个大bug基本上就可以解决了。

用高通的孩子应该是还有qcom部分的,请看这里

找到cm10.1(linaro)分支关于qcom的代码,然后cherry-pick过去。

4.另外,在测试lianro编译出来的rom时发现,用官网上的编译链编译出来的内核在我的机上是boot不起来的。
因为没有uart进行调试,具体原因也不能深究。所以我就再用了其它的lianro编译链。

a.将新的编译链放到source_dir/prebuilt。我重新命名为linaro4.7以作区分。

b.修改source_dir/build/core/tasks/kernel.mk。如果toolchain的prefix不同的,也要修改。
ARM_CROSS_COMPILE:=CROSS_COMPILE=”$(ccache) $(ANDROID_BUILD_TOP)/prebuilt/linux-x86/toolchain/$(TARGET_KERNEL_CUSTOM_TOOLCHAIN)/bin/arm-linux-gnueabihf-“

c.修改device的mk,定义TARGET_KERNEL_CUSTOM_TOOLCHAIN。
TARGET_KERNEL_CUSTOM_TOOLCHAIN=linaro4.7

这里为什么要这么修改,是因为我直接在device里定义全路径,编译时还是会使用了第三条规则,用回了lianro官网的编译链编译,达不到预期的效果。
所以采用了这么“迂回”的方法。

5.好了,到了这里。基本上是完成了用linaro编译链编译android了。
最后,用句写脚本很喜欢用的话来结束:Reboot and Enjoy!

本文仅是小弟的折腾手记,欢迎大家指正错误以及交流!

3 thoughts on “使用linaro编译链编译MoKee Open Source

  1. 支持linaro!linaro是目前为止提升性能最好的编译神器!听地球大大介绍过!@面汤高考冲刺ing @面汤高考冲刺ing @马丁龙猪 [哈哈][哈哈][哈哈][哈哈]性能提升太明显了!

Comments are closed.