搞机日常
[00:00.000]作词 : 新岛夕 [00:01.000]作曲 : ピクセルビー [00:02.000]编曲 : ピクセルビー [00:27.150]八方美人で 調子いいこと言って [00:27.150]八面玲珑地说着得意忘形的话 [00:32.750]理想話る 瞳はまっすぐ [00:32.750]高谈理想的眼神 是如此率真 [00:37.960]その気にさせるのは 上手いのに [00:37.960]明明擅长让别人产生期待 [00:41.800]実現できないね 結局 [00:41.800]结果最后 没有一个是实现的呢 [00:48.000]どうにかする きっと 死んでも守るから [00:48.000]总会有办法的 肯定 死也会保护你的 绝对 [00:56.770]絶対 一生懸命 やったふりして あきらめて [00:56.770]装做拼尽全力的样子 实际却悄然放弃 [01:08.390]やがて おとぎ話だけが取り残されて [01:08.390]最后 只剩下美好的童话徒留在原地 [01:13.590]ただ 恋心だけ取り残されて どこにも行けず [01:13.590]只有不变的恋心徒留在原地 无处可去 [01:21.650]たたずむ僕は 魔法使うよ 永遠なれ [01:21.650]只能伫立在原地的我 使用了魔法 将故事化作永远 [01:53.040]一生一度の恋だ ブラボー 君のいない [01:53.040]一生中唯一一次的相恋 多么美妙啊 [02:00.830]世界なんて ありえない 口にするたび [02:00.830]没了你的世界 无法想像 [02:06.370]どうして うしろめたいんだろう [02:06.370]可为什么每当你说这句话时 却在内疚呢 [02:13.680]永遠に愛する 死んでも離さない 君を [02:13.680]声称永远爱着我 就算死也不会离开我的你 [02:23.830]強く抱くしめるふりをして 遠ざかる [02:23.830]装作一副紧紧拥抱我的样子 实际却渐行渐远 [02:34.130]やがて恋心だけ取り残されて [02:34.130]最终 只有不变的恋心徒留在原地 [02:39.750]おとぎ話だけが 取り残されて [02:39.750]只剩下那美好的童话徒留在原地 [02:45.630]どこにも行けず たたずむ僕は 魔法さけぶよ [02:45.630]无处可去 伫立在原地的我 只能无力地嘶吼着咒语 [02:55.130]やがて君が 大人になったら ぼんやり [02:55.130]终有一天 你会渐渐老去 [03:04.260]思い出すだろうか 馬鹿な 望みさ [03:04.260]是否还会隐约想起 年轻时那可笑又笨拙的心愿 [03:13.960]そしてまだ君が好きで 取り残された [03:13.960]然后依旧深爱着你 徒留在原地的我 [03:20.110]魔法使いが たそがれる町に かなうことない [03:20.110]在这个魔法渐渐衰退的小镇里 [03:28.360]未来だけが 歌い続ける [03:28.360]只是在不断的吟唱着 那根本不可能实现的未来 [03:35.620]いつか君は 古ぼけた おとぎ話を読むだろう [03:35.620]在未来的某一天 你会读到这本被遗弃的 已经破旧了的童话吧 [03:46.570]どこにも行けず たたずむ僕が そこにいるだろう [03:46.570]而我将哪都不去 始终在童话的尽头等着你 [03:56.480]永遠なれ [03:56.480]直到永远
善待自己,对自己好一点,总是没错的。
经过多年的隐忍,我终于第一次用上了千元以上的手机,告别了百元山寨机的时代,至于为什么不再隐忍,就不得不说一个难受的事情。当我还在学校的时候,基本都是直接往校园卡里充钱吃饭,没怎么用过扫码功能,所以并不是很在意相机的功能,一直以为扫码慢只是因为光源的问题,工作以后,吃饭基本都是在外面扫码付款,结果就是一次次的缓慢与别人的神速形成鲜明对比的时候,而且还不时挡住别人的时候,我终于放弃挣扎了,还是换了吧。理由确实太单纯了,当然公模机系统广告之类的不是什么大问题,它们基本都是freemeos,通过adb可以删除大量无用的东西,当然有个坑是手机管家不能删,一删系统就打不开了,所以主要要忍受的点就是安装包每次安装都有输验证码,简直太离谱了,其实刷gsi的,只是因为带root会被银行之类软件检测到不安全环境而无法使用,防止方法肯定有,只是懒得搞。这次我换的手机,是华为的,单纯从性价比来说米OV之类的或许比较好,但我之所以选华为嘛!主要还是对华为比较有好感一些,所以就让它作为我的第一部千元机以表纪念意义吧。其实还有一层目的是我想稍微用一用鸿蒙OS,并拥有一个测试环境,并看看以后它到底会有一个怎样的未来,当然并非NEXT,等到有机会也可以试一试,现在并不是时候,因为它目前算是我的主力机了。至于下一次换机会选择什么,就到时候再考虑过吧,反正我是挺满意现在的新机的,那种正常扫码的感觉,真好。
既然主力机到手了,手上的山寨机自然不能荒废掉,于是乎我可以不用去专门买服务器了,手机直接可以拿来用了。当然为了搞机,手上的系统肯定就不能用了,所谓的搞机三部曲就是1.解锁bootloader;2.刷root;3.换上lineageos。第一步往往是一切的开端,一旦它没有,没办法进行任何修改的话,就啥也做不了。虽然很久没搞机了,但作为一个极客,迅速收集需要的知识,并构建起相应的知识体系是必备的修养。对于bootloader的解锁往往都是要看芯片的,如果是联发科的芯片,可以用深度工具MTKClient,至于其他芯片嘛,就看手机商的良心了,比如米系的手机对于搞机就十分友好了。当然,对于杂牌机,完全无需顾虑,对于降本增效的它们,必定会选更实惠的mt系列芯片,总之,这样我们就轻松地完成了第一步。而root嘛,则是采用更为通用的Magisk修补boot.img镜像的方法,原理可以参考这篇文章,其是一种内核级别的修改,相较之下,以前那种往系统刷su命令的方法可太low了。当然十分重要的一点一定要记得,因为这是一个修改boot镜像的高危行为,对于这种找不到原生固件的机器,搞机前的第一件事一定是进brom模式,把所有文件备份一下,这样对于只在软件层面游离的我们,算是一种必备的保险。接下来就是刷系统了,这其实是件十分复杂的事情,如果幸运的话,只要简单地去除vbmeta验证,再在fastbootd模式下刷入合适匹配的gsi通用镜像,事情其实就结束了,当然我这部山寨机稍微绕了一下,但很容易发现,因为大大的几个“vbmeta_system”和“vbmeta_vendor”一直彰显着它的存在,告诉我去掉它的验证,事实确实如此,使用类似vbmeta的方法,就全都结束了。
接下来,我们再讲个更坎坷的事情,很容易注意到,我不止换了系统,第一屏也被我换掉了,其实这本来是简单的事情,结果绕了一大圈。根据那十分不准的搜索引擎,安卓应该有三屏,一是启动内核kernel时的第一屏,并且还信誓旦旦地说,它通常都是被隐藏掉的,二是一号初始化进程init加载的initlogo.rle,三就是系统内部,位于java框架层的bootanimation了,于是我就默认地以为,第二屏就是我们要整改的目标。接着我就按照教程使用boot解析工具将这个包含内核和ramdisk的镜像给解包了,令人失望的是,我没有发现我想要的文件,这时我意识到了,那些教程的安卓版本是不是太老的原因,于是我就想着看看我手上的安卓11的源码,但那玩意内存实在太大了,同步到一半就不想同步了,而且内存也严重不足了,于是只能凑合着去这里看看安卓10的源码,在system/core/init
中,我们确实没有发现logo.c之类的源码,果然那东西到底有多老,实在难以想象。这时的我,愚蠢地想着,能不能通过源码,找到新版logo显示的代码,因为这些我需要的知识,无论怎么搜索都查不到,就只能自己动手了。然后事不过三,三天的阅读,直接让我窒息,莫名其妙的东西太大,而且代码不在本地,导航也没有,阅读起来实在太费劲了,区区的init进程搞这么麻烦,但结论还是有的,我想要的东西不在里面,其实我们还有另外一种验证方法,就是直接往boot.img里面刷入空内容,这样内核和init进程就都不会启动了,但事实是,它有下面的状态。
这显然意味着第一屏,不在boot镜像中,我的研究可谓全都白费了,比boot更底层的只有两个,brom和bootloader,进brom时全程黑屏,进bootloader时只有一行英语,也就是说第一屏只能在这里面被解读,brom是我们的深度刷机模式,走在bootloader的前面,刻录在芯片里面,但不存在程序的概念,并没有什么可改变的,所以核心在bootloader中。而这个bootloader就是我们从mtkclient中提取的preloader和boot2,我这台机子嘛,两个基本是一样的。这东西不属于安卓源码的一部分,想逆向的话,ida64提示要插件,但我怎样也找不到,ghidra应该可以逆向arm架构,但我实在是玩不明白。上网搜搜mt芯片资料的时候,总是出现一些路径表示有源码,但我怎么也搜索不到,个人推测以前可能确实有,只是相关资料可能基本都被删除干净了,从执行代码的角度是比较困难的,但功夫不负有心人,我找到了一个稍微老一点的工具,它可以解析mtk芯片的logo,其一般位于镜像logo.img中,只不过,效果嘛,像下面这样。

不过放大一点,能稍微看出图像的轮廓,这至少算是希望了。这实际是因为分辨率和色彩空间没有选对的原因。虽然是rust语言写的,但过程简单,读起来并不困难,在cli/src/command/unpack.rs
中的函数run_unpack是解包指令的执行主体,核心步骤为let image = Logo::read(&mut reader)
解析镜像文件,extract_logo(…)
用于保存解析数据。解析过程就生读取,分别位于src/mtk/header.rs
(解析512byte头)和src/mtk/logo.rs
(解析剩下的索引表和生数据)。在logo.img中,一般没有加密,最多就一个zlib压缩,得到的就是像素数据,所以关键在意,以怎样的像素格式和长宽去保存,实验证实像素格式是bgrabe,而分辨率就是手机屏幕的分辨率1600x720。从代码中可以看到,解析的分辨率format_provider提供,而它来自于guess_format猜测(位于cli/src/config/mod.rs
),从结果上来看,它并不是很准,实际上去yaml配置中指定profiles.name[=default].formats
的内容就可以了,它就是猜测的标准,不过我比较懒,直接改代码练练手算了。至此也就差不多了。虽然目前算是告一段落了,但搞机之旅肯定不会就此止步,还有很多可以做的事情,比如第一屏上的文字看着太碍眼了,能不能想办法清楚,还有boot启动太慢能不能加速,这些都需要深入去了解底层,是个十分漫长的过程,但这是值得的。
说完换手机,不得不说的是另一个大事,我们换电脑了,而且还有显卡了。不过比较可惜的是N卡RTX4060,本来想要既然买就拿目前最好的RTX4090,但奈何笔记本找不到合适的搭载机型,没错就是笔记本,没办法,我目前还是一个漂无定所的人,租的房子随时可能变,整机搬运还是太麻烦了。如果要稍微低端一点的话,就要考虑我的需求了,游戏我基本玩的是galgame,所以配置需求还挺低的,于我而言,目前最需要的是3A,即AI绘图、AI配音、AI剧本,绘图方面使用sd1.5,显存需求大概8G左右,配音方面使用GPT-SoVITS大概只需要6G显存,而剧本使用对话的ChatGLM,在int8量化下也大概用个8G显存。总之,随便搞搞综合多个方面就选了RTX4060+8G显存,虽然独显看起来不够,但实际算的时候会把共享显存的8G一起加进去,最后再加上amdcpu的16G-8G内存,总体来说性能是完全够的。除此之外,还有一个翻译模型SakuraLLM,本来预计跑个7B模型,不过等实体机到了以后,我还是斗胆测了一下,比较推荐的14B模型,虽然它们显存理论要求12G,但我的卡跑起来好像也没什么问题。实测下来,根据参数配置,AI绘图基本是20s-10min以内,翻译基本1s-10s,这是我目前使用的两个核心功能,总体上还是比较满意的,接下来就看它的寿命到底多长了,每天跑ai,不知道哪天会不会给烧掉。
既然讲到AI,就稍微讲讲这个我开始使用的AI绘图吧,虽然它已经出现好久了,但现在才真正玩起来,确实有些落后,但没问题,现在开始追赶吧。对于AI先表个态,我支持技术的发展,反对对技术的不正当使用,完毕,接下来回归正题吧。首先我们必须明白一点,所谓的AI绘图不是仅仅停留在“一段话->->->精美图”那种粗浅的层次,AI绘图的精髓在于“通过参数进行理性控制的绘画并在一定程度上消除手抖等物理因素”,我们先说说后面部分,绘画这东西,我以前稍微自学一些,基础理论想懂的话都是可以懂的,最为困难的就是持之以恒的训练,把自己的手训练得能画出自己想要的东西,很多时候,我们都败在了这里,更别谈设计了,这就是所谓的手抖,鼠标不好控制就算了,连数位板都把控不住的人就算了吧。而AI最大的作用就是消除手抖因素并提高无用功的效率,使绘者可以更多地关注在构图、设计和想法等精神层面上的东西。如果想要让其变为事实,防止ai的抽卡行为,就是所谓的参数控制,ComfyUI工作流绘图就是将绘图过程理性化并可视化的代表,但这东西我目前还玩不来,可以先看看稍微简单些的WebUI。大家所谓的咒语(提示词)其实就是一直意向化的参数控制,其基本目的通过用于生成基础的构图和色调,如果觉得这方面的控制不够的话,另一种方案就是使用图生图,通过基础线稿进行形象化的指引,这样我们就能得到初稿,其基本定下来整张图的主题风格等。接下来是处理,其包含多个方面,比如局部重绘就是我很喜欢的一个功能,当然还可以有各种特定的修复工具,通过整体处理,我们基本可以将图变成一个完整的作品了,当然ai笔法不行的时候,手动处理也是可以的。虽然这样的过程在一般人看起来有些繁琐,但搞过绘画的人一定知道,真正手绘一张图的流程可能会更繁琐,不过手绘的好处就是对于控制力强的人可以更好的控制笔触。说来说去也没讲个啥,反正各有优缺点吧,一个人能全面发展肯定更好,但奈何咱的手就是练不好,一旦打了退堂鼓,并发现有一个能弥补缺陷的东西,又怎么不会去尝试呢?这就是惰性呢!我只想说一句话,内容生成式AI也是一门学问,它一定会需要一个会用的人去使用。