2016-07-10 22 views
0

ich Java to smali plugin verwenden möchten anrufen, aber ich habe erste Java-Klasse zu kompilieren, das für Projekt wie diesesWie smali in Java

unmöglich ist

enter image description here

Die h.m ist

enter image description here

Javac verstehe das nicht, aber ich will nur diesen Java-Code zur Klasse kompilieren, damit ich ihn in smali konvertieren kann.

Dieses Projekt wird von apktool d my.apk dekodiert, ich versuche, etwas Code in es zu injizieren, Smali schreiben ist härter als java.Aber ich habe den Inject Teil getan, will nur wissen, wie Java zu Klasse kompilieren.

$ adb logcat -s "Injected" 
--------- beginning of main 
--------- beginning of system 
07-10 19:32:24.013 7689 7689 W Injected: Started 
07-10 19:32:24.015 7689 7689 W Injected: Init 

EDIT

Der ursprüngliche Titel ist In Jetbrain can I just compile Java to class and ignore all error?, wollen aber ich will, ist How to call Smali in Java, so benenne ich den Titel.

+0

Was ist eine Dummy-Java-Klasse mit dem gleichen Namen wie 'h'variable und Feldern' l' und 'm' wie in smali zu schreiben? Dann können Sie Ihre ursprüngliche Codedatei in die Klasse kompilieren und die für den Dummy generierte Datei löschen. –

+0

Es gibt zu viel Dummy-Klasse zu schreiben, also wählte ich [auf diese Weise] (http://stackoverflow.com/a/38298127/1870054) – wener

+0

Habe nicht bemerkt, dass die zweite Antwort Ihnen gehört. Möglicherweise sollte es der akzeptierte sein. –

Antwort

3

Nr

Java erfordert die Definitionen der Klassen/Methoden/Felder in einem Java-Programm verwendet wird, um es kompilieren zu können. Ohne diese Informationen verfügt es nicht über genügend Informationen, um eine Klassendatei erstellen zu können.

Zum Beispiel, sagen wir mal Sie versuchen, dieses Programm zu kompilieren:

public class Main { 
    public static int main(String[] args) { 
     Blort blort = new Blort(); 
     blort.blarg("blurg!"); 
     return 0; 
    } 
} 

Die genaue Bytecode, das hängt von der Definition des Blort.blarg Verfahren hergestellt wird.

Wenn blarg ist wie folgt definiert:

public class Blort { 
    public void blarg(String blah) { 
     System.out.println(blah); 
    } 
} 

Dann wird der Methodenaufruf würde einzuhaltenden Blarg:

invoke-virtual {v0, v1}, LBlort;->blarg(Ljava/lang/String;)V 

Wenn jedoch die blarg Verfahren unterschiedlich definiert:

public class Blort { 
    public void blarg(CharSequence blah) { 
     System.out.println(blah); 
    } 
} 

Dann würde der Methodenaufruf kompiliert werden zu:

invoke-virtual {v0, v1}, LBlort;->blarg(Ljava/lang/CharSequence;)V 

Diese beiden Methodenaufrufe beziehen sich auf unterschiedliche Methoden und sind nicht austauschbar. Und wenn der Compiler nicht mindestens die Deklaration der Blarg-Methode kennt, kann er nicht die richtige Methodensignatur kennen.

Und das ist nur ein kleines Beispiel, warum der Compiler die Definitionen aller Klassen kennen muss, auf die in einem Java-Programm verwiesen wird. Es gibt viele andere Gründe.

0

Java kann das nicht, aber hier ist ein Workaround, der perfekt funktionieren wird.

  1. die classes.dex
  2. Verwendung finden dex2jar konvertieren es
  3. hinzufügen jar jar
  4. Jetzt projizieren Sie smali Code direkt im Code aufrufen können.

    unzip my.apk -d apk 
    d2j-dex2jar my/classes.dex 
    # Add classes-dex2jar.jar to project