Android 类原生编译教程

Android

1.首先选择一个你想要编译的系统(有很多这里只是大概举例几个)

  • Havoc
  • Evolution X
  • DotOS
  • Pixel Experience

2.需要的基本知识:

  • Linux 终端的基本语法

  • Git 基本操作指令

**tip:**建议Linux指令需要用到什么到时直接百度一下即可,git基本操作建议学习廖雪峰的git教程,百度直接搜索即可找到。

3.实体主机:

  • 系统:Linux(本教程示例为Ubuntu LTS)

  • CPU:至少四核心,建议八核心

  • RAM:至少16GB,建议配置32GB及以上

  • 硬盘:HDD即可 (SATA 3),SSD更好

  • 硬盘大小:至少500GB建议2TB

**tip:**云主机亦可这里不讲如何配置云服务器,可百度查找如何配置。

4.安装必要的编译工具

  • Ubuntu 18.04 LTS复制如下命令粘贴到终端
    sudo apt install bc bison build-essential ccache curl flex g++-multilib gcc-multilib git gnupg gperf imagemagick lib32ncurses5-dev lib32readline-dev lib32z1-dev liblz4-tool libncurses5 libncurses5-dev libsdl1.2-dev libssl-dev libxml2 libxml2-utils lzop pngcrush rsync schedtool squashfs-tools xsltproc zip zlib1g-dev openjdk-11-jdk git vim repo libwxgtk3.0-dev
  • Ubuntu 20.04 LTS复制如下命令粘贴到终端
    sudo apt install bc bison build-essential ccache curl flex g++-multilib gcc-multilib git gnupg gperf imagemagick lib32ncurses5-dev lib32readline-dev lib32z1-dev liblz4-tool libncurses5 libncurses5-dev libsdl1.2-dev libssl-dev libxml2 libxml2-utils lzop pngcrush rsync schedtool squashfs-tools xsltproc zip zlib1g-dev openjdk-11-jdk git vim

5.设定Git账户

git config --global user.email "您的e-mail"
git config --global user.name "您的名字"

**tip:**自己首先去注册一个GitHub账号,百度搜索github即可看到官网,看不太懂的可以翻译下网页注册,这里的用户名和e-mail就是你注册账号时填写的账号。

6.安装repo工具

mkdir -p ~/bin
curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo && chmod a+x ~/bin/repo

7.同步 Android 源码

可以参考GitHub上你想编译的ROM Manifest仓库中的readme.md文档

本文以 Evolution X 为例进行讲解

  • 给evolution建立个文件夹,并切换到新建的evolution文件夹
    mkdir -p ~/evolution
    cd ~/evolution
  • repo init 就是把编译所需的一些git 仓库地址一起整合到你的本地(manifest是清单的意思,关于repo这个工具感兴趣的伙伴可以百度一下)
    repo init -u https://github.com/Evolution-X/manifest -b elle
       //注意请不要直接复制这条指令,请看你想要编译的rom的README.md文档中的描述
    
  • 开始同步Android源代码(大概150GB左右,不同的安卓版本ROM大小会有差别)
    repo sync -c -j$(nproc --all) --force-sync --no-clone-bundle --no-tags
       //主要的是repo sync,后面的都是附加参数,可以自行百度详细了解
       
    

8.制作or修改device tree 、vendor tree、 内核

对于和我一样的新手当然是修改device tree了,但是比较新的手机,通常就是没有 device tree,需要自己补上,以后等我学会了,可以写篇文章(估计不可能了,哈哈哈)首先在GitHub上中找到对应机型的相关文件。
例如LG V50的这几个文件

device tree和vendor tree文件夹并非一定只有一个文件夹,往往会有与厂商相关的common(公共部分)所以开始编译时如果提示缺少什么可以往这里注意一下。
可以将fork到自己的账号下,然后git clone也可以直接下载后解压,总之下载到本地即可。
devices tree 文件夹放到devices→lge
kernel 文件夹放到kernel→lge
vendor tree 文件夹放到vendor→lge
device tree修改:

  • 首先对几个文件的文件名进行修改,如果没有这些文件请忽略。
    lineage_flashlmdd.mk → evolution_flashlmdd.mk
    overly-lineage/ → overly-evolution/
    //我用的lineage的tree所以 手机代号前为lineage,请自行类比修改。
  • 对evolution_flashlmdd.mk内容进行修改
    #
    # Copyright (C) 2019 The LineageOS Project
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    # http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    #

    # Inherit from those products. Most specific first.
    $(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit.mk)
    $(call inherit-product, $(SRC_TARGET_DIR)/product/full_base_telephony.mk)

    $(call inherit-product, $(SRC_TARGET_DIR)/product/product_launched_with_p.mk)

    # Inherit from flashlmdd device
    $(call inherit-product, device/lge/flashlmdd/device.mk)

    # Inherit some common Evolution stuff.
    ** $(call inherit-product, vendor/evolution/config/common_full_phone.mk)
    # Device identifiers

    ** PRODUCT_NAME := evolution_flashlmdd
    PRODUCT_DEVICE := flashlmdd
    PRODUCT_BRAND := lge
    PRODUCT_MANUFACTURER := LGE
    PRODUCT_RELEASE_NAME := V50 ThinQ
    PRODUCT_MODEL := LM-V500

    # Inherit Evolution-X product configuration
    ** TARGET_BOOT_ANIMATION_RES := 1440
    ** TARGET_GAPPS_ARCH := arm64
    ** EVO_MAINTAINER := YouthGT
    ** EVO_SUPPORT_URL := https://youthgt.github.io/
    ** EVO_DONATE_URL := https://s3.ax1x.com/2021/03/11/6YUyX6.png
    # Maintainer

    PRODUCT_GMS_CLIENTID_BASE := android-lge

    TARGET_VENDOR_PRODUCT_NAME := flashlmdd_lao_com
    TARGET_VENDOR_DEVICE_NAME := flashlmdd

    PRODUCT_BUILD_PROP_OVERRIDES += \
    PRODUCT_NAME="flashlmdd_lao_com" \
    PRIVATE_BUILD_DESC="flashlmdd_lao_com-user 10 QKQ1.191021.002 203281715d08f release-keys"

    BUILD_FINGERPRINT := "lge/flashlmdd_lao_com/flashlmdd:10/QKQ1.191021.002/203281715d08f:user/release-keys"
    ```

    //带有** 的为需要修改的地方,并不能能完全按照我的修改,建议在github上查找与你编译的rom的其他机型的该文件,里面的英文大概都可看懂,自行大概理解即可。

    **tip:**这里大家可能会遇到少修改或者漏改的问题,这里建议查看与你编译同机型类原生大佬的git commit 进行修改,修改时每次修改后也进行git commit以便记录自己的修改过程,方便出错时修改。

9.开始编译

  无相关基础的新手不要抱着第一次就可以编译成功且开机的希望来做,第一次大部分都是失败的,不要灰心,这是正常现象,毕竟你做到这里已经比很多人强了,不是吗?
设定Cache
export USE_CCACHE=1
export CCACHE_EXEC=/usr/bin/ccache
ccache -M 50G
```

//这样可以加快编译的速度,电脑剩余空间不多的情况就不要设置了

* 开始编译

. build/envsetup.sh
lunch ROM代号_厂商代号-编译类型
brunch ROM代号_厂商代号-编译类型

对于我的V50来讲就是

. build/envsetup.sh
lunch evolution_flashlmdd-userdebug
brunch evolution_flashlmdd-userdebug


* 编写脚本
将编译时所需的命令编写成脚本方便编译,虽然这个步骤并非必要但我还是建议你这样做。

新建一个文本文档后缀.sh,名字随意比如就叫make.sh

#!/bin/bash
#Build flashlmdd
#cd ~/evolution
export USE_CCACHE=1
export CCACHE_EXEC=/usr/bin/ccache
ccache -M 50G
. build/envsetup.sh
** brunch evolution_flashlmdd-userdebug | tee evolution_flashlmdd_$(date +”%Y%m%d_%H.%M”)GMT8.txt

```
//注意将rom代号和机型代号修改,**为需要修改的地方

10.静等编译。
编译失败的解决办法

  • Google搜索,CSDN,GitHub搜索,注意搜索时复制的内容,只复制错误内容,不要搜索无关的内容 。
  • tg的几个群组也是解决问题的好地方。
    Android OS Building Support
    Android Building Help
    RomDevelopment
    //直接tg里面搜索即可,交流建议使用英文哦。
作者

YouthGT

发布于

2021-04-15

更新于

2021-04-25

许可协议

评论