Android开发window安装Ubuntu虚拟机编译安卓aosp12源代码

Window安装Ubuntu虚拟机编译aosp安卓12源代码

1. 安装VMWare虚拟机,以及安装Ubuntu

1.1 下载安装VMWare虚拟机

  1. 下载地址和密钥,请见:
    1. https://www.cnblogs.com/yongfengnice/p/17413934.html

1.2 下载安装Ubuntu

  1. ubuntu下载地址:

    1. https://ubuntu.com/download/alternative-downloads
    2. 我选择下载20.04.6 LTS Desktop版本
  2. 安装ubuntu细节说明:

    1. 如果window内存32G以上可以给ubuntu大点内存,比如16G甚至更大,但至少也留个8G给window吧。
    2. 如果window只有8G内存,ubuntu最多分配4G。分配多了window很卡。
    3. 如果window只有4G内存的话,建议直接砸了换新的,如果还想试一下那分配个1G看看吧

2. 下载AOSP源码

2.1 下载源选择

  1. 如果能FQ访问Google的话,直接参考下面google这篇官方说明文档来吧

    1. https://source.android.google.cn/
    2. 这篇文档是google中文官方文档,可以直接访问,但是里面的源代码下载地址是google海外的
  2. 咱们是合法公民,老老实实使用国内镜像也能完成源代码下载和编译

    1. 清华大学镜像
      1. https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/
      2. 提供了两种源代码下载方式,一种是使用每月更新的初始化包,另外一直是传统初始化方法(我们接下来使用这个方式)
    2. 中科大镜像
      1. 主页:https://mirrors.ustc.edu.cn/help/
      2. AOSP:https://mirrors.ustc.edu.cn/help/aosp.html

2.2 下载repo工具

  1. 下载安装git工具

    1. sudo apt-get install git
  2. 配置git

    1. 配置邮箱:git config --global user.email "<xx@qq.com>"
    2. 配置用户名:git config --global user.name "xx"
  3. 创建bin目录,并添加到PATH环境变量

    1. 创建目录:mkdir ~/bin
    2. 添加到PATH(仅当前窗口有效):PATH=~/bin:$PATH
    3. 如果需要永久生效,可以配置到.bashrc配置文件里,将~/bin配置到PATH主要原因:
      1. 后续是将repo文件下载到这个bin目录下
      2. 然后给了repo可执行权限后,窗口可以执行运行repo
  4. 安装curl

    1. sudo apt-get install curl
    2. 下载repo文件需要
  5. 下载repo,并设置权限

    1. curl <https://mirrors.tuna.tsinghua.edu.cn/git/git-repo> > ~/bin/repo
    2. chmod a+x ~/bin/repo
    3. repo文件是什么??
      1. 其实repo文件就是一个python脚本
      2. 这个脚本逻辑首先是检测下载环境
      3. 然后下载git仓库集合,再根据这些仓库调用git clone把各个部分下载下来
      4. android源代码由几百个git仓库按照一定逻辑组成的,不可能手动一个个下载下来吧?
      5. 所以使用repo集中管理并执行这些git仓库,简单理解repo的作用就是这样的
  6. 安装python,repo初始化需要

    1. sudo apt-get install python

2.3 下载AOSP源码

  1. 建立工作目录

    1. mkdir aosp_12
    2. cd aosp_12
  2. 配置git下载源

    1. export REPO_URL='<https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/>'
    2. 也可以配置到~/.bashrc文件里面,让它永久生效
    3. 为什么是配置REPO_URL变量?
      1. 打开repo文件,搜索一下REPO_URL就关键字,就知道为什么了。
      2. 先从环境变量读取REPO_URL变量的值,读取不到的话默认是使用google源
  3. 初始化仓库(其实就是下载git地址)

    1. 下载所有分支git仓库:
      1. repo init -u <https://aosp.tuna.tsinghua.edu.cn/platform/manifest>
      2. 下载所有分支git仓库地址,这个比较耗时感觉也没必要,不过后续切换方便点?
    2. 下载12.0.0_r8分支git仓库:
      1. repo init -u <https://aosp.tuna.tsinghua.edu.cn/platform/manifest> -b android-12.0.0_r8
      2. 添加-b参数下载指定分支的git地址
    3. android所有版本参考:
      1. https://source.android.google.cn/setup/start/build-numbers#source-code-tags-and-builds
  4. 同步源码

    1. repo sync
    2. 这步就是根据上一步下载下来的git地址去下载源代码了
    3. 这一步比较耗时需要好几个小时。如果失败了重新执行repo sync即可。
  5. 下载kernel源代码(应该不用下载,aosp12自带了模拟器的)

    1. 单独下载,内核源码有很多版本,比如:
    2. common是通用的Linux内核、msm是用于使用高通MSM芯片的Android设备
    3. goldfish是用于Android模拟器的内核源码
    4. 进去aosp_12目录的kernel目录下:cd aosp_12 & cd kernel
    5. git clone <https://aosp.tuna.tsinghua.edu.cn/kernel/goldfish.git>
    6. cd goldfish
    7. 查看所有git分支:git branch -a
    8. 选择goldfish3.4版本:git checkout remotes/origin/android-goldfish-3.4

3. 编译源码

3.1 准备编译环境

  1. 安装 open-jdk8
    1. sudo apt-get update
    2. sudo apt-get install openjdk-8-jdk
  2. 安装第三方依赖库
    1. sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip libncurses5

3.2 给Ubuntu增加虚拟内存

  1. 需要增加虚拟内存的原因
    1. 编译android12至少需要16G以上的内存,如果你给Ubuntu的内存16G以上的,可能就不需要增加虚拟内存了
    2. 不然编译会报错了,提示内存不够。Exception in thread “main” java.lang.OutOfMemoryError: Java heap space
  2. 如何查看虚拟内存交换空间
    1. 首先查看是否已经存在交换空间:free -m
    2. 会列表内存空间大小,交换区空间大小,默认有2G大小的swap交换空间
    3. 查看swap详情:swapon -s
    4. 可以看到默认的swap是存放在根目录的swapfile文件
    5. 打开ubuntu桌面“文件”->点击其他位置->点击计算机 即可查看到
    6. cd / & ls -a 也可以查看到swapfile文件
  3. 已存在swap交换空间的做法
    1. 停用交换文件:sudo swapoff /swapfile
    2. 删除文件:sudo rm /swapfile
    3. 新建新的swap空间,以32G为例:sudo fallocate -l 32G /swapfile
    4. 查看文件信息:ls -lh /swapfile
    5. 设置文件权限:sudo chmod 600 /swapfile
    6. 挂载swapfile文件:sudo mkswap /swapfile
    7. 激活启用:sudo swapon /swapfile
    8. 再次查看内存使用情况以及交换空间情况:free -m
    9. 把交换信息写入系统配置,不然Ubuntu重启后以上配置swap空间工作得重新做
      1. sudo vi /etc/fstab
      2. 最后一行加入(如有就省略不加):/swapfile swap swap defaults 0 0
      3. 按ESC键,接着:wq(英文冒号+wq)保存退出
    10. 再次查看内存使用情况以及交换空间情况:free -m
    11. 还有错误后面讲解,还需要告诉Android编译系统怎么使用上这块虚拟交接空间!!

3.3 编译源代码

  1. 初始化环境

    1. 进去源码目录:cd aosp_12
    2. 导入构建脚本环境:source build/envsetup.sh
    3. 编译前删除build文件夹,和make cleanrm -rf out/一样:make clobber
  2. 选择编译目标

    1. 列出选择编译目标:lunch
    2. 然后输入对应的数字或者名称确定编译目标
    3. 只有在source build/envsetup.sh之后才能执行lunch,否则报错
    4. 所以编译前首次要做的基本都是先执行一次source build/envsetup.sh
  3. 开始编译

    1. 这里我们不直接选序号了,直接lunch带上目录:lunch sdk_phone_x86_64
    2. sdk_phone_x86_64可以从\aosp_12\build\make\target\product目录下找到
    3. sdk_phone_x86_64是带有手机模拟器的,aosp_x86_64在android12之后是不带模拟器的
    4. 开始真正编译了:make -j4
  4. 解决OOM内存不足的问题

    1. 创建了虚拟内存,为什么还会报OOM错误?
      1. 因为编译的时候这个虚拟内存根本就没有被利用到。
      2. make -j4 后新开一个cmd窗口执行 top 命令,可以查看KiB Swap大小确认是否用上
    2. 解决方法就是让编译的时候使用上我们的虚拟内存
      1. 第一步,终端输入命令:sudo vi /etc/sysctl.conf
      2. 最后面添加,表示内存不足1G启动Swap:vm.min_free_kbytes=1024000
      3. 具体设置多少才启动Swap,根据自己分配给ubuntu内存情况决定,我的ubuntu内存8G
      4. 保存退出,然后重启ubuntu
      5. 第二步,找到 aosp_12/build/soong/java/droidstubs.go 文件,双击打开
      6. 搜索“cmd.BuiltTool("metalava")”定位到代码处
      7. 新加语句:Flag("-J-Xmx6114m").
      8. 保存退出,然后再次编译,最后应该能成功。过程中遇到什么问题再看情况解决吧。

3.4 模拟器运行

  1. ERROR: x86_64 emulation currently requires hardware acceleration
    1. 模拟器需要硬件加速,我使用的虚拟机是VMware workstation
    2. 解决参考:https://blog.csdn.net/mvp_Dawn/article/details/107678057
  2. Ubuntu无法启动提示:此平台不支持虚拟化的 Intel VT-x/EPT
    1. https://blog.csdn.net/m0_62571257/article/details/124102636

3.5 其他问题记录

3.6 感谢

  1. 参考连接
    1. https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/
    2. http://liuwangshu.cn/framework/aosp/1-install-ubuntu.html
    3. http://liuwangshu.cn/framework/aosp/2-download-aosp.html
    4. https://www.jianshu.com/p/53941de91c77
posted @ 2024-03-13 11:56  yongfengnice  阅读(80)  评论(0编辑  收藏  举报