मेरे पास एक कक्षा MyObject और एक ऐप है जो मुख्य गतिविधि एक विधि लागू करती है test(ArrayList<MyObject> x)

    public class MyObject {

    private String x;

    MyObject(String x) {
        this.x = x;
    }

    public String getX() {
        return x;
    }
}

अब मुझे पैरामीटर x प्राप्त करने के लिए xposed के साथ विधि test को हुक करने की आवश्यकता है। मैं ArrayList के माध्यम से कैसे पहुंच और पुनरावृति कर सकता हूं और getX विधि को कॉल कर सकता हूं? मेरा पहला दृष्टिकोण इसे findAndHookMethod विधि के तर्क के रूप में पारित करना था:

final Class<?> myObject = XposedHelpers.findClass(
    "com.xposed.packagehook.MyObject", lpparam.classLoader);`

लेकिन मुझे नहीं पता कि इसे ArrayList में कैसे लपेटना है।

0
Mow 13 जून 2020, 04:09

1 उत्तर

सबसे बढ़िया उत्तर

हुक विकसित करते समय एप्लिकेशन स्रोत कोड को आधार के रूप में उपयोग करना एक अच्छा विचार नहीं है। संकलित एपीके फ़ाइल का उपयोग करने और एपीकेटूल जैसे टूल का उपयोग करके इसे डीकंपाइल करने की अनुशंसा की जाती है। इसका कारण यह है कि संकलित कोड कभी-कभी आपकी अपेक्षा से थोड़ा अलग दिखता है:

विधि पैरामीटर परिभाषा ArrayList<MyObject> में दो खंड शामिल हैं:

  1. वस्तु प्रकार ArrayList
  2. ए (जेनेरिक) टाइप पैरामीटर MyObject

जेनरिक मूल जावा परिभाषा का हिस्सा नहीं थे और जब इस अवधारणा को बाद में जोड़ा गया तो यह संकलक तक ही सीमित था। इसलिए जेनेरिक टाइप पैरामीटर केवल मेथड सिग्नेचर में कंपाइलर टाइम पर मौजूद होता है। ऐप डेक्स बाइट कोड में और रन-टाइम पर आप केवल इस तरह से विधि परीक्षण देखेंगे:

void test(ArrayList x)

या स्माली कोड में वैसा ही जैसा यह apktool द्वारा आउटपुट करता है:

method public test(Ljava/util/ArrayList;)V

कुछ डिकंपेलर जेनेरिक प्रकार पैरामीटर भी दिखा सकते हैं, लेकिन वह जानकारी एक एनोटेशन से आती है जो विधि को जोड़ने के लिए आवश्यक विधि हस्ताक्षर का हिस्सा नहीं है।

इसलिए यदि आप इस विधि को हुक करना चाहते हैं तो MyObject पूरी तरह अप्रासंगिक है। बस उस परीक्षण विधि को हुक करें जिसमें java.util.ArrayList पैरामीटर है और आपका काम हो गया।

1
Robert 13 जून 2020, 10:37