Android10源码刷入Pixel2以及整合GMS

一、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
 
     @Override
     public 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 包就不需要存储在此。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容