<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>ARM64 on NCJ Tech Blog</title>
    <link>https://blog.chong-zeng.com/tags/arm64/</link>
    <description>Recent content in ARM64 on NCJ Tech Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <lastBuildDate>Tue, 17 Mar 2020 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://blog.chong-zeng.com/tags/arm64/rss.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>树莓派4打造旁路路由</title>
      <link>https://blog.chong-zeng.com/posts/2020-03-17_openwrt_pi/</link>
      <pubDate>Tue, 17 Mar 2020 00:00:00 +0000</pubDate>
      <guid>https://blog.chong-zeng.com/posts/2020-03-17_openwrt_pi/</guid>
      <description>相关仓库： iamNCJ/Openwrt-Pi4
最近尝试改造自己的路由器，无奈家里的路由器都比较老，而且没有USB插口，不是很好刷 OpenWrt ，于是想到直接将树莓派作为自己的旁路路由，在树莓派上运行 Openwrt 系统，来实现如全局代理等功能。
首先尝试官网的 snapshoot 版本，感觉效果一般，然后看网上有人说在 Docker 里运行 OpenWrt ，测试感觉能用，但是非常不稳定，于是索性自己编译一个。
使用的上游是 lede 大的固件，然后针对树莓派4，直接使用64位系统，榨干性能，开启了 Docker 支持，这样其他的功能基本还是不受影响（我已经将所有树莓派上自己用的的服务基本都容器化了），再加上现在的树莓派4已经有了千兆网口，整个体验效果是非常的好。
编译的时候本地编译，毕竟 9700K ，但是出于好玩尝试了网上的 GitHub Actions 编译脚本，感觉这个脚本马马虎虎，而且没有办法增量编译，所以只适合喜欢薅羊毛的人，有条件的话还是本地编译比较好。
现在家里的网络舒服多了，挂一张内网的测速，librespeed speedtest，千兆网还是很稳的。（librespeed 在树莓派上最好从源码 Dockerfile 自己build镜像，linuxserver 提供的 armv8 镜像非常不稳定）
本地互联网和境外代理也都很稳
最后本着开源精神，将树莓派4专用的 OpenWrt 固件的编译 .CONFIG 文件以及编译好的镜像开源，想使用可以点击这里查看配置或直接下载镜像安装，欢迎PR。</description>
      <content:encoded><![CDATA[<blockquote>
<p>相关仓库： <a href="https://github.com/iamNCJ">iamNCJ</a>/<strong><a href="https://github.com/iamNCJ/Openwrt-Pi4">Openwrt-Pi4</a></strong></p>
<p><a href="https://github.com/iamNCJ/Openwrt-Pi4/stargazers"><img loading="lazy" src="https://img.shields.io/github/stars/iamNCJ/Openwrt-Pi4.svg?label=Stars&amp;style=social" alt="Stars"  />
</a> <a href="https://github.com/iamNCJ/Openwrt-Pi4/network/members"><img loading="lazy" src="https://img.shields.io/github/forks/iamNCJ/Openwrt-Pi4.svg?label=Fork&amp;style=social" alt="Forks"  />
</a></p>
</blockquote>
<p>最近尝试改造自己的路由器，无奈家里的路由器都比较老，而且没有USB插口，不是很好刷 OpenWrt ，于是想到直接将树莓派作为自己的旁路路由，在树莓派上运行 Openwrt 系统，来实现如全局代理等功能。</p>
<p>首先尝试官网的 snapshoot 版本，感觉效果一般，然后看网上有人说在 Docker 里运行 OpenWrt ，测试感觉能用，但是非常不稳定，于是索性自己编译一个。</p>
<p>使用的上游是 <a href="https://github.com/coolsnowwolf/lede">lede 大的固件</a>，然后针对树莓派4，直接使用64位系统，榨干性能，开启了 Docker 支持，这样其他的功能基本还是不受影响（我已经将所有树莓派上自己用的的服务基本都容器化了），再加上现在的树莓派4已经有了千兆网口，整个体验效果是非常的好。</p>
<p>编译的时候本地编译，毕竟 9700K ，但是出于好玩尝试了网上的 <a href="https://github.com/P3TERX/Actions-OpenWrt">GitHub Actions 编译脚本</a>，感觉这个脚本马马虎虎，而且没有办法增量编译，所以只适合喜欢薅羊毛的人，有条件的话还是本地编译比较好。</p>
<p>现在家里的网络舒服多了，挂一张内网的测速，librespeed speedtest，千兆网还是很稳的。（librespeed 在树莓派上最好从源码 Dockerfile 自己build镜像，linuxserver 提供的 armv8 镜像非常不稳定）</p>
<p><img loading="lazy" src="/old-pics/illustrations/2020-03-17_Openwrt/1.png" alt=""  />
</p>
<p>本地互联网和境外代理也都很稳</p>
<p><img loading="lazy" src="/old-pics/illustrations/2020-03-17_Openwrt/3.png" alt="Local"  />
</p>
<p><img loading="lazy" src="/old-pics/illustrations/2020-03-17_Openwrt/2.png" alt="Proxy"  />
</p>
<p>最后本着开源精神，将树莓派4专用的 OpenWrt 固件的编译 <code>.CONFIG</code> 文件以及编译好的镜像开源，想使用可以<a href="https://github.com/iamNCJ/Openwrt-Pi4">点击这里</a>查看配置或直接下载镜像安装，欢迎PR。</p>
]]></content:encoded>
    </item>
    <item>
      <title>小米Mix 2s多系统安装教程</title>
      <link>https://blog.chong-zeng.com/posts/2020-01-26_multirom_mix2s/</link>
      <pubDate>Sun, 26 Jan 2020 00:00:00 +0000</pubDate>
      <guid>https://blog.chong-zeng.com/posts/2020-01-26_multirom_mix2s/</guid>
      <description>折腾了两天，总算成功实现了安卓手机的多系统，在此记录一下，权且做一个教程，给其他热爱折腾的人做一点参考。
首先要说明的是安装双系统乃至多系统，尤其是在手机上，对于很多人来说绝对是非常鸡肋的，而且安装的过程肯定会造成原先数据的丢失等等，安装之后也不能保证所有功能的正常（比如视频），但是对于爱玩机的人来说，能够经常体验不同的ROM还是很重要的。我之所以想安装多系统，就是因为发现了两个都让我非常喜欢的ROM——Pixel Experience 和 Simplicity。这两个ROM可谓是两个极端，一个是纯原生安卓的体验，手感非常的好，吊打国内的各大ROM（这才是安卓啊），另一个则是浓厚的极客气息（自带Magisk、Busybox，以及各种底层破解……），在分别体验了两个ROM之后，我发现对它们都是爱不释手。小孩子才做选择，成年人全都要，多启动的想法自然而然地萌生了出来。
我的设备是Xiaomi Mix 2s (polaris) 国行6+64GB，其他设备的用户本教程可能并不适用，仅供参考
免责声明：本人不对任何教程中的操作造成的数据丢失以及设备损坏负责，请在操作前做好数据备份
一、常见方案 折腾前当然要看看有啥现成的轮子了，大致研究了一下界内的方案，基本都在XDA的这篇文章里讲到了，这里简单概括一下。
MultiROM 官方Wiki
作用于bootloader之后，可以用于引导不同的系统（含Linux），XDA称这是“已知的最好的多系统解决方案”。
https://forum.xda-developers.com/xiaomi-mi-mix-2s/how-to/multirom-multirom-polaris-t3957428
DualBoot Patcher 官网
非常有名的安卓引导工具，XDA高级成员，陈小龙大牛开发&amp;amp;&amp;amp;维护，但是在安卓10到来之后，开发者停止维护了。主要是由于新版安卓在架构上的一些调整造成了开发的困难。但是我想要安装Pixel Experience正是基于安卓10的，所以这个方案不行。
GRUB for Android GRUB是x86架构上知名的引导程序，那么GRUB4Android顾名思义也是一个原生bootloader的替代品。现在这个项目已经衍生为了EFIDroid，但是看了一下官网最后一次更新是2016年，现在貌似也没有对Mix 2s进行适配，所以就放弃了。
综合以上，我最后选择MultiROM作为多系统的解决方案。
二、安装MultiROM版TWRP 在安装ROM之前，我们首先需要对引导程序进行一些处理。
1. 解锁BootLoader BootLoader是嵌入式设备在操作系统内核运行之前运行的一段程序，它相当于控制了整个启动的大方向，厂商往往会在BootLoader里加入一些检查代码，限制非官方的系统的启动。因此如果想要进行刷机、root等操作，必须将厂商的限制解除。
由于BootLoader与硬件强绑定，因此必须通过厂商的官方途径（或者万能的淘宝）进行解锁。小米官方提供了解锁方式，傻瓜操作，在此略过。
2. 刷入Recovery 安卓刷机一般使用TWRP，这是一个开源的第三方Recovery，可以用于替换官方的Recovery，从而更方便地进行刷机等操作。
刷入的过程非常简单，重启手机进入fastboot模式之后，连接手机与电脑，使用ADB进行以下操作：
fastboot devices # 检查设备连接状态 fastboot flash recovery your-TWRP.img # 将TWRP烧入Recovery 现在，TWRP已经在你的手机的Recovery分区下了。
3. 安装MultiROM补丁 但是原版的TWRP并不支持多系统，因此我们需要安装TWRP之后打补丁，并替换MultiROM专用的TWRP版本。
而且因为嵌入式的强硬件相关性，我们需要根据自己的设备选择专用的MultiROM补丁，很幸运的是Mix 2s已经有人进行了适配，所以我们直接用轮子就好了。
我们打开相关页面，下载multirom_14-08-19.zip和recovery_3.3.1_17-08-19.img两个文件，储存在手机根目录或者U盘里，然后重启手机进入Recovery模式。
使用TWRP先刷入MultiROM补丁到原始ROM（操作与刷入Magisk类似，使用Install ZIP），再将recovery分区替换为MultiROM专用TWRP（使用Install Image）。
完成后再次重启手机，即可看到MultiROM已经安装完毕，此时理论上就可以使用MultiROM安装第二个ROM了。
三、安装第二个ROM 此时进入Recovery分区，也能通过点击右上角的菜单进入MultiROM的配置菜单
点击Add ROM，ROM类型选择Android，安装地点选择内置储存Internal Storage
选择你想要安装的ROM即可。
教程结束。显然不会这么简单，如果你安装的两个ROM都是安卓9及以下，而且是比较轻量化的ROM或者官方系统，那么以上应该就够了。但是如果你是安装安卓10或者含有root或者大量魔改的ROM，那么你的工作，才刚刚开始……
四、安装Pixel Experience 根据XDA论坛上提供MultiROM的大神的介绍，安卓10需要作为主ROM进行安装，具体可能与安卓10的加密机制有关。（具体原因尚不清楚，但是在安装完基于安卓10的系统后，文件系统是被加密的，需要安装MultiROM的补丁才能禁用掉加密）。</description>
      <content:encoded><![CDATA[<blockquote>
<p>折腾了两天，总算成功实现了安卓手机的多系统，在此记录一下，权且做一个教程，给其他热爱折腾的人做一点参考。</p>
</blockquote>
<p>首先要说明的是安装双系统乃至多系统，尤其是在手机上，对于很多人来说绝对是非常鸡肋的，而且安装的过程肯定会造成原先数据的丢失等等，安装之后也不能保证所有功能的正常（比如视频），但是对于爱玩机的人来说，能够经常体验不同的ROM还是很重要的。我之所以想安装多系统，就是因为发现了两个都让我非常喜欢的ROM——<a href="https://download.pixelexperience.org/">Pixel Experience</a> 和 <a href="https://www.lt2333.com/">Simplicity</a>。这两个ROM可谓是两个极端，一个是纯原生安卓的体验，手感非常的好，吊打国内的各大ROM（这才是安卓啊），另一个则是浓厚的极客气息（自带Magisk、Busybox，以及各种底层破解……），在分别体验了两个ROM之后，我发现对它们都是爱不释手。小孩子才做选择，成年人全都要，多启动的想法自然而然地萌生了出来。</p>
<blockquote>
<p>我的设备是Xiaomi Mix 2s (polaris) 国行6+64GB，其他设备的用户本教程可能并不适用，仅供参考</p>
</blockquote>
<blockquote>
<p><strong>免责声明：本人不对任何教程中的操作造成的数据丢失以及设备损坏负责，请在操作前做好数据备份</strong></p>
</blockquote>
<h1 id="一常见方案">一、常见方案</h1>
<p>折腾前当然要看看有啥现成的轮子了，大致研究了一下界内的方案，基本都在<a href="https://www.xda-developers.com/dual-boot-on-android-a-power-users-holy-grail/">XDA的这篇文章</a>里讲到了，这里简单概括一下。</p>
<h2 id="multirom">MultiROM</h2>
<p><img loading="lazy" src="/old-pics/illustrations/2020.01.26.MultiROM/01.png" alt=""  />
</p>
<p><a href="https://github.com/Tasssadar/multirom/wiki">官方Wiki</a></p>
<p>作用于bootloader之后，可以用于引导不同的系统（含Linux），XDA称这是“已知的最好的多系统解决方案”。</p>
<p><a href="https://forum.xda-developers.com/xiaomi-mi-mix-2s/how-to/multirom-multirom-polaris-t3957428">https://forum.xda-developers.com/xiaomi-mi-mix-2s/how-to/multirom-multirom-polaris-t3957428</a></p>
<h2 id="dualboot-patcher">DualBoot Patcher</h2>
<!-- raw HTML omitted -->
<p><a href="https://dbp.noobdev.io/">官网</a></p>
<p>非常有名的安卓引导工具，XDA高级成员，陈小龙大牛开发&amp;&amp;维护，但是在安卓10到来之后，开发者停止维护了。主要是由于新版安卓在架构上的一些调整造成了开发的困难。但是我想要安装Pixel Experience正是基于安卓10的，所以这个方案不行。</p>
<h2 id="grub-for-android">GRUB for Android</h2>
<!-- raw HTML omitted -->
<p>GRUB是x86架构上知名的引导程序，那么GRUB4Android顾名思义也是一个原生bootloader的替代品。现在这个项目已经衍生为了<a href="http://efidroid.org/">EFIDroid</a>，但是看了一下官网最后一次更新是2016年，现在貌似也没有对Mix 2s进行适配，所以就放弃了。</p>
<p>综合以上，我最后选择MultiROM作为多系统的解决方案。</p>
<h1 id="二安装multirom版twrp">二、安装MultiROM版TWRP</h1>
<p>在安装ROM之前，我们首先需要对引导程序进行一些处理。</p>
<h2 id="1-解锁bootloader">1. 解锁BootLoader</h2>
<p>BootLoader是嵌入式设备在操作系统内核运行之前运行的一段程序，它相当于控制了整个启动的大方向，厂商往往会在BootLoader里加入一些检查代码，限制非官方的系统的启动。因此如果想要进行刷机、root等操作，必须将厂商的限制解除。</p>
<p>由于BootLoader与硬件强绑定，因此必须通过厂商的官方途径（<del>或者万能的淘宝</del>）进行解锁。小米官方提供了解锁方式，傻瓜操作，在此略过。</p>
<h2 id="2-刷入recovery">2. 刷入Recovery</h2>
<p>安卓刷机一般使用<a href="https://twrp.me/">TWRP</a>，这是一个开源的第三方Recovery，可以用于替换官方的Recovery，从而更方便地进行刷机等操作。</p>
<p>刷入的过程非常简单，重启手机进入fastboot模式之后，连接手机与电脑，使用ADB进行以下操作：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">fastboot devices
</span></span><span class="line"><span class="cl"><span class="c1"># 检查设备连接状态</span>
</span></span><span class="line"><span class="cl">fastboot flash recovery your-TWRP.img
</span></span><span class="line"><span class="cl"><span class="c1"># 将TWRP烧入Recovery</span>
</span></span></code></pre></div><p>现在，TWRP已经在你的手机的Recovery分区下了。</p>
<h2 id="3-安装multirom补丁">3. 安装MultiROM补丁</h2>
<p>但是原版的TWRP并不支持多系统，因此我们需要安装TWRP之后打补丁，并替换MultiROM专用的TWRP版本。</p>
<p>而且因为嵌入式的强硬件相关性，我们需要根据自己的设备选择专用的MultiROM补丁，很幸运的是Mix 2s已经有人进行了适配，所以我们直接用轮子就好了。</p>
<p>我们打开<a href="https://forum.xda-developers.com/xiaomi-mi-mix-2s/how-to/multirom-multirom-polaris-t3957428">相关页面</a>，下载<code>multirom_14-08-19.zip</code>和<code>recovery_3.3.1_17-08-19.img</code>两个文件，储存在手机根目录或者U盘里，然后重启手机进入Recovery模式。</p>
<!-- raw HTML omitted -->
<p>使用TWRP先刷入MultiROM补丁到原始ROM（操作与刷入Magisk类似，使用<code>Install ZIP</code>），再将recovery分区替换为MultiROM专用TWRP（使用<code>Install Image</code>）。</p>
<!-- raw HTML omitted -->
<p>完成后再次重启手机，即可看到MultiROM已经安装完毕，此时理论上就可以使用MultiROM安装第二个ROM了。</p>
<h1 id="三安装第二个rom">三、安装第二个ROM</h1>
<p>此时进入Recovery分区，也能通过点击右上角的菜单进入MultiROM的配置菜单</p>
<!-- raw HTML omitted -->
<p>点击<code>Add ROM</code>，ROM类型选择<code>Android</code>，安装地点选择内置储存<code>Internal Storage</code></p>
<!-- raw HTML omitted -->
<p>选择你想要安装的ROM即可。</p>
<!-- raw HTML omitted -->
<p><del>教程结束</del>。显然不会这么简单，如果你安装的两个ROM都是安卓9及以下，而且是比较轻量化的ROM或者官方系统，那么以上应该就够了。但是如果你是安装安卓10或者含有root或者大量魔改的ROM，那么你的工作，才刚刚开始……</p>
<h1 id="四安装pixel-experience">四、安装Pixel Experience</h1>
<p><del>根据XDA论坛上提供MultiROM的大神的介绍，安卓10需要作为主ROM进行安装，具体可能与安卓10的加密机制有关。（具体原因尚不清楚，但是在安装完基于安卓10的系统后，文件系统是被加密的，需要安装MultiROM的补丁才能禁用掉加密）。</del></p>
<p>后来测试发现安卓10测试版也是可以直接刷入的……，可能只是Pixel Experience必须作为主ROM安装，或者安卓10正式版不能作为次ROM安装。</p>
<p>总之安卓10（在我这儿我选择的是Pixel Experience）必须在一开始就安装，然后在重启手机完成初始化之后再打补丁（不然可能会再初始化时卡住）。</p>
<p>在检查安卓10可以正常启动，MultiROM工作正常后，我们就可以继续安装其他的ROM了。</p>
<h1 id="五魔改并安装其他rom">五、魔改并安装其他ROM</h1>
<h2 id="1-miui10">1. MIUI10</h2>
<p>MIUI是基于安卓9的（虽然小米修改安卓版本号为10.0.0，但是实际上还是9的底层）。</p>
<p>使用MIUI10开发版（版本号9.8.22），可以正常作为Secondary ROM安装，没有遇到大问题。</p>
<h2 id="2-simplicity">2. Simplicity</h2>
<p>首先尝试安装最新版的基于安卓10的Simpilicty，直接安装会触发<code>E1001: Failed to update system image.</code>的报错。</p>
<!-- raw HTML omitted -->
<p>然后尝试安装基于安卓9的旧版Simplicity，发现仍然会触发这个报错。考虑到Simplicity本质上就是对MIUI的破解，开始对旧版Simplicity的ROM进行魔改。</p>
<p>因为安卓的ROM安装过程是由<code>updater-script</code>脚本控制的，它位于<code>your-ROM.zip\META-INF\com\google\android</code>目录下。打开后发现官方能够直接作为第二系统刷入的ROM是按照<code>boot</code>、<code>system</code>、<code>vendor</code>、<code>firmware</code>的顺序进行patch的，而Simplicity是按照<code>boot</code>、<code>firmware</code>、<code>system</code>、<code>vendor</code>的顺序进行patch的，于是修改<code>updater-script</code>，将patch顺序进行调换。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1">## BEFORE</span>
</span></span><span class="line"><span class="cl">ui_print<span class="o">(</span><span class="s2">&#34;Patching boot image unconditionally...&#34;</span><span class="o">)</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">package_extract_file<span class="o">(</span><span class="s2">&#34;boot.img&#34;</span>, <span class="s2">&#34;/dev/block/bootdevice/by-name/boot&#34;</span><span class="o">)</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">ui_print<span class="o">(</span><span class="s2">&#34;Patching firmware images...&#34;</span><span class="o">)</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">package_extract_file<span class="o">(</span><span class="s2">&#34;firmware-update/dsp.img&#34;</span>, <span class="s2">&#34;/dev/block/bootdevice/by-name/dsp&#34;</span><span class="o">)</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">... <span class="c1"># details omitted</span>
</span></span><span class="line"><span class="cl">package_extract_file<span class="o">(</span><span class="s2">&#34;firmware-update/hyp.img&#34;</span>, <span class="s2">&#34;/dev/block/bootdevice/by-name/hyp_b&#34;</span><span class="o">)</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">show_progress<span class="o">(</span>0.600000, 250<span class="o">)</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">ui_print<span class="o">(</span><span class="s2">&#34;Patching system image unconditionally...&#34;</span><span class="o">)</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">block_image_update<span class="o">(</span><span class="s2">&#34;/dev/block/bootdevice/by-name/system&#34;</span>, package_extract_file<span class="o">(</span><span class="s2">&#34;system.transfer.list&#34;</span><span class="o">)</span>, <span class="s2">&#34;system.new.dat&#34;</span>, <span class="s2">&#34;system.patch.dat&#34;</span><span class="o">)</span> <span class="o">||</span>
</span></span><span class="line"><span class="cl">  abort<span class="o">(</span><span class="s2">&#34;E1001: Failed to update system image.&#34;</span><span class="o">)</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">ui_print<span class="o">(</span><span class="s2">&#34;Patching vendor image unconditionally...&#34;</span><span class="o">)</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">block_image_update<span class="o">(</span><span class="s2">&#34;/dev/block/bootdevice/by-name/vendor&#34;</span>, package_extract_file<span class="o">(</span><span class="s2">&#34;vendor.transfer.list&#34;</span><span class="o">)</span>, <span class="s2">&#34;vendor.new.dat&#34;</span>, <span class="s2">&#34;vendor.patch.dat&#34;</span><span class="o">)</span> <span class="o">||</span>
</span></span><span class="line"><span class="cl">  abort<span class="o">(</span><span class="s2">&#34;E2001: Failed to update vendor image.&#34;</span><span class="o">)</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">ui_print<span class="o">(</span><span class="s2">&#34; &#34;</span><span class="o">)</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">## AFTER</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Patch boot first</span>
</span></span><span class="line"><span class="cl">ui_print<span class="o">(</span><span class="s2">&#34;Patching boot image unconditionally...&#34;</span><span class="o">)</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">package_extract_file<span class="o">(</span><span class="s2">&#34;boot.img&#34;</span>, <span class="s2">&#34;/dev/block/bootdevice/by-name/boot&#34;</span><span class="o">)</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Patch system and vendor before firmware</span>
</span></span><span class="line"><span class="cl">ui_print<span class="o">(</span><span class="s2">&#34;Patching system image unconditionally...&#34;</span><span class="o">)</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">block_image_update<span class="o">(</span><span class="s2">&#34;/dev/block/bootdevice/by-name/system&#34;</span>, package_extract_file<span class="o">(</span><span class="s2">&#34;system.transfer.list&#34;</span><span class="o">)</span>, <span class="s2">&#34;system.new.dat&#34;</span>, <span class="s2">&#34;system.patch.dat&#34;</span><span class="o">)</span> <span class="o">||</span>
</span></span><span class="line"><span class="cl">  abort<span class="o">(</span><span class="s2">&#34;E1001: Failed to update system image.&#34;</span><span class="o">)</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">ui_print<span class="o">(</span><span class="s2">&#34;Patching vendor image unconditionally...&#34;</span><span class="o">)</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">block_image_update<span class="o">(</span><span class="s2">&#34;/dev/block/bootdevice/by-name/vendor&#34;</span>, package_extract_file<span class="o">(</span><span class="s2">&#34;vendor.transfer.list&#34;</span><span class="o">)</span>, <span class="s2">&#34;vendor.new.dat&#34;</span>, <span class="s2">&#34;vendor.patch.dat&#34;</span><span class="o">)</span> <span class="o">||</span>
</span></span><span class="line"><span class="cl">  abort<span class="o">(</span><span class="s2">&#34;E2001: Failed to update vendor image.&#34;</span><span class="o">)</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">ui_print<span class="o">(</span><span class="s2">&#34; &#34;</span><span class="o">)</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Patch firmware at last</span>
</span></span><span class="line"><span class="cl">ui_print<span class="o">(</span><span class="s2">&#34;Patching firmware images...&#34;</span><span class="o">)</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">package_extract_file<span class="o">(</span><span class="s2">&#34;firmware-update/dsp.img&#34;</span>, <span class="s2">&#34;/dev/block/bootdevice/by-name/dsp&#34;</span><span class="o">)</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">... <span class="c1"># details omitted</span>
</span></span><span class="line"><span class="cl">package_extract_file<span class="o">(</span><span class="s2">&#34;firmware-update/hyp.img&#34;</span>, <span class="s2">&#34;/dev/block/bootdevice/by-name/hyp_b&#34;</span><span class="o">)</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">show_progress<span class="o">(</span>0.600000, 250<span class="o">)</span><span class="p">;</span>
</span></span></code></pre></div><p>修改之后，即可正常安装，重启后能够进入系统，root等功能正常，安装成功。</p>
<h1 id="六体验与缺陷">六、体验与缺陷</h1>
<p>整体来讲，双系统的切换还算流畅，切换的成本不是很高。</p>
<p>作为主系统的Pixel Experience手感非常好，功能基本正常，但是每次启动的时候都要重新设置时间，双摄不能正常使用（未适配）。</p>
<p>作为次系统的Simplicity有各种极客功能，主题也被破解了，可以免费换自己喜欢的使用，内置的迅雷下载加速也被破解为付费模式，可以把家里带宽跑满。但是估计是由于MulitROM启动次系统的时候只切换部分挂载的原因，GPU或者DSP驱动似乎有些问题，导致视频解码有问题，视频无法正常播放（作为次系统的MIUI也有这个问题）。</p>
<p>整体来说，还是实现了一开始的目的，反正小米也不是日用主力机，Pixel主要是用手感和Google的全家桶（手动狗头），Simplicity主要就是为了下载奇怪的资源和一些ROOT功能（比如虚拟定位，再次狗头）。</p>
<p>当然折腾的过程也大致了解了一些安卓底层的东西，但是所知还是甚少，看来还是要多读书，多学习（狗头.jpg</p>
<hr>
<p>踩坑完毕</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
