export let HOOK_DY = { hookTextViewClick: function () { Java.perform(function () { var View = Java.use("android.view.View"); // setOnClickListener 定义在 View 类中 var TextView = Java.use("android.widget.TextView"); // 为了访问 getText 方法 // 重写 setOnClickListener View.setOnClickListener.implementation = function (listener) { // 检查 this 是否是 TextView 的实例 console.log("type of this: " + this.getClass().getName()); if (this.getClass().getName().includes("TextView")) { try { // 安全地转换 this 为 TextView var textView = Java.cast(this, TextView); let text = textView.getText(); console.log("id: " + textView.getId(), "\t\t >>> \t\t" + text) if (text.toString().includes("***")) { // var stack = Java.use("java.lang.Thread").currentThread().getStackTrace(); // for (var i = 0; i < stack.length; i++) { // console.log(stack[i].toString()); // } //打印堆栈信息 console.log("1111") var jThrowable = Java.use("java.lang.Throwable"); console.log("2222") var jStackTrace = jThrowable.$new().getStackTrace(); console.log("Stack trace:"); jStackTrace.forEach(function (stackTraceElement) { console.log("\t" + stackTraceElement.toString()); }); console.log("33333") } } catch (e) { console.log("报错:",e); } } else { // console.log("Not a TextView"); } // 调用原始的 setOnClickListener 方法 this.setOnClickListener(listener); }; //监听Toast.makeText var Toast = Java.use("android.widget.Toast"); Toast.makeText.overload('android.content.Context', 'java.lang.CharSequence', 'int').implementation = function (context, text, duration) { console.log("Toast.makeText:", text); return this.makeText(context, text, duration); }; }); } }