Halium适配:
1. android版本小于7.x:
根据前面讲述的内容,android没有启用Treble架构(即没有使用GSI), 这个阶段要适配halium,那需要做的工作就很多了,这一点在Halium的github工程里面也可以体现出,工作里面会有很多和设备相关的仓库,做这个阶段的适配工作对开发人员的要求就比较高,最起码对安卓工程和硬件平台很熟悉,有丰富的android硬件平台的开发经验,其次还需要拿到适配硬件的android源码,我们需要编译内核,并且把和设备相关的部分移植到Halium的工程中, 这个就是为什么halium代码编译前需要先获取和设备相关的仓库代码,并且我们发现社区适配的机器近乎全部都是高通平台的机器,这也从另外一个层面说明高通的开源做的要好一些;
一个好消息是,当前android系统的硬件基本上很少有低于android 8的版本了,以此上述全功能适配的方式可以不用关注,如果真的有特殊领域需要,可以留言交流;
2. android 8 及之后的版本:
根据前面的介绍,android 8 之后的版本采用Treble 架构(使用GSI), 其纯android部分与硬件厂商部分进行分离,即system和vender是分离的,这就意味着halium只需要适配对应android版本的system.img即可,而不必关心vendor(这里主要指HAL层)部分的区别,当然了boot.img还是要进行适配的;
3. halium适配步骤:
1)boot.img :
boot.img 实际上就是内核+ramdisk, 将设备的内核源码放到halium工程中,同时把linux ramdisk也放到halium的工程中,然后编译生成boot.img,
问题:为什么要生成android的boot.img, 我们不是linux吗?
这是因为目标设备原系统是android, 而我们没有去动uboot(LK), 所以启动kernel还是借助android uboot来完成的,并且kernel是由原系统android 来的,部分配置还要落实到android工程脚本中,因此借助android工程来做事半功倍,高通的开源做的还是比较好的,市面上高通的机器,尤其是海外发货的机器都可以拿到内核源码,因此就有了修改内核的机会;
如果有设备的android源码,就更加方便,可以不借助halium工程来做,可以直接使用android源码来进行编译编译,这里面有几点需要注意一下:
a. 内核是支持android的内核,需要根据主系统的linux进行修改;
b. ramdisk需要自己打到内核里面,这里就需要熟悉Android的编译过程, 一般是修改INTERNAL_BOOTIMAGE_ARGS 例如INTERNAL_BOOTIMAGE_ARGS += --ramdisk $(path to ramdisk) ;
c. 需要修改cmdline 参数,通常情况下需要关闭selinux;
d. 特别需要注意的是,编译kernel的时候会有一些ko,需要重新编译才能正确加载;
经过以上修改,编译后就会得到我们需要的boot.img .
ramdisk的下载地址: https://github.com/Halium/initramfs-tools-halium/releases/tag/continuous
2) halium GSI编译:
halium GSI编译按照github上的指导就好了,最后得到的文件system.img,
# Get all the needed repositories for a Halium-based build
repo init -u https://github.com/Halium/android -b halium-10.0 --depth=1
# Get the required repositories for this specific build
./halium/devices/setup halium_arm64
# Apply Halium patches to the Android source tree
hybris-patches/apply-patches.sh --mb
# Setup the build environment
source build/envsetup.sh && breakfast halium_arm64
# Build the raw system image
mka rawsystemimage
得到的GSI是system.img 或者android-rootfs.img
下载代码需要有访问google代码的权限,最好是使用代理,不使用代理经常会下载不成功;