Featured image of post 简易Magisk模块的制作

简易Magisk模块的制作

从零开始尝试自制Magisk模块

# 前言

说到搞机,那肯定绕不开大名鼎鼎的Magisk。就我来说,root完后做的第一件事,就是安装各种各样的模块,但是,我却从来没有研究过Magisk的内容。同时,现在也有许多心怀不轨的人制作锁机模块骗人刷入。所以,了解Magisk模块的一些基本内容就显得比较重要了。

# 认识Magisk模块

根据官方的文档,一个典型的Magisk模块的目录应该如下所示:1

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
module.zip
├── META-INF
│   └── com
│       └── google
│           └── android
│               ├── update-binary      <--- 从官方仓库上下载的module_installer.sh
│               └── updater-script     <--- 只有一行文字为 "#MAGISK"
├── module.prop                        <--- 模块的标识信息
├── customize.sh                       <--- (可选)用于自定义模块安装过程
├── ...
├── ...  /* 模块的其余文件 */

可以看出来,META-INF目录是由官方提供,并不需要我们进行修改。

# module.prop

这个文件是模块的标识信息,模块的基本信息就存放在这里,文件的格式如下。1

1
2
3
4
5
6
7
id=<string>
name=<string>
version=<string>
versionCode=<int>
author=<string>
description=<string>
updateJson=<url> (optional)

各键值的作用说明如下:

名称 说明
id 模块的唯一标识符,需符合该正则表达式^[a-zA-Z][a-zA-Z0-9._-]+$
name 模块名称
version 模块版本号
versionCode 模块版本标识,必须为整数,用于更新
author 作者信息
description 模块描述
updateJson 更新信息链接,现在Magisk移除了内部的更新功能,这个属性应该是无用了

# system文件夹

Magisk的一个主要作用就是对系统文件进行注入或替换,只要将文件按顺序放入此目录中即可。例如我想修改hosts文件,只需要将修改好的hosts文件放入system/etc这个目录下,Magisk就会自动将其替换了。

如果要替换/vendor/product/system_ext中的文件,只需将它们分别放在system/vendorsystem/productsystem/system_ext下。Magisk就会自动替换完成。

# customize.sh

这是自定义模块安装过程,如果只是简单的替换文件就不需要用到它。但是,很多时候我们并不是仅需替换文件,还需要执行一些脚本,这里就需要使用到它了。

根据官方文档,这里支持以下的环境变量:

变量名 作用
MAGISK_VER (string) 当前安装的Magisk的版本字符串(例如v20.0)
MAGISK_VER_CODE (int) 当前安装的Magisk的版本代码(例如20000)
BOOTMODE (bool) 如果模块正在Magisk应用程序中安装,则为true
MODPATH (path) 安装模块文件的路径
TMPDIR (path) 可以临时存储文件的位置
ZIPFILE (path) 您的模块的安装zip
ARCH (string) 设备的CPU架构,值可以是armarm 64x86x64
IS64BIT (bool) 如果$ARCHarm 64x64,则为true
API (int) 设备的API级别(Android版本)(例如,Android 5.0为21)

以及以下的命令:

  • ui_print <msg>:在页面上显示信息
  • abort <msg>:将错误消息打印到控制台并终止安装
  • set_permset_perm_recursive:修改文件权限

# 实践

# 修改系统Hosts

我一开始想研究Magisk的契机,就是想要修改我手机的Hosts文件。一开始按百度的教程做,但没有效果,后来就尝试了一下Magisk模块,直接就成功了。

有了前面知识的铺垫,想要实现这个功能就非常简单了,下面列出我们程序的目录树。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
ChangeHosts.zip
├── META-INF
│   └── com
│       └── google
│           └── android
│               └── update-binary
│               └── updater-script
├── module.prop
├── system
    └── etc
        └── hosts

实际我们需要修改的部分只有module.prophostshosts是我们需要修改的文件,所以我们就只要关注module.prop

1
2
3
4
5
6
id=ChangeHosts
name=ChangeHosts
version=v1.0.0
versionCode=100
author=luoboQAQ
description=修改hosts文件来屏蔽广告

如此看来,如果只要替换文件,基本没有任何难度。

# 使用dnscrypt-proxy实现DoH

这部分我正在研究,等研究明白了就补上🕊️。