美文网首页
Android10源码刷入Pixel2以及整合GMS

Android10源码刷入Pixel2以及整合GMS

作者: 龙之叶 | 来源:发表于2023-09-02 16:36 被阅读0次

    一、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 包就不需要存储在此。

    相关文章

      网友评论

          本文标题:Android10源码刷入Pixel2以及整合GMS

          本文链接:https://www.haomeiwen.com/subject/eikzmdtx.html