Contents

免AOSP源码树编译安卓内核

为了让老 Note4 发挥余热,去掉该死的SELinux,编译一下内核,macOS编译不了,缺少elf.h,查查解决方案蛮麻烦的,干脆新开个ubuntu,顺便试用一下据说不错的苹果Hypervisor framework【性能+10,内存占用-50】。

传统交叉编译时需要checkout整个20多个G的安卓源码库,即使指定了shallow clone也要17、8G,本文将通过一些repo命令的黑魔法扔掉用不到的分支和项目,获得一个内核编译的轻量环境。

环境配置

直接复制粘贴就好。我的环境是全新安装的 Ubuntu Server 16.04.3

sudo apt-get install git-core gnupg flex bison gperf \
  build-essential zip 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 unzip \
  repo openjdk-8-jdk bc lzop
cd ~/android  # Change to your favorite Dir
repo init --depth=1 \
  --groups=-all,custom \
  -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest \
  -b android-6.0.1_r3 \
  --repo-url https://mirrors.tuna.tsinghua.edu.cn/git/git-repo  # add last param when having trouble connecting Google

关于repo命令中检出分支的选择,在这里可以通过 adb shell getprop ro.build.fingerprint 字串中的六位连续字母,结合官网信息 1 确定具体分支。比如我的 samsung/trlteduoszh/trltechnzh:6.0.1/MMB29M/N9100ZHU1DQH2:user/release-keys 则版本代号就是 MMB29M ,对应的版本是 android-6.0.1_r3。 有的机型通过 ro.build.id 属性也能获取到这个值。

groups参数里面有个隐藏的all分组,可以一次排除所有project,然后我们自己写一个manifest,自定义个custom分组把我们要的代码库白名单出来。将下面的文件保存为 .repo/local_manifests/kernel.xml,并进行 repo sync

<?xml version="1.0" encoding="UTF-8"?>
<manifest>
   <remove-project name="platform/prebuilts/gcc/linux-x86/arm/arm-eabi-4.8" />
   <project path="prebuilts/gcc/linux-x86/arm/arm-eabi-4.8" name="platform/prebuilts/gcc/linux-x86/arm/arm-eabi-4.8" clone-depth="1" remote="aosp" groups="custom" />
</manifest>

好吧,讲明白其实git clone这一个源效果也是一样的。

20171103: 遇到一点问题……编译出的 zImage 刷不进去提示型号不对。正在烦恼中。好像全网就我一个遇到这种问题,感觉好不合群。:( 解决后继续更新

参考资料