Monet 激活码验证 Android 接入说明 ================================ 一、下载文件 1. classes.dex:已经用 Android SDK d8 编译好的 Java 激活客户端。 2. AndroidManifest-merge-snippet.xml:联网权限片段。 3. ActivationClient.java:对应源码,可用于重新编译或二次开发。 二、接入 classes.dex classes.dex 的类名为: com.monet.activation.ActivationClient 如果目标 APK 已经存在 classes.dex,请将本文件改名为 classes2.dex(或下一个未占用的 classesN.dex),放回 APK 根目录,并使用 apktool/apksigner 重新签名。不要覆盖原 APK 的 classes.dex,否则可能破坏原应用。 三、Manifest 把 AndroidManifest-merge-snippet.xml 中的 INTERNET 权限合并到目标应用。Android 6.0 及以上不需要为 INTERNET 弹运行时授权。 四、调用示例 必须在后台线程调用网络方法: new Thread(() -> { try { ActivationClient.Result result = ActivationClient.activate(this, inputCode); runOnUiThread(() -> enterMainScreen()); } catch (Exception error) { runOnUiThread(() -> showError(error.getMessage())); } }).start(); 后续启动先检查: if (ActivationClient.isActivated(this) || !ActivationClient.shouldShowActivationOnLaunch(this)) { enterMainScreen(); } else { showBlockingActivationDialog(); } 未激活时前 3 次启动直接进入,第 4 次启动开始显示不可通过外部点击或返回键关闭的激活弹窗。激活成功后永久跳过计数。 弹窗建议设置 setCancelable(false),点击“确定”时调用 activate()。激活成功后客户端会在应用私有 SharedPreferences 保存激活状态和设备 ID,后续启动可以离线进入。服务器会把激活码首次使用绑定到 appId + deviceId;换设备会返回错误。 五、接口 POST https://monet-apptracker.pages.dev/api/activation/activate Content-Type: application/json 请求: {"code":"你的激活码","appId":"com.example.app","deviceId":"android-id"} 成功响应包含 license.codeId、license.appId、license.activatedAt 和 license.expiresAt。 六、安全注意 激活码明文只在网站生成时显示一次,服务端只保存哈希。classes.dex 不是签名授权文件,建议使用 R8 混淆自己的界面和业务逻辑;真正的激活判断必须以服务端接口为准。