一、ASOP源码下载
具体可以参考我之前发布的文章
二、下载相关驱动包
这一步很关键,关系到编译后的镜像能否刷入后运行
下载链接:Nexus 和 Pixel 设备的驱动程序二进制文件
如下图所示,将两个驱动程序上传到Ubuntu服务器,并进行解压,得到两个脚本:
下载解压后会有两个脚本文件,运行后输入I ACCEPT就会得到一个vendor文件夹的文件夹
三、AOSP源码编译
首先加载配置文件,然后选择机型
source build/envsetup.sh
lunch aosp_walleye-userdebug
这里直接输入lunch就能看到可以编译的全部机型,然后选择对应的机型就行
然后就直接
make -j6
如果期间有什么报错可以百度,修复后,直接make -j6继续运行就行。
经过漫长的等待,6个小时,终于成功了
[ 99% 101428/101980] //art/build/apex:art-check-debug-apex-gen generate art-check-debug-apex-gen.dummy
--bitness=auto, trying to autodetect. This may be incorrect!Detected multilib
[100% 101980/101980] Target vbmeta image: out/target/product/walleye/vbmeta.img#### build completed successfully (05:52:50 (hh:mm:ss)) ####
编译之后的输入镜像文件,其所在路径为"/out/target/product/walleye"
四、刷入镜像
1.打开OEM开关
先点击设置—关于手机----版本号七次—开发者选项—打开OEM解锁(这步必须可以上网,否则打不开)
2.启动进入fastboot模式
方法1:
adb reboot bootloader
方法2:
使用下图的快捷键,我的手机Pixel2 就是音量减键和电源键
成功fastboot模式进入,如下图:
3.解锁手机
对于新款设备(2015 年及之后发布的设备)
fastboot flashing unlock
对于老款设备(2014 年及之前发布的设备)
fastboot oem unlock
解锁确认界面,如下图:
4.刷机
cd out/target/product/walleye
fastboot flashall -w
成功进入桌面,如下图:
5.windows挂载 Ubuntu服务器的情况
在进行刷机时,需要设置环境变量ANDROID_PRODUCT_OUT。 如果是windows 需要指向其编译机器下的镜像输出目录。要想实现共享,需要在Ubuntu Server上安装和配置samba服务器。
1.在windows中,将服务器编译输出目录,映射为本地文件夹,编译访问
2.设置Windows环境变量
5.刷入部分镜像
由于常常修改的都是System镜像部分内容,但是编译出来的System有两个部分system.img和system_other.img使用这里就讲一讲System一个如何单独刷入进去。
于Android8之后采用A/B更新, 所以有2套分区, 刷分区方式和以往不同:
fastboot flash system system.img
fastboot flash system_a system_other.img
fastboot set_active b
fastboot reboot
五、添加GMS服务
GMS是Google Map/Chrome/Youtube等Google软件,是Google私有的套件。只有与Google签订合同的手机厂商可以预加载GMS。因此,虽然我们编译AOSP是Android官方发布,但不会包含GMS预加载。
理论上,Google为了同时保持开放性和服务可靠性,可以说是放水了。它让解锁后的手机可以安装GMS到Android系统。而重点是“解锁后”,所以Google不会告你侵权,只要不是预装在市售ROM就可以。于是Open GAPP计划就产生了,它让第三方ROM可以使用GMS及其服务。Open Gapps官网
OpenGapps也有教你如何把GMS整合进整个源代码https://github.com/opengapps/aosp_build
1.修改manifest.xml
找到你的清单文件.repo\manifests\default.xml,并在末尾添加以下内容:
<remote name="opengapps" fetch="https://github.com/opengapps/" />
<remote name="opengapps-gitlab" fetch="https://gitlab.opengapps.org/opengapps/" /><project path="vendor/opengapps/build" name="aosp_build" revision="master" remote="opengapps" /><project path="vendor/opengapps/sources/all" name="all" clone-depth="1" revision="master" remote="opengapps-gitlab" /><!-- arm64 depends on arm -->
<project path="vendor/opengapps/sources/arm" name="arm" clone-depth="1" revision="master" remote="opengapps-gitlab" />
<project path="vendor/opengapps/sources/arm64" name="arm64" clone-depth="1" revision="master" remote="opengapps-gitlab" /><project path="vendor/opengapps/sources/x86" name="x86" clone-depth="1" revision="master" remote="opengapps-gitlab" />
<project path="vendor/opengapps/sources/x86_64" name="x86_64" clone-depth="1" revision="master" remote="opengapps-gitlab" />
2. 设置所需的OpenGapps变体
修改文件:device/google/muskie/aosp_walleye.mk,将:
PRODUCT_RESTRICT_VENDOR_FILES := owner
该为
PRODUCT_RESTRICT_VENDOR_FILES := false
否则在编译时会发生错误:
error: Error: Product "aosp_walleye" cannot have overlay in vendor tree:...
再修改文件:device/google/wahoo/device.mk,在文件最后加入
GAPPS_VARIANT := stock
$(call inherit-product, vendor/opengapps/build/opengapps-packages.mk)
编译AOSP时,就会相应vendor/opengapps/build/opengapps-packages.mk将Open Gapps编入system.img中
3.修改原始代码
修改frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -6001,8 +6001,8 @@ public class WindowManagerService extends IWindowManager.Stub@Overridepublic void setShelfHeight(boolean visible, int shelfHeight) {
- mAmInternal.enforceCallerIsRecentsOrHasPermission(android.Manifest.permission.STATUS_BAR,
- "setShelfHeight()");
+ //mAmInternal.enforceCallerIsRecentsOrHasPermission(android.Manifest.permission.STATUS_BAR,
+ // "setShelfHeight()");synchronized (mWindowMap) {getDefaultDisplayContentLocked().getPinnedStackController().setAdjustedForShelf(visible,shelfHeight)
把setShelfHeight所需要的权限移除,否则刷入ROM之后Pixel Launcher会因权限不足发生错误。
4.安装git LFS并拉入所有依赖项
sudo apt-get install git-lfs
git lfs install
repo forall -c git lfs pull
国内因为网络问题,建议将源换成Gitee,重新拉取代码
.repo\manifests\default.xml
<remote name="opengapps" fetch="https://gitee.com/mirrors_opengapps" />
<remote name="opengapps-gitlab" fetch="https://gitlab.opengapps.org/opengapps/" />
<project path="vendor/opengapps/build" name="aosp_build" revision="master" remote="opengapps" />
<project path="vendor/opengapps/sources/all" name="all" clone-depth="1" revision="master" remote="opengapps-gitlab" />
<!-- arm64 depends on arm -->
<project path="vendor/opengapps/sources/arm" name="arm" clone-depth="1" revision="master" remote="opengapps-gitlab" />
<project path="vendor/opengapps/sources/arm64" name="arm64" clone-depth="1" revision="master" remote="opengapps-gitlab" />
<project path="vendor/opengapps/sources/x86" name="x86" clone-depth="1" revision="master" remote="opengapps-gitlab" />
<project path="vendor/opengapps/sources/x86_64" name="x86_64" clone-depth="1" revision="master" remote="opengapps-gitlab" />
手动同步下,取决于你的网络,大约要下载20GB的文件
cd /vendor/opengapps/sources
for d in ./*/ ; do (cd "$d" && git lfs pull); done
最后别忘了重新同步下仓库
repo sync -c
5.重新编译及刷机
再下make之后,重新刷机,结果如下:
六、可以会遇到的问题
问题:
__populate_fs: Could not allocate block in ext2 filesystem while writing file “libLLVM_android.so”
e2fsdroid: Could not allocate block in ext2 filesystem while populating file system
解决:
从提示的错误来看,应该是编译设置中分配给systemimage的镜像太小的问题
找到设置的文件:device/XXX/XXX_common/BoardConfig.mk,pixel2的路径为"\device\google\wahoo\BoardConfig.mk"
修改BOARD_SYSTEMIMAGE_PARTITION_SIZE := 2684354560为BOARD_SYSTEMIMAGE_PARTITION_SIZE := 4026531840
问题:
执行fastboot flashall -w时
Sending sparse ‘system_a’ 1/3 (519292 KB) OKAY [ 45.361s]
Writing ‘system_a’ OKAY [ 0.001s]
Sending sparse ‘system_a’ 2/3 (522280 KB) FAILED (remote: ‘Error flashing partition.’)
fastboot: error: Command failed
解决:
刷机包不完整,仓库更新以后之后手动同步下repo sync仓库后全编再试
附录:编译后各个镜像的功能介绍
名称 | 作用 |
---|---|
ramdisk.img | ramdisk 为内存文件系统,是一个最小型文件系统, 在内核启动的时候会将其作为根文件系统进行挂,文件实际为 gzip 文件,可以直接解压 |
boot.img | boot.img 包含内 Linux 内核镜像 zImage 和根文件系统 ramdisk 文件,镜像基本构成为:头部,内核,ramdisk 镜像 |
dtbo.img | dtb overlay, 叠加 DT。由原始设计制造商 (ODM)/原始设备制造商 (OEM) 提供的设备专用配置 |
system.img | system 镜像会提供 android 所需要的命令,内置 app,运行动态库,以及系统配置文件, 在system-as-root特性中, system 镜像会被直接挂载成根目录下。 |
vendor.img/odm.img/oem.img/product.img | 包含有厂商私有的可执行程序、库、系统服务和 app 等。可以将此分区看做是 system 分区的补充,厂商定制 ROM 的一些功能都可以放在此分区,odm 是贴牌厂商定制镜像, oem 是代工厂商定制镜像, |
super.img | 自 Android Q(10.0)以后,系统支持动态分区(dynamic partition),它将多个系统只读分区(包括 system、product、vendor、odm 或者其他厂商自定义分区)合并为一个 super 分区。物理分区只有 super 分区的概念,而没有 system等分区 |
userdata.img | 用户存储空间。一般新买来的手机此分区几乎是空的,用户安装的 app 以及用户数据都是存放在此分区中。用户通过系统文件管理器访问到的手机存储(sdcard)即此分区的一部分,是通过 fuse 或 sdcardfs 这类用户态文件系统实现的一块特殊存储空间。 |
vbmeta.img | 验证启动(Verified Boot)是 Android 4.4 开始引入的一个新的安全功能,作用是在系统启动时校验分区是否被篡改或者发生过改动,比如用户使用 root 软件强行植入 su 文件,但最后删除了 su, 这种情况也能检测出来。一旦检验不过,系统就不能正常启动,并且有相关的图文提示, 简单描述做法就是在启动过程中增加一条校验链,即 ROM code 校验 BootLoader,确保 BootLoader 的合法性和完整性,BootLoader 则需要校验 bootimage,确保 Kernel 启动所需 image 的合法性和完整性,而 Kernel 则负责校验 System 分区和 vendor 分区。 |
recovery.img | recovery 分区的镜像,一般用作系统恢复和升级,在 A/B 设备中,升级就不放在 recovery 中了。包含 recovery系统的 kernel 和 ramdisk。如果 bootloader 选择启动 recovery 模式,则会引导启动此分区的 kernel 并加载 ramdisk,并启动其中的 init 继而启动 recovery 程序,至此可以操作 recovery 模式功能(主要包括 OTA 升级、双清等)。boot.img 中 ramdisk 里 的 init.rc 位 于system/core/init/init.rc, 而 recovery.img 中 ramdisk 里 的 init.rc 位 于bootable/recovery/etc/init.rc |
cache.img | 主要用于缓存系统升级 OTA 包等。双清就是指对 userdata 分区和 cache 分区的清理。在 A/B 设备中,OTA 包就不需要存储在此。 |