原生MacOS14+版本 android11下载、编译、修改、替换Framework层代码

一.前言

        我相信每一个android开发最终都是要走这一步的。想提升竞争力,不懂系统源码是不行的,尤其是做嵌入式开发,技术层级一直停留在上层app没有核心竞争力,有很多需求是不可能通过app层实现的。不要抱有幻想,您就学吧。

        至于为什么用MacOS,这个看个人习惯,主要是Mac搞开发很舒服,我个人已经完全习惯使用Mac系统了。但是这里还是要说一下,编译安卓源码最好还是用linux,也不难,装个虚拟机,弄个Ubuntu系统。而且MacOS最高编译到android12.0,再高就只能用linux系统去编译了。那么问题来了,我为啥非要用原生MacOS编译呢?其实就是有点懒,省的左右划系统了,哈哈,不过哪个系统编译都大同小异,Mac反而坑多一些,所以专门针对原生MacOS开一篇文。

二.准备工作

        终极无敌强烈建议准备一块质量好点的外接移动硬盘,500G+上不封顶,未来可以打造一个移动工作站!毕竟Mac的本机硬盘太值钱了,懂得都懂。

        其他的就是一些基本的开发环境,能搞framework层开发的兄弟肯定也是老手了,什么clang,c++编译环境该有的都有,不多说了,如果没有到时候看报错信息,缺啥装啥就行。

        将这块硬盘格式化(当然实在不想用移动硬盘也行,就是得用本机硬盘多分一个区),文件系统选择区分大小写的模式,我用的是Mac日志式区分大小写。(敲重点,别怪我没提醒你,一定要区分大小写!!别的系统如果不知道格式化成什么格式,请自行百度,只要是区分大小写就行)

        系统配置贴一下:

        别的没啥要求,最低要求16GB内存,其他的请对号入座就行,无非是快点慢点的事。

三.下载源码

这块其实网上教程很多,这里就简单说说。

1. 建立一个目录用来放repo工具

mkdir ~/bin

PATH=~/bin:$PATH

这块随意,爱放哪放哪。

2.下载repo

cd ~/bin
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o repo
chmod a+x ~/bin/repo   //赋予可执行权限

3.修改源码源

打开你刚才mkdir出的路径,里面有个repo文件,用文本工具打开,替换里面的下载源

//修改前
REPO_URL='https://gerrit.googlesource.com/git-repo'

//修改为(清华源)
REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'

4.开始下载

在你的移动硬盘上创建一个路径准备储存android源码,我的叫Android11_r40,cd进去

cd /Volumes/LiuQN_HD/Android11_r40

//你Git环境正常的话下面三句不用执行,会自动使用你的git账号的
sudo apt-get install git
git config --global user.name "ababab"
git config --global user.email "ababab@qq.com"

//初始化源码分支,我选的是android11 r40,这里看你需要,先去查你手头设备支持哪个版本,支持哪个用哪个
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-11.0.0_r40

//开始下载 -j4使用4线程,清华源官方建议用4,意思是最好不要太多,他们受不了。。。
repo sync -j4

5.喝茶,休息,坐等

看你的网络情况,我是大概两个半小时下载+checkout完成,成功后会提示repo sync has finished successfully.

至此源码就下载完毕了。

四.编译源码(只编译Framework)

重点来了,MacOS也是这一步坑最多,为了能让你一次成功,我在这一步需要单独列一下准备工作。

1.对应报错1

看一下你的/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs 路径下SDK版本,是不是没有10.15?如果没有,请你去GitHub - phracker/MacOSX-SDKs: A collection of those pesky SDK folders: MacOSX10.1.5.sdk thru MacOSX11.3.sdkA collection of those pesky SDK folders: MacOSX10.1.5.sdk thru MacOSX11.3.sdk - phracker/MacOSX-SDKsicon-default.png?t=N7T8https://github.com/phracker/MacOSX-SDKs

下载10.15版本SDK,MacOS14+应该只有14左右的SDK版本了。下载完10.15后(别下错了,是10.15,不是10.1.5),将其放入到刚才所说的SDKs下,然后在/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform路径下有一个Info.plist的文件,使用Xcode打开(双击默认Xcode打开),修改其中MinimumSDKVersion的值为10.15(很重要,网上很多资料都没有说到这一步)。修改这个文件你要动动脑子,它本身是没有权限修改的,我是复制了一份出来,然后给777权限,对着这个文件修改,改完以后覆盖回去。你要是有啥好办法都可以用,只要能修改成功就行。

2.对应报错2

修改源码的一些配置文件:

打开源码中external/v8/Android.bp,将里面的["-lrt"]去掉,改成[]。

3.对应报错3

在终端下:

launchctl limit  //其中maxfiles就是最大打开文件数量,这块和linux不同,默认是256
ulimit -n 2048    //临时设置最大打开文件数量,不需要永久设置,永久设置比较麻烦,需要重启,不建议搞

4.关闭dex优化(非必须,只是为了以后你替换framework.jar方便一些)

修改build/make/core目录下的board_config.mk和dex_preopt_config.mk文件。

//board_config.mk
WITH_DEXPREOPT := false


//dex_preopt_config.mk文件
WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY ?= false
//然后注释下面代码
 ifeq (,$(filter eng, $(TARGET_BUILD_VARIANT)))
    ifneq (true,$(WITH_DEXPREOPT))
      ifneq (true,$(WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY))
        $(call pretty-error, DEXPREOPT must be enabled for user and userdebug builds)
      endif
    endif
  endif

至此,准备工作完成,开始编译吧!

cd到你的android源码根目录

source build/envsetup.sh

lunch aosp_arm-eng

export SKIP_BOOT_JARS_CHECK=true

make -j8 framework   //看看你的CPU核心数,我建议是多少就-jX

然后就是等待,这里说明一下,我这个是只编译framework,是因为其实我们大多数时间,只会关心这一层的代码修改来实现我们绝大多数的功能,目前是没听说有什么需求是需要framework层以外的修改。这里只编译framework的话,大概10来分钟吧,喝喝茶就过去了,中途没有报错的话会提示#### build completed successfully (13:05 (mm:ss)) ####

至此我们的编译就成功啦,下面说一下Mac系统可能会遇到的几种报错(按顺序来的)

报错1:
Could not find a supported mac sdk: [\"10.10\" \"10.11\" \"10.12\" \"10.13\" \"10.14\" \"10.15\"]"
字面意义是找不到支持的MacSDK版本,这块着重说一点,首先要做的是去 https://github.com/phracker/MacOSX-SDKs 上下载对应的MacOS SDK,这里强烈推荐10.15(别下错了,是10.15,不是10.1.5),下载完成解压后,将其放入 /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs 路径下,到这一步不算完,我的系统是macOS 14.5 Sonoma,版本较高,如果直接编译的话还是会报错1。你需要去 /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform 
路径下找到一个文件Info.plist ,双击,默认用xcode打开,你会看到MinimumSDKVersion字段,我的系统默认是14,代表该系统最低支持的MacOS SDK版本,修改这个值,将其改为10.15,之后就可以启动编译,不会报错1了。(这个文件要求写入权限才能修改)
这里还有一个注意的点:根据Google官方文档,2021年6月22日之后的Android系统版本不支持在macOS系统上构建,我们只能构建之前的版本,或者之后发布的以前版本的补丁修复。目前测试最高只能编译到Android 12.0,Android 12.1编译不通过。其实说句实话,如果没有精神洁癖的话,做个ubuntu的虚拟机,然后虚拟机里装个完整的开发环境,以后想搞系统层开发直接打开虚拟机做就行了。

报错2:
external/v8/Android.bp:181:16: module "v8_bytecode_builtins_list_generator" variant "darwin_x86_64": host_ldlibs: Host library `-lrt` not available
MACOS属于阉割版的linux系统,没有-lrt,所以打开源码中external/v8/Android.bp文件,将里面的["-lrt"]去掉,改成[]即可。


报错3:
too many open files
查看&设置最大打开文件数
launchctl limit  //其中maxfiles就是最大打开文件数量,这块和linux不同,默认是256
ulimit -n 2048    //临时设置最大打开文件数量,不需要永久设置,永久设置比较麻烦,需要重启,不建议搞

五.源码导入到AndroidStudio中阅读、修改

这里我们需要生成AS的工程目录

网上很多教程说需要全编工程,其实是不需要的,因为android studio导入是根据其配置文件导入的(ipr),因此只需要用命令单独编译出idgen即可,如果你有编译过源码,只需要mm即可;如果没有编译过源码,用mma命令即可

source build/envsetup.sh

mmm development/tools/idegen

development/tools/idegen/idegen.sh

等生成好.ipa文件后,就可以使用AS打开源码项目了,最好给AS设置下内存,尽量大一些,否则容易卡死。

然后设置下Modle的SDK,咱们下的是android11(api 30),就用30版本的SDK。之后就可以愉快的阅读与修改源码了~修改完毕后,重新编译下,看终端输出的路径,会生成一个.jar包,就是编译好的framework。(重新编译就比较快了)

六.将编译的framework更新到设备中

先备份一下你的system目录,好吧,如果你不想备份整个目录,那就备份下你的framework.jar文件。

adb root && adb remount

adb push framework.jar /system/framework

//这一步要说一下,如果你编译的时候关闭了dex优化,则不需要这一步了,如果没关,必须删除,否则进不去系统
adb shell rm system/framework/arm/boot.art system/framework/arm/boot.oat system/framework/arm64/boot.art system/framework/arm64/boot.oat

adb reboot

顺利的话就可以愉快地使用你编译好的framework啦,这里还是重点说一下,你的设备是什么就要用支持源码版本,瞎替换就等着进不了系统然后看目录七吧...

七.如果目录六出问题导致设备系统无法正常启动的补救措施(针对RK3568)

这里只针对我使用的设备来记录下:

1.开箱,使用串口-USB调试工具,连接主板上的DEBUG串口。
2.开启串口调试工具,连接串口(这个时候系统虽然起不来,但是linux内核是存在的,可以理解为目前系统是一个阉割版的linux)。
3.输入密码(非必须)
4.su进入root权限模式
5.再次输入密码(非必须)
6.remount 一下,后面有用,不执行的话一会导入到system路径下会报只读错误
7.插入U盘(U盘中存放的是备份的framework.jar等)
8.想办法把U盘挂载到linux系统下,android系统一般情况下U盘插入后会在/dev/sdx或者是 /dev/block下,看你的系统,我的U盘会在block下。可以使用more /proc/partitions命令打印一下所有的块设备的名称与块大小,看一下块大小,跟你U盘一致的其实就是你的U盘,记录下这个块设备的名称,我的U盘插入后会显示sdc,下面有个sdc1(sdc是你的U盘,sdc1是第一个分区),这个是后面要用到的名称。随便找个路径,比如/mnt下,mkdir test,创建个路径作为挂载点,然后执行挂载,mount /dev/block/sdc1 /mnt/test,至此,U盘挂载成功,在/mnt/test 下执行ls,可以看到你U盘中的东西了。
9.把备份的文件重新覆盖回去 cp /mnt/test/framework.jar /system/framework (cp 文件源 目标路径),至此,大功告成,reboot重启一下就行了(如果没有执行步骤6的话,会报错: Read-only file system)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值