2016-08-22 6 views
12

एप्लिकेशन recompiling के बिना, उपयोगकर्ता डिबग करने के लिए Xposed का उपयोग करके एप्लिकेशन डीबग करने योग्य बनाने में सक्षम हैं/एप्लिकेशनका पता लगाने एंड्रॉयड एप्लिकेशन चल रहा है डीबग मोड में

heapdump वहाँ किसी भी विधि (रूट या गैर रूट) ऐप्स का पता लगाने के लिए है वर्तमान में है:

  • डिबग मोड में चल रहा है

या

  • गु ई एप्लिकेशन युग्मनज में डीबग ध्वज का उपयोग कर

या

  • अनुप्रयोग किया जा रहा है ढेर फेंक दिया

BuildConfig.DEBUG और ApplicationInfo का उपयोग करना शुरू कर दिया, और FLAG_DEBUGGABLEनहीं करता है के लिए झंडे क्षेत्र की जाँच कर रहा है काम नहीं करता है क्योंकि ऐप डीबग फ्लैग के साथ ज़ीगोट द्वारा शुरू किया गया है

नीचे कोड है कि इस प्रक्रिया वर्ग हुक

try { 
     Method start = Process.class.getMethod(
       "start", String.class, String.class, Integer.TYPE, Integer.TYPE, int[].class, 
       Integer.TYPE, Integer.TYPE, Integer.TYPE, String.class, String[].class); 
     XposedBridge.log("start hook, appInfo: " + loadPackageParam.appInfo); 
     XposedBridge.hookMethod(start, new XC_MethodHook() { 
      @Override 
      protected void beforeHookedMethod(MethodHookParam methodHookParam) throws Throwable { 
        int id = 5; 
        int flags = (Integer) methodHookParam.args[id]; 
        if ((flags & 0x1) == 0) { 
         flags |= 0x1; 
        } 
        methodHookParam.args[id] = flags; 
        } 
      } 
     }); 
    } catch (NoSuchMethodException e) { 
     e.printStackTrace(); 
    } 

all apps is debuggable

+0

क्या एक्सपोज़ड मॉड्यूल ऐप डिबग करने योग्य बनाता है? –

+0

http://repo.xposed.info/module/com.jecelyin.buildprop – xDragonZ

+0

आप क्यों कहते हैं कि 'BuildConfig.DEBUG' काम नहीं करता है? मैं डीबग स्थिति की जांच के लिए इसका उपयोग करता हूं, इस पर ध्यान दिए बिना कि ऐप कैसे इंस्टॉल किया गया था या शुरू किया गया था। –

उत्तर

0

AFAIK यह संभव जड़ के बिना है कि जानकारी प्राप्त कर सके नहीं है।

हालांकि, आप जांच सकते हैं कि एक डीबगर कनेक्ट है या नहीं। Debug.isDebuggerConnected()

+0

वह मान केवल तभी सत्य होगा जब डीबगर संलग्न होता है, उपयोगकर्ता अभी भी ढेर डंप करने में सक्षम होता है। रूट विधि का भी स्वागत है – xDragonZ

+0

रूट: अपना खुद का एक्सपोज़ड मॉड्यूल बनाएं और विधि को कम प्राथमिकता के साथ हुक करें। मुझे लिनक्स शैल के साथ अनुभव नहीं हुआ है, लेकिन यह जानकारी भी प्राप्त करने में सक्षम हो सकता है। – F43nd1r

+0

@ F43nd1r एक्सपोज़ड मॉड्यूल को उपयोगकर्ता द्वारा सक्षम/अक्षम किया जाना चाहिए ... – Robert

0

BuildConfig.DEBUG और ApplicationInfo पर निर्भर होने के बजाय जो अब खुला मॉड्यूल के कारण अविश्वसनीय हैं देखें। आप अपने कोड में एक वैश्विक स्थिर बना सकते हैं।

public class DebugMode{ 
    public static final boolean ENABLED = true; 
} 

आपके रिलीज़ संस्करण में आप इसे सत्य पर सेट करते हैं, और आपके डीबग संस्करण में गलत पर सेट करते हैं। इसके लिए आप different source sets for buildflavours का भी उपयोग कर सकते हैं। तो आपको उन्हें मैन्युअल रूप से बदलने की ज़रूरत नहीं है।

यदि DebugMode.ENABLED सत्य है, तो आप जानते हैं कि आपका ऐप डीबग मोड में है, अन्यथा यह रिलीज़ मोड में है। यदि DebugMode.ENABLED गलत है, और BuildConfig.DEBUG सत्य है, तो आप जानते हैं कि कोई डीबग ध्वज के साथ छेड़छाड़ कर रहा है। यदि आप इसे जानते हैं, तो आप अपने ऐप को बंद कर सकते हैं, या एक हीप डंप को रोकने के लिए अन्य कार्रवाइयां ले सकते हैं।

+0

यह सवाल का जवाब नहीं देता है, क्योंकि xposed मॉड्यूल 'Process.class' को 'BuildConfig' और न ही 'ApplicationInfo' – xDragonZ

0

एक्सपॉइड स्थापित डिवाइस के साथ आप किसी भी चीज को रोक नहीं सकते हैं या जावा/डेक्स कोड में आपके ऐप को किसी भी डेटा पर भरोसा नहीं कर सकते हैं। Xposed द्वारा कुछ भी संशोधित किया जा सकता है।

इसलिए एकमात्र तरीका मूल कोड जोड़कर अपने ऐप को कड़ी करना है जो Xposed स्थापित उपकरणों पर निष्पादन को रोकता है। अच्छी सख्त ढांचे में यह डिबगर्स को संलग्न करना वास्तव में कठिन/लगभग असंभव बनाता है।

2

बूलियन कनेक्ट किया गया = नया डीबग()।isDebuggerConnected();

निर्धारित करें कि एक डीबगर वर्तमान में संलग्न है या नहीं। Documentation of Debug class

+1

' को हुक कर रहा है, मुझे वास्तव में नहीं पता कि यह सबसे अच्छा जवाब क्यों नहीं है। यह सरल और एकमात्र कामकाज है जो मुझे लगता है कि मुझे डेवलपर के रूप में आलसी बनने देता है। +1 – booky99

संबंधित मुद्दे