模块脚本示例
约 2707 字大约 9 分钟
2026-01-30
本文档提供了常用的 FolkPatch 模块脚本示例,您可以根据需要复制使用或修改。
示例 1:开机自动修改 Hosts
用途: 开机时自动替换系统的 hosts 文件,用于屏蔽广告或访问特定网站。
脚本文件:service.sh
#!/system/bin/sh
# 自动修改 hosts 文件
MODDIR=${0%/*}
LOGFILE=/data/local/tmp/hosts_changer.log
log_msg() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> $LOGFILE
}
log_msg "=== Hosts 修改脚本启动 ==="
# 等待系统完全启动
sleep 30
# 自定义 hosts 内容
CUSTOM_HOSTS="$MODDIR/hosts_custom"
# 检查自定义 hosts 文件是否存在
if [ -f "$CUSTOM_HOSTS" ]; then
log_msg "找到自定义 hosts 文件"
# 备份原 hosts(如果不存在备份)
if [ ! -f /system/etc/hosts.bak ]; then
cp /system/etc/hosts /system/etc/hosts.bak
log_msg "已备份原 hosts 文件"
fi
# 挂载 system 为可写(systemless 方式)
mount -o bind "$CUSTOM_HOSTS" /system/etc/hosts
if [ $? -eq 0 ]; then
log_msg "Hosts 文件修改成功"
else
log_msg "ERROR: Hosts 文件修改失败"
fi
else
log_msg "WARNING: 未找到自定义 hosts 文件"
fi
log_msg "=== 脚本执行完成 ==="配套文件:hosts_custom
在同一模块目录下创建 hosts_custom 文件:
# 自定义 hosts 文件
# 屏蔽广告示例
127.0.0.1 ad.example.com
127.0.0.1 analytics.example.com
0.0.0.0 tracking.example.com
# 其他自定义条目...安装步骤
创建模块安装包,包含:
module.propservice.sh(上方脚本)hosts_custom(您的 hosts 内容)
在 FolkPatch 管理器中安装模块
重启设备
示例 2:修改系统属性
用途: 修改 Android 系统属性,如显示自定义 ROM 名称、修改设备型号等。
脚本文件:service.sh
#!/system/bin/sh
# 修改系统属性示例
MODDIR=${0%/*}
LOGFILE=/data/local/tmp/prop_modifier.log
log_msg() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> $LOGFILE
}
log_msg "=== 属性修改脚本启动 ==="
# 等待系统服务启动
sleep 10
# 修改 ROM 显示名称
resetprop ro.build.display.id "My Awesome ROM v2.0"
log_msg "修改 ro.build.display.id"
# 修改设备型号(注意:这可能影响某些应用)
# resetprop ro.product.model "Custom Model"
# log_msg "修改 ro.product.model"
# 修改制造商
# resetprop ro.product.manufacturer "Custom Brand"
# log_msg "修改 ro.product.manufacturer"
# 修改 Android 版本显示(仅显示,不改变实际版本)
# resetprop ro.build.version.release "14"
# log_msg "修改 ro.build.version.release"
# 修改安全补丁日期显示
# resetprop ro.build.version.security_patch "2099-12-31"
# log_msg "修改 ro.build.version.security_patch"
# 查看修改后的属性
log_msg "当前显示版本: $(getprop ro.build.display.id)"
log_msg "=== 属性修改完成 ==="安装步骤
- 创建模块目录:
/data/adb/modules/prop_modifier/ - 创建
module.prop文件 - 将上方脚本保存为
service.sh - 设置执行权限:
chmod +x service.sh - 重启设备
示例 3:自动释放内存
用途: 定期清理后台进程,释放内存(谨慎使用)。
脚本文件:service.sh
#!/system/bin/sh
# 自动内存清理服务
MODDIR=${0%/*}
LOGFILE=/data/local/tmp/memory_cleaner.log
log_msg() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> $LOGFILE
}
log_msg "=== 内存清理服务启动 ==="
# 后台运行循环
(
# 等待系统完全启动
sleep 120
while true; do
# 获取当前内存使用情况
MEM_INFO=$(cat /proc/meminfo | grep MemAvailable)
MEM_AVAILABLE=$(echo $MEM_INFO | awk '{print $2}')
MEM_TOTAL=$(cat /proc/meminfo | grep MemTotal | awk '{print $2}')
# 计算可用内存百分比
MEM_PERCENT=$((MEM_AVAILABLE * 100 / MEM_TOTAL))
log_msg "当前可用内存: ${MEM_PERCENT}%"
# 如果可用内存低于 15%,执行清理
if [ $MEM_PERCENT -lt 15 ]; then
log_msg "内存不足,开始清理..."
# 清理缓存
echo 3 > /proc/sys/vm/drop_caches
log_msg "已清理系统缓存"
# 查看清理后的内存
MEM_INFO_AFTER=$(cat /proc/meminfo | grep MemAvailable)
MEM_AVAILABLE_AFTER=$(echo $MEM_INFO_AFTER | awk '{print $2}')
MEM_PERCENT_AFTER=$((MEM_AVAILABLE_AFTER * 100 / MEM_TOTAL))
log_msg "清理后可用内存: ${MEM_PERCENT_AFTER}%"
fi
# 每 10 分钟检查一次
sleep 600
done
) &
log_msg "=== 内存清理服务已在后台运行 ==="注意
- 此脚本会定期清理系统缓存,可能影响某些应用性能
- 不建议在低内存设备上使用
- 可以根据需要调整清理阈值和间隔时间
示例 4:启动时执行 Shell 命令
用途: 在系统启动时自动执行任意命令或脚本。
脚本文件:service.sh
#!/system/bin/sh
# 启动时执行自定义命令
MODDIR=${0%/*}
LOGFILE=/data/local/tmp/startup_commands.log
log_msg() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> $LOGFILE
}
log_msg "=== 启动命令脚本启动 ==="
# 等待系统完全启动
sleep 20
# 示例 1:创建特定文件标记
log_msg "创建启动标记文件"
touch /data/local/tmp/boot_completed.flag
# 示例 2:修改文件权限
log_msg "修改特定文件权限"
chmod 644 /data/local/tmp/some_config.txt 2>/dev/null || log_msg "文件不存在,跳过"
# 示例 3:删除临时文件
log_msg "清理临时文件"
rm -f /data/local/tmp/old_*.tmp 2>/dev/null && log_msg "已清理临时文件" || log_msg "无临时文件需要清理"
# 示例 4:设置 CPU 频率(需要内核支持)
# log_msg "设置 CPU 性能模式"
# echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor 2>/dev/null || log_msg "无法设置 CPU 性能模式"
# 示例 5:启动自定义服务
# if [ -x "$MODDIR/my_service.sh" ]; then
# log_msg "启动自定义服务"
# nohup sh "$MODDIR/my_service.sh" > /dev/null 2>&1 &
# fi
# 示例 6:记录启动信息
log_msg "系统启动完成,记录信息"
echo "Boot time: $(date)" >> $LOGFILE
echo "Device: $(getprop ro.product.model)" >> $LOGFILE
echo "Android version: $(getprop ro.build.version.release)" >> $LOGFILE
log_msg "=== 启动命令执行完成 ==="示例 5:SELinux 策略补丁
用途: 为特定应用或服务添加 SELinux 权限。
文件 1:sepolicy.rule
在模块根目录创建 sepolicy.rule 文件:
# 允许 my_app 访问特定服务
allow my_app system_server_service service_manager find
# 允许 shell 执行特定操作(示例)
# allow shell my_custom_file file { read write }
# 允许应用读取日志
# allow my_app logd unix_stream_socket connectto重要提示
- 编写 SELinux 策略需要专业知识
- 错误的规则可能导致安全漏洞或系统不稳定
- 建议参考系统默认策略进行修改
文件 2:service.sh(可选,用于验证)
#!/system/bin/sh
# 验证 SELinux 状态
MODDIR=${0%/*}
LOGFILE=/data/local/tmp/selinux_check.log
echo "[$(date)] SELinux 状态检查" >> $LOGFILE
echo "当前模式: $(getenforce)" >> $LOGFILE
echo "策略版本: $(cat /sys/fs/selinux/policyvers 2>/dev/null || echo 'N/A')" >> $LOGFILE示例 6:条件性脚本执行
用途: 根据设备型号、Android 版本或其他条件决定是否执行。
脚本文件:service.sh
#!/system/bin/sh
# 条件性执行脚本
MODDIR=${0%/*}
LOGFILE=/data/local/tmp/conditional_script.log
log_msg() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> $LOGFILE
}
log_msg "=== 条件性脚本启动 ==="
# 获取设备信息
DEVICE=$(getprop ro.product.device)
MODEL=$(getprop ro.product.model)
ANDROID_VERSION=$(getprop ro.build.version.release)
SDK_VERSION=$(getprop ro.build.version.sdk)
log_msg "设备信息:"
log_msg " Device: $DEVICE"
log_msg " Model: $MODEL"
log_msg " Android: $ANDROID_VERSION (API $SDK_VERSION)"
# 条件 1:只在特定设备上执行
if [ "$DEVICE" = "您的设备代号" ]; then
log_msg "检测到目标设备,执行特定操作"
# 在此处添加特定设备的操作
else
log_msg "非目标设备,跳过特定操作"
fi
# 条件 2:只在 Android 11 及以上版本执行
if [ "$SDK_VERSION" -ge 30 ]; then
log_msg "Android 11+ 检测,执行高级功能"
# 在此处添加 Android 11+ 的操作
else
log_msg "Android 版本较低,使用兼容模式"
fi
# 条件 3:检查特定文件是否存在
if [ -f /system/etc/some_config.xml ]; then
log_msg "找到配置文件,执行相关操作"
# 在此处添加相关操作
else
log_msg "配置文件不存在,跳过"
fi
# 条件 4:检查特定应用是否安装
if pm list packages | grep -q "com.example.app"; then
log_msg "检测到目标应用,执行应用相关操作"
# 在此处添加应用相关操作
else
log_msg "目标应用未安装"
fi
log_msg "=== 脚本执行完成 ==="示例 7:模块卸载清理
用途: 在模块被卸载时执行清理操作。
脚本文件:uninstall.sh
#!/system/bin/sh
# 模块卸载时执行清理
LOGFILE=/data/local/tmp/module_uninstall.log
echo "[$(date)] 模块开始卸载" >> $LOGFILE
# 清理日志文件
rm -f /data/local/tmp/module_*.log
# 恢复备份的文件(如果有)
if [ -f /system/etc/hosts.bak ]; then
echo "[$(date)] 恢复 hosts 备份" >> $LOGFILE
# 注意:这里只是示例,实际操作可能需要挂载 system
# cp /system/etc/hosts.bak /system/etc/hosts
fi
# 删除创建的标记文件
rm -f /data/local/tmp/boot_completed.flag
echo "[$(date)] 模块卸载完成,清理工作已执行" >> $LOGFILE提示
uninstall.sh 会在模块被卸载时自动执行,无需手动设置权限。
示例 8:Action 按钮脚本
用途: 提供一个可在管理器中手动执行的脚本。
脚本文件:action.sh
#!/system/bin/sh
# Action 按钮脚本 - 用于手动触发特定操作
MODDIR=${0%/*}
LOGFILE=/data/local/tmp/action_script.log
echo "[$(date)] Action 脚本执行开始" >> $LOGFILE
# 显示选择菜单(通过日志输出)
echo "请选择要执行的操作:"
echo "1. 清理系统缓存"
echo "2. 重启特定服务"
echo "3. 备份当前配置"
# 示例操作 1:清理缓存
clean_cache() {
echo "正在清理系统缓存..."
echo 3 > /proc/sys/vm/drop_caches
echo "缓存清理完成"
echo "[$(date)] 系统缓存已清理" >> $LOGFILE
}
# 示例操作 2:重启服务(示例,实际需要服务名称)
restart_service() {
echo "重启服务..."
# am restart 或其他服务管理命令
echo "服务重启完成"
echo "[$(date)] 服务已重启" >> $LOGFILE
}
# 示例操作 3:备份配置
backup_config() {
BACKUP_DIR=/sdcard/ModuleBackup
mkdir -p $BACKUP_DIR
echo "正在备份配置..."
cp -r /data/adb/modules/$MODID $BACKUP_DIR/
echo "配置已备份到: $BACKUP_DIR"
echo "[$(date)] 配置已备份到 $BACKUP_DIR" >> $LOGFILE
}
# 执行默认操作(清理缓存)
clean_cache
echo "[$(date)] Action 脚本执行完成" >> $LOGFILE使用方法
- 在 FolkPatch 管理器中进入模块详情
- 点击"执行 Action"按钮
- 查看执行结果和日志
模板:通用模块框架
以下是一个完整的模块模板,包含所有常用文件:
文件结构:
my_module/
├── module.prop
├── customize.sh(可选)
├── service.sh
├── post-fs-data.sh(可选)
├── uninstall.sh(可选)
├── action.sh(可选)
├── system.prop(可选)
├── sepolicy.rule(可选)
└── system/(可选,用于挂载文件)module.prop:
id=my_custom_module
name=我的自定义模块
version=v1.0.0
versionCode=100
author=您的名字
description=这是一个自定义模块,用于演示模块开发service.sh:
#!/system/bin/sh
# 通用服务脚本模板
MODDIR=${0%/*}
LOGFILE=/data/local/tmp/my_module.log
# 日志函数
log_msg() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> $LOGFILE
}
log_msg "=== 模块服务启动 ==="
log_msg "模块路径: $MODDIR"
# 等待系统启动
sleep 20
# TODO: 在此处添加您的脚本逻辑
log_msg "执行自定义操作..."
# 示例:检查模块状态
if [ -f "$MODDIR/disable" ]; then
log_msg "模块已被禁用"
else
log_msg "模块运行正常"
fi
log_msg "=== 模块服务完成 ==="调试技巧
在脚本中添加详细日志
#!/system/bin/sh
MODDIR=${0%/*}
LOGFILE=/data/local/tmp/debug_$(basename $0).log
# 清空旧日志
> $LOGFILE
log_msg() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] [$(basename $0)] $1" | tee -a $LOGFILE
}
log_msg "脚本开始执行"
log_msg "当前用户 ID: $(id)"
log_msg "当前工作目录: $(pwd)"
log_msg "模块目录: $MODDIR"
log_msg "脚本路径: $0"
log_msg "环境变量:"
env >> $LOGFILE
# 您的脚本逻辑
log_msg "脚本执行完成,退出码: $?"测试脚本语法
# 检查脚本语法错误
sh -n /path/to/your/script.sh
# 如果无输出,说明语法正确
# 如果有错误,会显示具体行号和错误信息注意事项
性能影响
- 避免在
post-fs-data.sh中执行耗时操作(限制 10 秒) service.sh应使用后台进程执行长时间任务
- 避免在
安全性
- 不要硬编码敏感信息(如密码、密钥)
- 谨慎修改系统关键文件
- 使用
resetprop而不是直接修改/system/build.prop
兼容性
- 不同 Android 版本的命令和路径可能不同
- 使用条件判断检查设备兼容性
- 测试时先在备用设备上进行
日志管理
- 定期清理日志文件,避免占用过多空间
- 使用追加模式 (
>>) 而不是覆盖模式 (>)
相关文档
版权所有
版权归属:FolkPatch Team
