源码:https://github.com/iOSDevLog/Jump 现在还跳得不准。
现在的微信跳一跳小游戏都是通过 PC 端破解的,于是我就写了一个只用 Android 手机就能破解的插件。
【建议】应该还可以通过Accessibility直接在手机端实现
分析
kotlin, Android Studio, Accessibility, adb, root
Accessibility
https://developer.android.com/guide/topics/ui/accessibility/services.html
Accessibility 可以用来辅助操作,自动化测试等,可以参考微信抢红包插件。
我们可以监测微信,如果是跳一跳界面就触发插件。
查了一下文档,好像只有长按,不能自己控制时间。用 Accessibility
实现跳跃是不行了。
adb
如果是连接 PC 端,可以通过 adb
命令截图,模拟跳跃的长按(点击拖动)操作。
input swipe <x1> <y1> <x2> <y2> [duration(ms)] (Default: touchscreen) # 模拟长按
screencap <filename> # 保存截屏到手机
开发
用 Android Studio 创建一个新的项目。
创建一个 AccessibilityService
子类。
manifests
<service
android:name=".JumpAccessibilityService"
android:enabled="true"
android:exported="true"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>
<meta-data
android:name="android.accessibilityservice"
android:resource="@xml/accessibility" />
</service>
xmo/accessibility.xml
<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeWindowStateChanged"
android:accessibilityFeedbackType="feedbackGeneric"
android:accessibilityFlags="flagDefault"
android:canRetrieveWindowContent="true"
android:notificationTimeout="100"
android:packageNames="com.tencent.mm" />
package iosdevlog.com.jump
import android.accessibilityservice.AccessibilityService
import android.view.accessibility.AccessibilityEvent
class JumpAccessibilityService : AccessibilityService() {
override fun onInterrupt() {
}
override fun onAccessibilityEvent(event: AccessibilityEvent?) {
}
}
测试 adb 命令
fun adbCommand(commands: Array<String>) {
try {
process = runtime.exec("su")
val os = DataOutputStream(process?.outputStream)
os.let {
for (command in commands) {
os.write(command.toByteArray())
os.writeBytes("\n")
os.flush()
}
os.writeBytes("exit\n")
os.flush()
process?.waitFor()
}
} catch (e: Exception) {
e.printStackTrace()
}
}
在 AndroidTest 下面添加测试
@Test
fun adbCommand() {
Utils.screencap()
val bitmap = BitmapFactory.decodeFile(Utils.SCREENSHOT_LOCATION)
assertNotNull(bitmap)
assert(bitmap.width > 0)
}
报错 :
Error:Gradle: failed to create directory ‘…’
解决方法:
在 gradle.properties 添加
android.enableAapt2=false