美文网首页android
Ubuntu编译Android13系统源码

Ubuntu编译Android13系统源码

作者: 张小潇 | 来源:发表于2023-02-01 22:44 被阅读0次

    前言

    做Android应用好多年,一直对AOSP无所知,都不知道什么东西,目前车载那么火,就想介入进去,开始尝试去编译一下系统源码,然后去看了一下Android官网,目前最新的版本还不支持mac和window,只支持ubuntu,去整了个硬盘准备刷个系统,可能是Macmini原因,一直没能成功,很尴尬,最后整了虚拟机。

    整个过程挺麻烦的,我下载是Android13最新的源码,因为源码需要翻墙,我用清华的镜像,下载倒是挺快,没有像别人说的两三天,但也有半天,编译也用了半天,过程有很多很多坑,记录下来给大家分享一下,一起学习。

    一、构建环境搭建

    1.1、准备工作

    VMWare:https://www.vmware.com/products/fusion/fusion-evaluation.html
    Ubuntu镜像:http://mirrors.aliyun.com/ubuntu-releases/

    1.2、VMWare安装Ubuntu

    1.2.1、我的电脑是Mac,所以下载的是VMWare Fusion虚拟机,Android官网建议ubuntu版本选择18.0.4,给的内存大小尽量给大一些,我是16G,给了12G,磁盘大小给了500G

    1675172744307.jpg

    1.2.2、如果是Mac的话,给了一个新的硬盘,格式化的话选择区分大小写,不然Androidstudo去跑源码会莫名的报错

    1675173592846.jpg

    1.3、下载git与Python3

    1.3.1、git安装与下载

    安装git:

        sudo apt install git
    

    安装依赖工具:

    sudo apt install git-core libssl-dev  libffi-dev gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev libz-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip
    

    设置git身份,添加自己的邮箱和姓名:

    git config --global user.email "zhangxiaoxiao@qq.com"
    git config --global user.name "zhangxiaoxiao"
    

    1.3.2、Python3的安装与切换

    下载Python3:

    sudo apt install python3
    

    配置update-alternatives,用于切换当前使用的python版本,需要设置软链:

    sudo update-alternatives --install  /usr/bin/python python /usr/bin/python2.7(python2安装地址)  2(权重号)
    sudo update-alternatives --install  /usr/bin/python python /usr/bin/python3.7(python3的安装地址)  3(权重号)
    

    切换Python版本:

    sudo update-alternatives --config python
    
    1675174640671.jpg

    二、源码下载与编译

    AOSP(Android Open Source Project)是Google开放的Android 开源项目,中文官网为:https://source.android.google.cn/ AOSP通俗来讲就是一个Android系统源码项目,通过它可以定制 Android 操作系统,国内手机厂商都是在此基础上开发的定制系统。因为要墙,如果无法连接Google服务器获取AOSP源码,可以从 清华大学镜像站或者 中科大镜像。我用的是中科的例子

    2.1、下载 repo 工具

    创建bin,并加入到PATH中:

    mkdir ~/bin
    PATH=~/bin:$PATH
    

    安装curl库:

    sudo apt-get install curl
    

    下载repo并设置权限

    curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
    ## 如果上述 URL 不可访问,可以用下面的:
    ## curl -sSL  'https://gerrit-googlesource.proxy.ustclug.org/git-repo/+/master/repo?format=TEXT' |base64 -d > ~/bin/repo
    chmod a+x ~/bin/repo
    

    2.2、下载源码

    然后建立一个工作目录(名字任意)

    mkdir aosp
    cd aosp
    

    初始化仓库:

    repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest
    ## 如果提示无法连接到 gerrit.googlesource.com,可以编辑 ~/bin/repo,把 REPO_URL 一行替换成下面的:
    ## REPO_URL = 'https://gerrit-googlesource.proxy.ustclug.org/git-repo'
    
    1675178768113.jpg
    如果需要某个特定的 Android 版本(Android 版本列表 ):
    repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-13.0.0_r24
    

    同步源码树(以后只需执行这条命令来同步):

    repo sync
    

    等待漫长的好几个小时,终于完成,成功会有这样提示

    WechatIMG321.png

    2.3、安装构建环境

    安装 jdk8

    sudo apt-get update
    sudo apt-get install openjdk-8-jdk
    

    安装依赖:

    sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib
    sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386
    sudo apt-get install tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386
    sudo apt-get install dpkg-dev libsdl1.2-dev libesd0-dev
    sudo apt-get install git-core gnupg flex bison gperf build-essential
    sudo apt-get install zip curl zlib1g-dev gcc-multilib g++-multilib
    sudo apt-get install libc6-dev-i386
    sudo apt-get install lib32ncurses5-dev x11proto-core-dev libx11-dev
    sudo apt-get install libgl1-mesa-dev libxml2-utils xsltproc unzip m4
    sudo apt-get install lib32z-dev ccache
    sudo apt-get install libssl-dev
    

    安装 sudo apt-get install libesd0-dev 会报 Unable to locate package libesd0-dev 这个错,解决办法

    sudo gedit /etc/apt/sources.list  //在行尾添加如下两行的内容
    deb http://us.archive.ubuntu.com/ubuntu/ xenial main universe
    deb-src http://us.archive.ubuntu.com/ubuntu/ xenial main universe
    
    1675180175543.jpg

    2.4、编译

    使用envsetup.sh脚本初始化环境:

    source build/envsetup.sh
    

    选择用lunch构建哪个目标,根据设备选择需要的目标,该设备可以是google官方提供的,根据google提供的驱动地址下载:https://developers.google.cn/android/drivers或者可以用电脑模拟器“sdk_phone_x86_64”,我这边没有设备使用的是电脑模拟器

    lunch sdk_phone_x86_64
    

    构建代码

    m j8(8等于核数*2)
    

    其他指令说明

    - croot: Changes directory to the top of the tree.
    - m: Makes from the top of the tree.
    - mm: Builds all of the modules in the current directory.
    - mmm: Builds all of the modules in the supplied directories.
    - cgrep: Greps on all local C/C++ files.
    - jgrep: Greps on all local Java files.
    - resgrep: Greps on all local res/*.xml files.
    - godir: Go to the directory containing a file.
    - clean - m clean 会删除此配置的所有输出和中间文件。此内容与 rm -rf out/ 相同
    其中mmm指令就是用来编译指定目录.通常来说,每个目录只包含一个模块.比如这里我们要编译Setting 模块,执行指令:
    mmm packages/apps/Settings/
    
    WechatIMG322.png

    启动模拟器

    emulator
    
    WechatIMG482.png

    模拟器关闭时候,其实在后台还存在,需要自行关闭

    pkill qemu
    

    三、自定义ROM真机刷机

    USB 调试配置:(设备USB能连上电脑虚拟机则不用管,如果不是用虚拟机能连上电脑也忽略)https://developer.android.google.cn/studio/run/device.html#setting-up

    驱动下载:https://developers.google.cn/android/drivers#angleropr6.170623.019

    1675256709006.jpg
    下载完对应的驱动,并将压缩包放入已经下载好的源码根目录,解压后得到两个脚本文件,从源代码树的根目录运行附带的自解压脚本,然后确认您同意附带的许可协议的条款。二进制文件及其对应的 makefile 将会安装在源代码树的 vendor/ 层次结构中
    # 我的目录/home/zhangxiaoxiao/aosp
    extract-qcom-barbet.sh
    extract-google_devices-barbet.sh
    
    1675258441080.jpg

    为了确保新安装的二进制文件在解压后能被有效采用,请使用以下命令删除所有之前 build 的已有输出:

    make clobber
    

    进入Bootloader模式:(解BL锁)

    adb reboot bootloader
    

    查看连接设备:

    fastboot devices
    

    刷机:

    fastboot flashall -w
    

    四、过程报错收集

    无法安装libesd0-dev

    解决办法:
    sudo vim /etc/apt/sources.list  //在行尾添加如下两行的内容
    
    deb http://us.archive.ubuntu.com/ubuntu/ xenial main universe
    deb-src http://us.archive.ubuntu.com/ubuntu/ xenial main universe
    
    更新软件源并重新安装:
    sudo apt-get update && sudo apt-get install libesd0-dev
    

    内存不够,新版本要求16G,可能是你开的线程太多了。比如make -j8 这种。还有一种原因是可能没有设置swap交换区,就是把磁盘空间当作临时内存,注意的点是,设置完成需要重启虚拟机或电脑。

    //查看内存大小
    free -m
    //创建交换分区的文件:增加16G大小的交换分区,则命令写法如下,其中的 count 等于想要的块大小
    dd if=/dev/zero of=/home/swapfile bs=1M count=16384
    //设置交换分区文件,建立swap的文件系统
    mkswap /home/swapfile
    //立即启用交换分区文件
    swapon /home/swapfile
    
    //如果要使系统开机时自启用,要在文件/etc/fstab中添加一行
    /home/swapfile swap swap defaults 0 0
    

    KVM的虚拟化需要硬件支持报错

    //报错信息
    INFO    | Android emulator version 31.3.9.0 (build_id 9070145) (CL:N/A)
    INFO    | Storing crashdata in: /tmp/android-zhangxiaoxiao/emu-crash.db, detection is enabled
    INFO    | Duplicate loglines will be removed, if you wish to see each indiviudal line launch with the -log-nofilter flag.
    ERROR   | x86_64 emulation currently requires hardware acceleration!
    CPU acceleration status: KVM requires a CPU that supports vmx or svm
    
    //安装kvm解决办法参考如下
    https://help.ubuntu.com/community/KVM/Installation
    //模拟器参考
    https://blog.csdn.net/mvp_Dawn/article/details/107678057
    

    make完不能直接emulator启动电脑模拟器,会报错,lunch aosp_x86-eng这个版本不行,Android12改掉了会报错

    ERROR   | Failed to create Vulkan instance.
    qemu-system-x86_64: Could not open '/home/zhangxiaoxiao/aosp/out/target/product/generic_x86_64/userdata-qemu.img': No such file or directory
    
    //解决办法
    lunch sdk_phone_x86_64
    

    感谢

    https://www.jianshu.com/p/6dee223ac93e
    https://blog.csdn.net/kfyzjd2008/article/details/124267159
    https://www.jianshu.com/p/53941de91c77
    https://www.pudn.com/news/62599ce6be9ad24cfab6def3.html
    https://www.cnblogs.com/caoxinyu/p/10568480.html

    相关文章

      网友评论

        本文标题:Ubuntu编译Android13系统源码

        本文链接:https://www.haomeiwen.com/subject/eribhdtx.html