Autox.js 代码混淆与加密 webpack-autojs 保护脚本源码
脚本不想被别人看见源码?
打包成 APK 分发时,里面的 JS 源码默认是明文的——任何人解压 APK 就能看到你的脚本代码。如果你的脚本里有辛苦写出来的核心逻辑、或者不想被直接抄走,就得做混淆和加密。
三层保护
| 层级 | 手段 | 保护强度 | 说明 |
|---|---|---|---|
| 第一层 | JavaScript 混淆 | 中 | 变量名改短、字符串编码,增加阅读难度 |
| 第二层 | 代码加密 | 中高 | 核心代码用密钥加密,运行时解密 |
| 第三层 | APK 签名 + ProGuard | 高 | APK 层面的混淆和签名保护 |
第一层:JavaScript 混淆(最简单)
webpack 打包时加 terser-webpack-plugin:
// webpack.config.js
const TerserPlugin = require("terser-webpack-plugin");
module.exports = {
optimization: {
minimizer: [
new TerserPlugin({
terserOptions: {
compress: {
drop_console: true // 去掉 console.log
},
mangle: {
toplevel: true // 混淆顶层变量名
}
}
})
]
}
};
这样打出来的 JS 会变成这样:
// 混淆前(你的源码)
function calculateSigninReward(userId, days) {
let base = 10;
if (days > 7) base *= 2;
return base * userId.length;
}
// 混淆后(别人看到的)
function a(b,c){var d=10;c>7&&(d*=2);return d*b.length}
变量名全成了单字母、空格全部去掉、字符串还可以编码——可读性大幅降低。
第二层:核心代码加密
webpack-autojs 插件支持对指定模块做加密。加密后的代码必须用相同密钥运行时解密——如果密钥不放 APK 里,别人拿到 APK 也解不开。
// webpack.config.js
const { AutoxWebpackPlugin } = require("autojs-webpack");
module.exports = {
plugins: [
new AutoxWebpackPlugin({
encrypt: {
// 加密密钥(自己保管好)
key: "your-secret-key-here",
// 指定哪些文件要加密(可正则)
files: ["src/core/**/*.js", "src/critical.js"]
}
})
]
};
加密后的代码在 APK 里是二进制密文,运行时 Autox.js 引擎用密钥解密后再执行。没有密钥 = 看不到源码。
密钥放哪
| 方案 | 安全性 | 说明 |
|---|---|---|
| 硬编码在脚本里 | 低 | 和代码一起打包,反编译就能看到 |
| 远程下载 | 中 | 运行时从服务器拉取密钥,但需要网络 |
| 用户输入 | 高 | 首次启动时让用户输入授权码,配合在线验证 |
实战建议:核心逻辑(比如付费验证、算法实现)用加密 + 远程密钥。非核心逻辑(UI、通用工具)用混淆就行。
第三层:APK 层面的 ProGuard
如果你有 Android Studio 环境,可以在 APK 构建流程里加 ProGuard/R8 规则:
# proguard-rules.pro
-keep class org.autojs.** { *; }
-dontwarn org.autojs.**
-keepclassmembers class ** {
@android.webkit.JavascriptInterface <methods>;
}
ProGuard 会进一步混淆 APK 里的 Java/Kotlin 代码和资源,让反编译更困难。
限制与现实
没有 100% 防破解——Autox.js 脚本本质还是要在 JS 引擎里执行,只要有人愿意花时间逆向、或者 Hook 运行时环境,总有办法拿到逻辑。
保护的正确心态是:
| 对方 | 需要的保护 |
|---|---|
| 普通用户 | 混淆就够了,没人专门去解 |
| 同行开发者 | 混淆 + 加密,增加逆向成本 |
| 专业逆向 | 多层保护也没用,但能拖慢速度 |
开源还是闭源?
项目规则里有 MPL v2 + 非商业附加条款——Autox.js 本身开源,但你写的脚本可以不开源。如果脚本是你自己写的,混淆和加密是你的权利。
总结
| 场景 | 推荐做法 |
|---|---|
| 给朋友分享 | App 内打包,混淆可选 |
| 公开分发、有竞争 | webpack + terser 混淆 + 核心代码加密 |
| 商业项目 | 全套:混淆 + 加密 + ProGuard + 远程密钥 |