2015-04-20 54 views
0

我通過以下代碼sniplet動態加載Android上的類。在Android上獲取Java字節碼

if(classes.size() > 0) { 
    // Located classes.load and scan them for interfaces. 
    DexClassLoader dx = new DexClassLoader(szPath,outdex,null,  c.getClassLoader()); 
    for(String sz : classes) { 
     Class<?> cls = dx.loadClass(sz); 
     for(Class<?> i : cls.getInterfaces()) { 
      if(i.getName().contains("IPinPad") == true) { 
       // This is a PinPad. 
       return (IPinPad)cls.newInstance(); 
      } 
     } 
    } 
} 

類包含在從以前的運行代碼的DEX文件descovered類的列表。此代碼的目的是返回實現IPinPad接口聲明的對象實例。這一切工作正常,但除此之外,我想抓取cls.newInstance()對象的字節碼。我應該怎麼做?

我一直在玩cls.getClassLoader().getResourceAsStream();,但它總是返回一個空流,不確定如何指定該類的資源名。

+1

您不能從DEX文件中獲取Java字節碼,因爲它不存在那裏。理論上講,您可以獲取Dalvik字節碼,但根據您的最終目的,打開DEX文件並將其讀出可能會更容易。 – fadden

回答

0

您可以使用dexlib2smali/baksmali的一部分)來加載和讀取dex文件中的達爾維克字節碼。是的,它也應該可以在Android應用程序中使用。

DexFile dexFile = DexFileFactory.loadDexFile("/blah/blah.dex", android.os.Build.VERSION.SDK_INT); 
for (ClassDef classDef: dexFile.getClasses()) { 
    if (classDef.getType().equals("Lthe/class/to/look/for;")) { 
     // handle/inspect/process the class as needed 
    } 
}