来,一起修改Android源码

本博客针对MAC OS系统,介绍编译Android源码的全流程。包括准备工作,如预留磁盘、新建磁盘映像;下载源码,可从Google官方或科大镜像初始化;编译环节,涉及环境初始化、版本选择及不同类型编译;烧录操作;还罗列了常见问题及解决办法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 准备工作

  • 最好准备一套Ubuntu的系统. 但是本教程只针对MAC OS
  • 预留200G+的磁盘
  • 新建磁盘映像

Android编译源码需要在区分大小写的磁盘中, 而MACOS默认的磁盘是不区分大小写的, 所以需要在MAC的磁盘工具中新建一块磁盘映像, 这一点很重要.

2 下载

2.1 安装repo工具

Repo是一款Google原来管理Android源码的工具. 我们第一步是要下载repo
下载并修改执行权限, 下载的到目录自选:

curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

然后添加到环境变量中

vim .bash_profile
然后添加 export PATH=${PATH}:/Volumes/Data/05.android_source/bin;
保存后执行 souce ~/.bash_profile

2.2 从Google官方进行初始化操作

如果你可以翻墙, 我还是建议你直接从Google中下载 命令如下:

repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1

-b 之后的部分是要下载的Android版本, 可以从下面链接中找到你要下载的版本
https://source.android.com/source/build-numbers.html#source-code-tags-and-builds

当然, 你直接执行上面很可能不成功, 没有关系, 可以看2.3章节

2.3 从科大镜像上初始化

修改repo文件
我们找到
命令如下

repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-4.0.1_r1
## 如果提示无法连接到 gerrit.googlesource.com,可以编辑 ~/bin/repo,把 REPO_URL 一行替换成下面的:
## REPO_URL = 'https://gerrit-googlesource.proxy.ustclug.org/git-repo'

2.4 下载

初始化成功后, 执行下面命令就可以下载了

repo sync -c -j8

上面命令中-c可以忽略部分tag信息, -j8是指开8个子线程来下载, 你也可以-j4等等

2.5 做一点黑科技提高下载效率

2.4那一步是很可能会因为网络问题等等原因失败, 所以我们可以做一点黑科技去提高下载速度;
我们repo init命令执行成功后, 会在执行的根目录生成一个.repo的隐藏目录, 我们到这个目录下打开manifest.xml文件, 可以看到类似下面的代码:

<project path="external/bouncycastle" name="platform/external/bouncycastle" groups="pdk" />

上面一行代码是代表一个仓, 一个完整的AOSP源码是由约600个仓代码组成的. 例如我们的蓝牙模块源码是在下面这个仓中:

<project path="packages/apps/Bluetooth" name="platform/packages/apps/Bluetooth" groups="pdk-cw-fs,pdk-fs" />

我们写一个脚本来格式化出path字段的值, 输出到一个文件中:
格式化后的文件示例:

compatibility/cdd
cts
dalvik
developers/build
developers/demos
developers/samples/android
development
device/asus/fugu
device/asus/fugu-kernel
device/common
device/generic/arm64
device/generic/armv7-a-neon
device/generic/car

然后我们起很多个脚本分仓下载, 脚本如下:

# -*- coding: utf-8 -*-
import os

lines = []
for line in open("/Volumes/Data/02.projects/07.demo/autonrun/auto/out_1.xml"):
    if line.startswith("packages"):
        lines.append(line)

lines.reverse()
for line in lines:
    print line
    os.system("repo sync -c %s" % line)

你当然也可以把这个脚本改一下, 一个仓重复下载是没有问题的.
笔者大概共用了10个脚本左右. 成功的把下载时间从48个小时缩短到10个小时左右.

3 编译

3.1 根目录下调用source build/envsetup.sh来初始化编译环境

3.2 使用choosecombo命令来选择编译版本

3.3 全量版本编译

笔者建议首次编译的时候采用全量版本编译一次, 根目录执行命令:

make -j8

3.4 image文件编译

如果你要编译一个img镜像文件, 直接采用以下就好:

make systemimage -j8

3.5 单仓编译 ----该条请忽略, 我们暂时不会用到

如果你要编一个jar包或者so, apk包的话, 直接采用下面命令:

make Bluetooth -j8 //编译Bluetooth.apk
make framework -j8 //编译framework.jar

如果你修改了一个文件, 不知道要编译什么的话. 你就从你修改的文件目录依次向上找, 找到第一个Android.mk文件, 看下下面这个字段是什么:

LOCAL_MODULE := framework

编译这个一般来说就没有错了. 但是如果有多个LOCAL_MODULE字段, 那恭喜你中奖了, 自己阅读下Android.mk吧. 这里不赘述.

4 烧录

  • 执行adb reboot bootloader模式
  • 烧录out/target/product/bullhead目录下的img包
我们全编译版本后, 会看到这样几个包:
system.img recovery.img ramdisk.img ramdisk-recovery.img boot.img
我们可以先烧录下system.img(通常情况下,我们只会修改system.img下的文件)
fastboot flash system system.img
如果此时版本启动不成功, 我们再烧录其他文件

5 那些年,我们踩过的坑

错误如下:
GC overhead limit exceeded.
Try increasing heap size with java option '-Xmx<size>'.:
建议你每次编译前都执行下面代码: 4g可以改成6g
export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4g"
./prebuilts/sdk/tools/jack-admin kill-server
./prebuilts/sdk/tools/jack-admin start-server
  • webview zipException

在打包system.img的时候, 需要将webview.apk重签名. 而webview.apk比较特殊, 他不是以源代码的方式给过来的, 他是直接给的一个apk包. 然后打包时对apk包进行重签名.
而部分分支的webview.apk可能给错了, 导致重签名的时候爆出zipException. 要修复这个bug, 可以拉一下2.3章节中其他branch的源码, 只拉external/chromium-webview单仓就可以了. 将这个仓中所有东西覆盖原来的编译分支. 重新编译即可.

备注

本教程主要参考以下文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值