前言: 我虽然是做android framework开发,但平时都是编译模块,要让我添加一个机型编译我还真不熟悉,前段时间花了点时间成功编了griffin,这里记录一下。

正文: 一般来说如果一个机型做好了编译适配并添加到了官方编译列表里面(类似CM,MK等),我们下载了源码,source lunch编译就好了。 今天要说的如何编译一个还没有添加到官方编译列表的机型。

下载源码

首先下载源码这个是必须的。

其次要有机型设备对应的device,kernel,vendor源码,能自己写这些代码的我相信你也用不着看这个文章。 像我这种小白就只有去github上找对应的代码去了。

两种方法下载设备树代码,1.手动git clone,甚至你直接Download Zip也行,2.添加到 local_manifests repo sync 同步。推荐第二种。

  1. 下载代码后放到响应的目录,比如我要编译的griffin(Moto z 2016),在github上对应的仓库为MotoZ-2016/android_device_motorola_griffin,那我就把代码放到device/motorola/griffin,其他kernel和vendor的代码也是同理。 如果是需要做机型移植,devices目录下,编译相关的内容记得都要改了。 除去上面三个”必选”仓库以外,有些硬件可能还需要特殊的仓库,比如nfc之类的,这类依赖一般被写在device/griffin目录下的mk.dependencies文件里
      {
        "repository": "android_external_v4l2_hal",
        "target_path": "external/v4l2_hal"
      },
    

    android_external_v4l2_hal这写仓库也可以到github上搜搜看。

  2. 添加代码库的地址到.repo/local_manifests/roomservice.xml。直接给个例子吧 ```xml <?xml version=”1.0” encoding=”UTF-8”?> ...

</manifest>

 好了,这样就可以用repo sync 来同步了。
本来那个<remote 	name="github_boul"/> 是不必要的,不过当你.repo/manifest.xml中default的remote代表的不是你添加的设备的代码所在的网站的时候,就需要像上面那样新建一个remote,并且fetch =  代码所在的网站(这个网站不一定是github)。
像LineageOS本身代码是在github上,而且我们新增的代码也是github上,所以我们完全可以把新建的这个remote删掉,把下面的remote="github_boul"改成remote="github"。
看不懂的话去网上找一下local_manifest的编写规则吧,以前CM的wiki上有,现在LineageOS的wiki上我没找到。

# 添加机型设备到lunch列表(非必要)
好了现在我们有代码了,但是我们在lunch的时候还没有griffin的机型可以选择啊。
有两种方法把griffin添加到本地lunch列表。因为我编的Mokee,所以以下以mk为例
1.在device/motorola/griffin目录下新建`vendorsetup.sh`,添加内容:
```shell
 add_lunch_combo mk_griffin-userdebug

2.修改vendor/mk/vendorsetup.sh添加和上面同样的内容

for combo in $(curl -s https://raw.githubusercontent.com/MoKee/*后面地址省略*/
do
    add_lunch_combo $combo
    add_lunch_combo mk_griffin-userdebug
done

之后再

$ source build/envsetup.sh
$ lunch 

就可以看到新添加的机型了。 但是我开始为什么说非必要呢? 因为我们完全可以敲lunch mk_griffin-userdebug来lunch。。。你是LineageOS就敲lunch lineage_griffin-userdebug。

初始化编译

对于Mokee来说

$ source build/envsetup.sh
$ lunch mk_griffin-userdebug
$ mka bacon

对于LineageOS

$ source build/envsetup.sh
$ breakfest griffin
$ brunch griffin