zoukankan      html  css  js  c++  java
  • 自己动手编译Android(LineageOS)源码

    一、编译LineageOS源码

    准备

    • 设备:小米 MIX2
    • 设备代号:chiron
    • Android版本:9.0
    • PC配置:
      • 系统:Ubuntu18.04
      • 至少12G RAM
      • 至少200GB 剩余硬盘空间
      • 良好的网络环境

    1.下载并解压SDK

    sdk中包含fastboot和adb

    下载

    wget https://dl.google.com/android/repository/platform-tools-latest-linux.zip

    解压

    unzip platform-tools-latest-linux.zip -d ~

    添加到环境变量

    gedit ~/.profile

    输入:

    # add Android SDK platform tools to path
    if [ -d "$HOME/platform-tools" ] ; then
        PATH="$HOME/platform-tools:$PATH"
    fi
    

    保存。

    使改动生效:

    source ~/.profile

    2.安装依赖

    安装必要库和工具

    sudo apt-get 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-dev libsdl1.2-dev libssl-dev libwxgtk3.0-dev libxml2 libxml2-utils lzop pngcrush rsync schedtool squashfs-tools xsltproc zip zlib1g-dev

    安装openjdk-8-jdk

    sudo apt install -y openjdk-8-jdk

    3.配置源

    创建repo存放目录

    mkdir -p ~/bin

    创建源码存放目录

    mkdir -p ~/android/lineage

    × 注:请确保该目录所在的磁盘有足够的空间(至少200G)

    安装repo

    curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo

    chmod a+x ~/bin/repo

    ~/bin放入环境变量

    gedit ~/.profile

    加入:

    # set PATH so it includes user's private bin if it exists
    if [ -d "$HOME/bin" ] ; then
        PATH="$HOME/bin:$PATH"
    fi
    

    使改动生效:
    source ~/.profile

    初始化repo

    cd ~/android/lineage

    repo init -u https://github.com/LineageOS/android.git -b lineage-16.0

    × 注:这里的lineage-16.0是分支名,对应Android 9.0。更多分支请浏览:https://github.com/LineageOS/android

    4.拉取源码

    repo sync

    5.配置源码

    cd device/xiaomi

    git clone https://github.com/LineageOS/android_device_xiaomi_chiron -b lineage-16.0 chiron

    提取vendor信息

    提取手机厂商的库。这一步将手机连接电脑,并保证手机能被adb
    命令操控,还需要手机授予adb root权限。

    adb shell su -c setenforce 0

    cd chiron

    ./extract-files.sh

    提取需要点时间,需耐心等待

    拉取kernel

    cd kernel/qcom

    git clone https://github.com/LineageOS/android_kernel_qcom_msm8998 -b lineage-16.0 msm8998

    配置构建环境

    source build/envsetup.sh

    配置设备信息

    breakfast chiron

    6.配置构建工具

    配置ccache

    gedit ~/.bashrc

    加入:

    export USE_CCACHE=1

    使改动生效:

    source ~/.bashrc

    执行:

    ccache -M 50G

    来设置缓存大小

    × 注:ccache默认在home目录,请确保home目录有足够的空间。如果想自定义ccache的目录,可以在~/.bashrc文件里加入export CCACHE_DIR=/path/to/.ccache。缓存大小根据自己硬盘大小设置,设置25G以上可以显著提高源码的构建速度。

    配置jack

    gedit ~/.bashrc

    加入:

    export ANDROID_JACK_VM_ARGS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx8G"

    使改动生效:

    source ~/.bashrc

    7. 构建

    构建整个源码

    croot

    brunch chiron

    × 注:构建成功后,在源码目录执行cd $OUT进入编译好的ROM的存放目录。lineage-16.0-xxxxxxxx-UNOFFICIAL-chiron.zip为编译好的刷机包。

    只构建某个模块

    mmm <模块名>

    例如构建frameworks中的base

    mmm frameworks/base

    打包成system.img

    有时候我们只修改system里的模块,没必要编译整个源码,就只打包system.img

    make snod

    编译system

    make systemimage

    8.刷入手机(可选)

    下载twrp

    https://dl.twrp.me/chiron/

    刷入trwp

    刷入recovery前,要先解锁手机的bootloader,如何解锁,各个厂商不太一样,这里就不阐述了。

    adb reboot bootloader

    fastboot flash recovery twrp.img

    fastboot reboot

    刷入system.img

    我们调试源码时,如果不想刷入整个ROM,可以只刷入system.img。以下命令将system.img刷入system分区

    fastboot flash system system.img

    刷入ROM

    将编译好的刷机包,通过adb push命令将刷机包传输到手机存储。进入twrp界面,擦除system分区,data分区。选择手机存储中的刷机包,刷入!!!

    9.常见问题

    (1) 编译目标设备为emulatorx86时在编译时出错,提示yasm找不到。

    安装yasm

    sudo apt-get install yasm

    (2) adb命令提示没有权限

    lsusb

    找到类似一行:

    Bus 001 Device 005: ID 18d1:4ee7 Google Inc.

    编辑51-android.rules:

    sudo gedit /etc/udev/rules.d/51-android.rules

    输入类似的内容:

    # MIX2 normal
    SUBSYSTEM=="usb", ATTRS{idVendor}=="18d1", ATTRS{idProduct}=="4ee7",MODE="0666",GROUP="plugdev"
    # MIX2 fastboot
    SUBSYSTEM=="usb", ATTRS{idVendor}=="18d1", ATTRS{idProduct}=="d00d",MODE="0666",GROUP="plugdev"
    

    ×注:idVendor,idProduct分别为lsusb命令显示的ID。开机状态和fastboot模式都需要添加权限,所以,需要增加两行。

    更改文件权限:

    sudo chmod a+r /etc/udev/rules.d/51-android.rules

    二、模拟器使用LineageOS

    将emulator所在的目录加入环境变量

    在源码目录,cd $OUT

    设置模拟器路径

    # 设置模拟器目录
    if [ -d "/android_source_path/prebuilts/android-emulator/linux-x86_64" ] ; then
        PATH="/android_source_path/prebuilts/android-emulator/linux-x86_64:$PATH"
    fi
    

    设置OUT目录

    export ANDROID_PRODUCT_OUT=/android_source_path/out/target/product/emulatorx86

    使用编译好的镜像启动(arm):

    emulator64-arm -kernel ./prebuilts/qemu-kernel/arm64/kernel-qemu -sysdir $ANDROID_PRODUCT_OUT -system $ANDROID_PRODUCT_OUT/system.img -data $ANDROID_PRODUCT_OUT/userdata.img -ramdisk $ANDROID_PRODUCT_OUT/ramdisk.img

    使用编译好的镜像启动(x86):

    emulator64-x86 -kernel ./prebuilts/qemu-kernel/x86/kernel-qemu -sysdir $ANDROID_PRODUCT_OUT -system $ANDROID_PRODUCT_OUT/system.img -data $ANDROID_PRODUCT_OUT/userdata.img -ramdisk $ANDROID_PRODUCT_OUT/ramdisk.img

    参考

  • 相关阅读:
    javascript插入样式
    Backbone.js使用jsonp api示例
    RequireJS optimizer Ant task
    Javascript 中的 call 和 apply
    通过shtml实现重构页面模块化构建的相关设置
    Eclipse 支持JQuery提示 jQueryWTP插件的安装方法
    iframe加载完成监控兼容IE/FF/Chrome
    让浏览器跨域
    Javascript 类的实现
    宏定义和内联函数区别
  • 原文地址:https://www.cnblogs.com/luoyesiqiu/p/10701419.html
Copyright © 2011-2022 走看看