发布于
安卓Root学习日志 02
编写Magisk模块
如果你刷入过Magisk模块,你就会知道,Magisk模块只是一个普通的zip文件,那么怎么制作这么一个zip文件呢?
module.prop
一个模块最核心的文件就是module.prop这个文件,没有这个文件的存在,Magisk就无法将这个zip文件识别成Magisk模块并刷入,那么怎么写一个module.prop呢?
一个module.prop一般包含以下的属性:
- id:模块的ID,字符串。不可与其他模块一致
- name:模块的名称,字符串,刷入后会显示在管理器中
- version:模块的版本名称,字符串,刷入后会显示在管理器中
- versionCode:模块的版本代号,整数,表示模块内部的版本号
- author:模块的作者,字符串,刷入后会显示在管理器中
- description:模块的描述,字符串,刷入后会显示在管理器中
最基本的属性就以上6个,将其填写进module.prop再将module.prop打包成任意名称的zip文件,就相当于做好一个模块了,以下是一个module.prop的示例:
id=example
name=ExampleModule
version=v1
versionCode=1
author=Blackwood416
description=This is a simple example module
请注意,module.prop需要以bash语法编写,即属性通过等号赋值,且等号两边不能有空格。
通过Overlay更改系统文件
Magisk提供了一种叫作Overlay的方式来在不更改真实系统文件的情况下覆盖系统文件的内容。
对于/system/build.prop,我们可以通过在Magisk模块中编写system.prop来覆盖它里面的系统属性。
比如,要在设备上开启屏幕广色域支持,我们可以在system.prop中加入下面这行:
ro.surface_flinger.has_wide_color_display=true
再将其与module.prop打包成zip重新刷入,重启后我们就可以发现设备能被检测出支持广色域。
再比如,我们想把已安装的某个应用转为系统应用,这时我们可以在Magisk模块的目录下面新建一个叫作system的文件夹,再在里面新建你想放到的系统应用文件夹,app或priv-app,然后到/data/app下找到该应用的目录,将目录中的lib、oat和base.apk复制到app或priv-app中,最后将system文件夹与system.prop和module.prop一起打包成zip,刷入后即可将目标应用转为系统应用,此时模块的目录结构如下:
|- module.prop |- system.prop |- system/ |- |- app/ |- |- |- lib/ |- |- |- oat/ |- |- |- base.apk
customize.sh
这个脚本是用来控制模块安装时的行为的,比如我们可以写一个脚本来检查设备是否符合某些条件,如果不符合则阻止安装。
uninstall.sh
该脚本会在Magisk模块被卸载时被Magisk调用,我们可以在其中写一些逻辑来控制卸载模块时的行为。
service.sh
我们可以在这个脚本里用sh语法写一个循环来持续运行一些逻辑,比如我们可以写一个定时任务来每隔一段时间执行一些操作,或者我们可以写一个后台服务来监听系统事件并做出相应的反应,相当于注册了一个系统服务。
post-fs-data.sh
该脚本会在系统启动完成后被Magisk调用,我们可以在其中写一些逻辑来控制系统启动后的行为。