Triying для генерации байт-кода Dex во время выполнения - PullRequest
0 голосов
/ 29 января 2011

Я пытался вызвать DX Tool во время выполнения. Моя основная идея - создать файл Dexfile, а затем динамически загрузить его в систему Android. У меня есть некоторые ошибки, но я думаю, что можно генерировать Dile напрямую. Следующий код пытается сгенерировать простой бин HelloWorld с помощью конструктора. Кто-нибудь может мне помочь?

public class HelloWorld{

private String message;

public HelloWorld(){}

public String getMessage(){
return message;}

public void setMessage(String message){
this.message=message;
}
}

Мой пример кода следующий:

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStreamWriter;

import java.io.OutputStream;
import java.util.ArrayList;

import com.android.dx.rop.code.BasicBlock;
import com.android.dx.rop.code.BasicBlockList;
import com.android.dx.rop.code.FillArrayDataInsn;
import com.android.dx.rop.code.Insn;
import com.android.dx.rop.code.InsnList;
import com.android.dx.rop.code.LocalVariableInfo;
import com.android.dx.rop.code.PlainInsn;
import com.android.dx.rop.code.RegisterSpec;
import com.android.dx.rop.code.RegisterSpecList;
import com.android.dx.rop.code.Rop;
import com.android.dx.rop.code.RopMethod;
import com.android.dx.rop.code.SourcePosition;
import com.android.dx.rop.cst.Constant;
import com.android.dx.rop.cst.CstFieldRef;
import com.android.dx.rop.cst.CstMethodRef;
import com.android.dx.rop.cst.CstNat;
import com.android.dx.rop.cst.CstType;
import com.android.dx.rop.cst.CstUtf8;
import com.android.dx.rop.type.StdTypeList;
import com.android.dx.rop.type.Type;
import com.android.dx.util.IntList;


import com.android.dx.dex.code.BlockAddresses;
import com.android.dx.dex.code.CatchBuilder;
import com.android.dx.dex.code.CatchHandlerList;
import com.android.dx.dex.code.CatchTable;
import com.android.dx.dex.code.CstInsn;
import com.android.dx.dex.code.DalvOps;
import com.android.dx.dex.code.Dop;
import com.android.dx.dex.code.InsnFormat;
import com.android.dx.dex.code.SimpleInsn;
import com.android.dx.dex.code.StdCatchBuilder;

import com.android.dx.dex.code.OutputFinisher;
import com.android.dx.dex.code.DalvCode;
import com.android.dx.dex.code.form.Form10t;
import com.android.dx.dex.code.form.Form10x;
import com.android.dx.dex.code.form.Form11x;
import com.android.dx.dex.code.form.Form12x;
import com.android.dx.dex.code.form.Form22c;
import com.android.dx.dex.code.form.Form22x;
import com.android.dx.dex.code.form.Form35c;
import com.android.dx.dex.file.ClassDefItem;
import com.android.dx.dex.file.DexFile;
import com.android.dx.dex.file.EncodedField;
import com.android.dx.dex.file.EncodedMethod;

public class Main {

        private static DexFile outputDex;

        /**
         * Prints the usage message.
         */

    public void createDexFile() throws Exception{
        CstType type=new CstType(Type.intern("Lmnt/sdcard/HolaMundo;")); 



        outputDex=new DexFile();

        OutputStream fileOutputStream=new FileOutputStream("classes.dex");
        /***Class***/
        ClassDefItem clazz=new ClassDefItem(type, 1, new CstType(Type.intern("Ljava/lang/Object;")), new StdTypeList(0), new CstUtf8("HolaMundo.java"));

        /***Fields***/
        EncodedField field=new EncodedField(new CstFieldRef(type,new CstNat(new CstUtf8("message"),new CstUtf8("Ljava/lang/String;"))),2);

        clazz.addInstanceField(field);


        /***Methods***/
        /***Constructor***/
        CstMethodRef methodref=new CstMethodRef(type,new CstNat(new CstUtf8("<init>"),new CstUtf8("()V")));
        /*Rop opcode1=new Rop(1,new Type("V", Type.BT_VOID),new StdTypeList(0),new StdTypeList(0),1,false,"nop");
        Rop opcode2=new Rop(2,new Type("I",Type.BT_INT),new StdTypeList(Type.BT_INT),new StdTypeList(0),1,false,"move-int");
        Rop opcode3=new Rop(2,new Type("J",Type.BT_LONG),new StdTypeList(Type.BT_LONG),new StdTypeList(0),1,false,"move-long");
        Rop opcode4=new Rop(2,new Type("F",Type.BT_FLOAT),new StdTypeList(Type.BT_FLOAT),new StdTypeList(0),1,false,"move-float");
        Rop opcode5=new Rop(2,new Type("D",Type.BT_DOUBLE),new StdTypeList(Type.BT_DOUBLE),new StdTypeList(0),1,false,"move-double");
        Rop opcode6=new Rop(2,Type.intern("Ljava/lang/Object;"),new StdTypeList(Type.intern("Ljava/lang/Object;").getBasicType()),new StdTypeList(0),1,false,"move-object");
        Rop opcode7=new Rop(2,new Type("<addr>", Type.BT_ADDR),new StdTypeList(Type.BT_ADDR),new StdTypeList(0),1,false,"move-return-address");
        Rop opcode8=new Rop(3,new Type("I",Type.BT_INT),new StdTypeList(0),new StdTypeList(0),1,false,"move-param-int");
        Rop opcode9=new Rop(3,new Type("J",Type.BT_LONG),new StdTypeList(0),new StdTypeList(0),1,false,"move-param-long");
        Rop opcode10=new Rop(3,new Type("F",Type.BT_FLOAT),new StdTypeList(0),new StdTypeList(0),1,false,"move-param-float");
        Rop opcode11=new Rop(3,new Type("D",Type.BT_DOUBLE),new StdTypeList(0),new StdTypeList(0),1,false,"move-param-double");
        Rop opcode12=new Rop(3,Type.intern("Ljava/lang/Object;"),new StdTypeList(0),new StdTypeList(0),1,false,"move-param-object");
        Rop opcode13=new Rop(5,new Type("I",Type.BT_INT),new StdTypeList(0),new StdTypeList(0),1,false,"const-int");
        Rop opcode14=new Rop(5,new Type("J",Type.BT_LONG),new StdTypeList(0),new StdTypeList(0),1,false,"const-long");
        Rop opcode15=new Rop(5,new Type("F",Type.BT_FLOAT),new StdTypeList(0),new StdTypeList(0),1,false,"const-float");
        Rop opcode16=new Rop(5,new Type("D",Type.BT_DOUBLE),new StdTypeList(0),new StdTypeList(0),1,false,"const-double");
        Rop opcode17=new Rop(5,Type.intern("Ljava/lang/Object;"),new StdTypeList(0),new StdTypeList(Type.intern("Ljava/lang/Error;").getBasicType()),6,false,"const-object");
        Rop opcode18=new Rop(5,Type.intern("Ljava/lang/Object;"),new StdTypeList(0),new StdTypeList(0),1,false,"const-object-nothrow");
        Rop opcode19=new Rop(6,new Type("V", Type.BT_VOID),new StdTypeList(0),new StdTypeList(0),3,false,"goto");
        Rop opcode20=new Rop(7,new Type("V", Type.BT_VOID),new StdTypeList(Type.BT_INT),new StdTypeList(0),4,false,"if-eqz-int");
        Rop opcode21=new Rop(8,new Type("V", Type.BT_VOID),new StdTypeList(Type.BT_INT),new StdTypeList(0),4,false,"if-nez-int");
        Rop opcode22=new Rop(9,new Type("V", Type.BT_VOID),new StdTypeList(Type.BT_INT),new StdTypeList(0),4,false,"if-ltz-int");
        Rop opcode23=new Rop(10,new Type("V", Type.BT_VOID),new StdTypeList(Type.BT_INT),new StdTypeList(0),4,false,"if-eqz-int");
        Rop opcode24=new Rop(11,new Type("V", Type.BT_VOID),new StdTypeList(Type.BT_INT),new StdTypeList(0),4,false,"if-lez-int");
        Rop opcode25=new Rop(12,new Type("V", Type.BT_VOID),new StdTypeList(Type.BT_INT),new StdTypeList(0),4,false,"if-gtz-int");
        Rop opcode26=new Rop(7,new Type("V", Type.BT_VOID),new StdTypeList(Type.intern("Ljava/lang/Object;").getBasicType()),new StdTypeList(0),4,false,"if-nez-object");
        Rop opcode27=new Rop(8,new Type("V", Type.BT_VOID),new StdTypeList(Type.intern("Ljava/lang/Object;").getBasicType()),new StdTypeList(0),4,false,"if-eqz-object");
        Rop opcode28=new Rop(7,new Type("V", Type.BT_VOID),StdTypeList.make(new Type("I",Type.BT_INT),new Type("I",Type.BT_INT)),new StdTypeList(0),4,false,"if-eq-NTI");
        Rop opcode29=new Rop(8,new Type("V", Type.BT_VOID),StdTypeList.make(new Type("I",Type.BT_INT),new Type("I",Type.BT_INT)),new StdTypeList(0),4,false,"if-ne-int");
        Rop opcode30=new Rop(9,new Type("V", Type.BT_VOID),StdTypeList.make(new Type("I",Type.BT_INT),new Type("I",Type.BT_INT)),new StdTypeList(0),4,false,"if-lt-int");
        Rop opcode31=new Rop(10,new Type("V", Type.BT_VOID),StdTypeList.make(new Type("I",Type.BT_INT),new Type("I",Type.BT_INT)),new StdTypeList(0),4,false,"if-ge-int");
        Rop opcode32=new Rop(11,new Type("V", Type.BT_VOID),StdTypeList.make(new Type("I",Type.BT_INT),new Type("I",Type.BT_INT)),new StdTypeList(0),4,false,"if-le-int");
        Rop opcode33=new Rop(12,new Type("V", Type.BT_VOID),StdTypeList.make(new Type("I",Type.BT_INT),new Type("I",Type.BT_INT)),new StdTypeList(0),4,false,"if-gt-int");
        Rop opcode34=new Rop(7,new Type("V", Type.BT_VOID),StdTypeList.make(Type.intern("Ljava/lang/Object;"),Type.intern("Ljava/lang/Object;")),new StdTypeList(0),4,false,"if-eq-object");
        Rop opcode35=new Rop(8,new Type("V", Type.BT_VOID),StdTypeList.make(Type.intern("Ljava/lang/Object;"),Type.intern("Ljava/lang/Object;")),new StdTypeList(0),4,false,"if-ne-object");
        Rop opcode36=new Rop(13,new Type("V", Type.BT_VOID),new StdTypeList(Type.BT_INT),new StdTypeList(0),5,false,"switch");
        Rop opcode37=new Rop(14,new Type("I", Type.BT_INT),StdTypeList.make(new Type("I",Type.BT_INT),new Type("I",Type.BT_INT)),new StdTypeList(0),1,false,"add-int");
        Rop opcode38=new Rop(14,new Type("J", Type.BT_LONG),StdTypeList.make(new Type("J",Type.BT_LONG),new Type("J",Type.BT_LONG)),new StdTypeList(0),1,false,"add-long");
        Rop opcode39=new Rop(14,new Type("F", Type.BT_FLOAT),StdTypeList.make(new Type("F",Type.BT_FLOAT),new Type("F",Type.BT_FLOAT)),new StdTypeList(0),1,false,"add-float");
        Rop opcode40=new Rop(14,new Type("D", Type.BT_DOUBLE),StdTypeList.make(new Type("D",Type.BT_DOUBLE),new Type("D",Type.BT_DOUBLE)),new StdTypeList(0),1,false,"add-double");
        Rop opcode41=new Rop(15,new Type("I", Type.BT_INT),StdTypeList.make(new Type("I",Type.BT_INT),new Type("I",Type.BT_INT)),new StdTypeList(0),1,false,"sub-int");
        Rop opcode42=new Rop(15,new Type("J", Type.BT_LONG),StdTypeList.make(new Type("J",Type.BT_LONG),new Type("J",Type.BT_LONG)),new StdTypeList(0),1,false,"sub-long");
        Rop opcode43=new Rop(15,new Type("F", Type.BT_FLOAT),StdTypeList.make(new Type("F",Type.BT_FLOAT),new Type("F",Type.BT_FLOAT)),new StdTypeList(0),1,false,"sub-float");
        Rop opcode44=new Rop(15,new Type("D", Type.BT_DOUBLE),StdTypeList.make(new Type("D",Type.BT_DOUBLE),new Type("D",Type.BT_DOUBLE)),new StdTypeList(0),1,false,"sub-double");
        Rop opcode45=new Rop(16,new Type("I", Type.BT_INT),StdTypeList.make(new Type("I",Type.BT_INT),new Type("I",Type.BT_INT)),new StdTypeList(0),1,false,"mul-int");
        Rop opcode46=new Rop(16,new Type("J", Type.BT_LONG),StdTypeList.make(new Type("J",Type.BT_LONG),new Type("J",Type.BT_LONG)),new StdTypeList(0),1,false,"mul-long");
        Rop opcode47=new Rop(16,new Type("F", Type.BT_FLOAT),StdTypeList.make(new Type("F",Type.BT_FLOAT),new Type("F",Type.BT_FLOAT)),new StdTypeList(0),1,false,"mul-float");
        Rop opcode48=new Rop(16,new Type("D", Type.BT_DOUBLE),StdTypeList.make(new Type("D",Type.BT_DOUBLE),new Type("D",Type.BT_DOUBLE)),new StdTypeList(0),1,false,"mul-double");
        Rop opcode49=new Rop(17,new Type("I", Type.BT_INT),StdTypeList.make(new Type("I",Type.BT_INT),new Type("I",Type.BT_INT)),StdTypeList.make(Type.intern("Ljava/lang/Error;"),Type.intern("Ljava/lang/ArithmeticException;")),6,false,"div-int");
        Rop opcode50=new Rop(17,new Type("J", Type.BT_LONG),StdTypeList.make(new Type("J",Type.BT_LONG),new Type("J",Type.BT_LONG)),StdTypeList.make(Type.intern("Ljava/lang/Error;"),Type.intern("Ljava/lang/ArithmeticException;")),6,false,"div-long");
        Rop opcode51=new Rop(17,new Type("F", Type.BT_FLOAT),StdTypeList.make(new Type("F",Type.BT_FLOAT),new Type("F",Type.BT_FLOAT)),new StdTypeList(0),1,false,"div-float");
        Rop opcode52=new Rop(17,new Type("D", Type.BT_DOUBLE),StdTypeList.make(new Type("D",Type.BT_DOUBLE),new Type("D",Type.BT_DOUBLE)),new StdTypeList(0),1,false,"div-double");
        Rop opcode53=new Rop(18,new Type("I", Type.BT_INT),StdTypeList.make(new Type("I",Type.BT_INT),new Type("I",Type.BT_INT)),StdTypeList.make(Type.intern("Ljava/lang/Error;"),Type.intern("Ljava/lang/ArithmeticException;")),6,false,"rem-int");
        Rop opcode54=new Rop(18,new Type("J", Type.BT_LONG),StdTypeList.make(new Type("J",Type.BT_LONG),new Type("J",Type.BT_LONG)),StdTypeList.make(Type.intern("Ljava/lang/Error;"),Type.intern("Ljava/lang/ArithmeticException;")),6,false,"rem-long");
        Rop opcode55=new Rop(18,new Type("F", Type.BT_FLOAT),StdTypeList.make(new Type("F",Type.BT_FLOAT),new Type("F",Type.BT_FLOAT)),new StdTypeList(0),1,false,"rem-float");
        Rop opcode56=new Rop(18,new Type("D", Type.BT_DOUBLE),StdTypeList.make(new Type("D",Type.BT_DOUBLE),new Type("D",Type.BT_DOUBLE)),new StdTypeList(0),1,false,"rem-double");
        Rop opcode57=new Rop(19,new Type("I", Type.BT_INT),new StdTypeList(Type.BT_INT),new StdTypeList(0),1,false,"neg-int");
        Rop opcode58=new Rop(19,new Type("J", Type.BT_LONG),new StdTypeList(Type.BT_LONG),new StdTypeList(0),1,false,"neg-long");
        Rop opcode59=new Rop(19,new Type("F", Type.BT_FLOAT),new StdTypeList(Type.BT_FLOAT),new StdTypeList(0),1,false,"neg-float");
        Rop opcode60=new Rop(19,new Type("D", Type.BT_DOUBLE),new StdTypeList(Type.BT_DOUBLE),new StdTypeList(0),1,false,"neg-double");
        Rop opcode61=new Rop(20,new Type("I", Type.BT_INT),StdTypeList.make(new Type("I",Type.BT_INT),new Type("I",Type.BT_INT)),new StdTypeList(0),1,false,"and-int");
        Rop opcode62=new Rop(20,new Type("J", Type.BT_LONG),StdTypeList.make(new Type("J",Type.BT_LONG),new Type("J",Type.BT_LONG)),new StdTypeList(0),1,false,"and-long");
        Rop opcode63=new Rop(21,new Type("I", Type.BT_INT),StdTypeList.make(new Type("I",Type.BT_INT),new Type("I",Type.BT_INT)),new StdTypeList(0),1,false,"or-int");
        Rop opcode64=new Rop(21,new Type("J", Type.BT_LONG),StdTypeList.make(new Type("J",Type.BT_LONG),new Type("J",Type.BT_LONG)),new StdTypeList(0),1,false,"or-long");
        Rop opcode65=new Rop(22,new Type("I", Type.BT_INT),StdTypeList.make(new Type("I",Type.BT_INT),new Type("I",Type.BT_INT)),new StdTypeList(0),1,false,"xor-int");
        Rop opcode66=new Rop(22,new Type("J", Type.BT_LONG),StdTypeList.make(new Type("J",Type.BT_LONG),new Type("J",Type.BT_LONG)),new StdTypeList(0),1,false,"xor-long");
        Rop opcode67=new Rop(23,new Type("I", Type.BT_INT),StdTypeList.make(new Type("I",Type.BT_INT),new Type("I",Type.BT_INT)),new StdTypeList(0),1,false,"shl-int");
        Rop opcode68=new Rop(23,new Type("J", Type.BT_LONG),StdTypeList.make(new Type("J",Type.BT_LONG),new Type("I",Type.BT_INT)),new StdTypeList(0),1,false,"shl-long");
        Rop opcode69=new Rop(24,new Type("I", Type.BT_INT),StdTypeList.make(new Type("I",Type.BT_INT),new Type("I",Type.BT_INT)),new StdTypeList(0),1,false,"shr-int");
        Rop opcode70=new Rop(24,new Type("J", Type.BT_LONG),StdTypeList.make(new Type("J",Type.BT_LONG),new Type("I",Type.BT_INT)),new StdTypeList(0),1,false,"shr-long");
        Rop opcode71=new Rop(25,new Type("I", Type.BT_INT),StdTypeList.make(new Type("I",Type.BT_INT),new Type("I",Type.BT_INT)),new StdTypeList(0),1,false,"ushr-int");
        Rop opcode72=new Rop(25,new Type("J", Type.BT_LONG),StdTypeList.make(new Type("J",Type.BT_LONG),new Type("I",Type.BT_INT)),new StdTypeList(0),1,false,"ushr-long");
        Rop opcode73=new Rop(26,new Type("I", Type.BT_INT),new StdTypeList(Type.BT_INT),new StdTypeList(0),1,false,"not-int");
        Rop opcode74=new Rop(26,new Type("J", Type.BT_LONG),new StdTypeList(Type.BT_LONG),new StdTypeList(0),1,false,"not-long");
        Rop opcode75=new Rop(14,new Type("I", Type.BT_INT),new StdTypeList(Type.BT_INT),new StdTypeList(0),1,false,"add-const-int");
        Rop opcode76=new Rop(14,new Type("J", Type.BT_LONG),new StdTypeList(Type.BT_LONG),new StdTypeList(0),1,false,"add-const-long");
        Rop opcode77=new Rop(14,new Type("F", Type.BT_FLOAT),new StdTypeList(Type.BT_FLOAT),new StdTypeList(0),1,false,"add-const-float");
        Rop opcode78=new Rop(14,new Type("D", Type.BT_DOUBLE),new StdTypeList(Type.BT_DOUBLE),new StdTypeList(0),1,false,"add-const-double");
        */

        Rop opcodeMethod1=new Rop(3,Type.intern("Ljava/lang/Object;"),new StdTypeList(0),new StdTypeList(0),1,false,"move-param-object");
        Rop opcodeMethod2=new Rop(6,new Type("V", Type.BT_VOID),new StdTypeList(0),new StdTypeList(0),3,false,"goto");
        SourcePosition sourcePositionMethod1=new SourcePosition(new CstUtf8("HolaMundo.java"),1,1);
        SourcePosition sourcePositionMethod2=new SourcePosition(new CstUtf8("HolaMundo.java"),2,2);
        RegisterSpec registerSpecMethod1=RegisterSpec.make(0,new Type("NffffHolaMundo;",Type.BT_OBJECT,2147483647));
        RegisterSpec registerSpecMethod2=null;
        RegisterSpec registerSpecMethod0=RegisterSpec.make(0,Type.intern("Ljava/lang/Object;"));
        RegisterSpecList registerSpecListMethod0=new RegisterSpecList(1);
        registerSpecListMethod0.set(0, registerSpecMethod1);
        RegisterSpecList registerSpecListMethod1=new RegisterSpecList(0);
        RegisterSpecList registerSpecListMethod2=new RegisterSpecList(0);
        PlainInsn insn1=new PlainInsn(opcodeMethod1,sourcePositionMethod1,registerSpecMethod1,registerSpecListMethod1);
        PlainInsn insn2=new PlainInsn(opcodeMethod2,sourcePositionMethod2,registerSpecMethod2,registerSpecListMethod2);
        Dop dopMethod0 = new Dop(DalvOps.INVOKE_DIRECT,DalvOps.INVOKE_DIRECT,Form35c.THE_ONE,false,"invoke-direct");
        Dop dopMethod1 = new Dop(DalvOps.RETURN_VOID, DalvOps.RETURN_VOID, Form10x.THE_ONE, false, "return-void");
        CstInsn simpleInsnMethod0=new CstInsn(dopMethod0,sourcePositionMethod1,registerSpecListMethod0,methodref);
        SimpleInsn simpleInsnMethod1=new SimpleInsn(dopMethod1,sourcePositionMethod2,registerSpecListMethod1);
        OutputFinisher outputFinisherMethod1=new OutputFinisher(21,2);
        outputFinisherMethod1.add(simpleInsnMethod0);
        outputFinisherMethod1.add(simpleInsnMethod1);


        /***DalvCode***/

        InsnList insnList1=new InsnList(2);
        insnList1.set(0, insn1);
        insnList1.set(1, insn2);
        int primarySuccesor1=0;
        int label1=10;
        IntList intList1=new IntList(1);
        insnList1.setImmutable();
        intList1.add(0);
        intList1.setImmutable();
        BasicBlock basicBlock1=new BasicBlock(label1,insnList1,intList1,primarySuccesor1);


        InsnList insnList2=new InsnList(1);
        insnList2.set(0, insn2);
        int primarySuccesor2=11;
        int label2=0;
        IntList intList2=new IntList(11);


        BasicBlockList basicBlockList1=new BasicBlockList(1);
        basicBlockList1.set(0, basicBlock1);


    // Bueno!!  int[] orderMethod1={14,12,0,13};


        /**** Constructor ****/
        int[] orderMethod1={10};
        RopMethod ropMethod1=new RopMethod(basicBlockList1,10);
        BlockAddresses blockAddresses1=new BlockAddresses(ropMethod1);
        StdCatchBuilder stdCatchBuilder1=new StdCatchBuilder(ropMethod1,orderMethod1,blockAddresses1);
        DalvCode code1=new DalvCode(2,outputFinisherMethod1,stdCatchBuilder1);
        EncodedMethod method=new EncodedMethod(methodref,0x10001,code1,new StdTypeList(0));
        clazz.addDirectMethod(method);



        /*** Method setMessage ***/
        CstMethodRef methodref2=new CstMethodRef(type,new CstNat(new CstUtf8("setMessage"),new CstUtf8("(Ljava/lang/String;)V")));
        Dop dopMethod2=new Dop(DalvOps.IPUT_OBJECT,DalvOps.IPUT_OBJECT,Form22c.THE_ONE,false,"iput-object");
        Dop dopMethod3 = new Dop(DalvOps.RETURN_VOID,DalvOps.RETURN_VOID,Form10x.THE_ONE,false,"return-void");

        SourcePosition sourcePositionMethod3=new SourcePosition(new CstUtf8("HolaMundo.java"),2,6);
        SourcePosition sourcePositionMethod4=new SourcePosition(new CstUtf8("HolaMundo.java"),5,7);
        RegisterSpec registerSpecMethod4=RegisterSpec.make(0,Type.intern("Ljava/lang/String;"));
        RegisterSpec registerSpecMethod3=RegisterSpec.make(1, Type.intern("LHolaMundo;"));
        RegisterSpecList registerSpecListMethod3=new RegisterSpecList(2);
        RegisterSpecList registerSpecListMethod4=new RegisterSpecList(0);
        registerSpecListMethod3.set(0,registerSpecMethod3);
        registerSpecListMethod3.set(1,registerSpecMethod4);

        CstFieldRef cstFieldRef1=new CstFieldRef(type,new CstNat(new CstUtf8("message"),new CstUtf8("Ljava/lang/String;")));
        CstInsn simpleInsnMethod2=new CstInsn(dopMethod2,sourcePositionMethod3,registerSpecListMethod3,cstFieldRef1);
        SimpleInsn simpleInsnMethod3 = new SimpleInsn(dopMethod3,sourcePositionMethod4, registerSpecListMethod4);
        OutputFinisher outputFinisherMethod2=new OutputFinisher(22,2);
        outputFinisherMethod2.add(simpleInsnMethod2);
        outputFinisherMethod2.add(simpleInsnMethod3);

        int[] orderMethod2={10};
        RopMethod ropMethod2=new RopMethod(basicBlockList1,10);
        BlockAddresses blockAddresses2=new BlockAddresses(ropMethod2);
        StdCatchBuilder stdCatchBuilder2=new StdCatchBuilder(ropMethod2,orderMethod2,blockAddresses2);

        DalvCode code2=new DalvCode(2,outputFinisherMethod2,stdCatchBuilder2);
        EncodedMethod method2=new EncodedMethod(methodref2,1,code2,new StdTypeList(0));

        clazz.addVirtualMethod(method2);
        /*** Method getMessage ***/
        CstMethodRef methodref3=new CstMethodRef(type,new CstNat(new CstUtf8("getMessage"),new CstUtf8("()Ljava/lang/String;")));
        Dop dopMethod4 = new Dop(DalvOps.IGET_OBJECT, DalvOps.IGET_OBJECT, Form22c.THE_ONE, true, "iget-object");
        Dop dopMethod5 = new Dop(DalvOps.RETURN_OBJECT,DalvOps.RETURN_OBJECT,Form11x.THE_ONE,false,"return-object");
        RegisterSpec registerSpecMethod5=RegisterSpec.make(1, Type.intern("LHolaMundo;"));
        RegisterSpec registerSpecMethod6=RegisterSpec.make(0,Type.intern("Ljava/lang/String;"));
        SourcePosition sourcePositionMethod5=new SourcePosition(new CstUtf8("HolaMundo.java"),2,8);
        SourcePosition sourcePositionMethod6=new SourcePosition(new CstUtf8("HolaMundo.java"),5,9);
        RegisterSpecList registerSpecListMethod5=new RegisterSpecList(2);
        registerSpecListMethod5.set(0, registerSpecMethod5);
        registerSpecListMethod5.set(1,registerSpecMethod6);
        RegisterSpecList registerSpecListMethod6=new RegisterSpecList(1);
        registerSpecListMethod6.set(0, registerSpecMethod6);

        CstFieldRef cstFieldRef2=new CstFieldRef(type,new CstNat(new CstUtf8("message"),new CstUtf8("Ljava/lang/String;")));
        CstInsn simpleInsnMethod4=new CstInsn(dopMethod4,sourcePositionMethod5,registerSpecListMethod5,cstFieldRef2);
        SimpleInsn simpleInsnMethod5=new SimpleInsn(dopMethod5,sourcePositionMethod6,registerSpecListMethod6);
        OutputFinisher outputFinisherMethod3=new OutputFinisher(22,2);
        outputFinisherMethod3.add(simpleInsnMethod4);
        outputFinisherMethod3.add(simpleInsnMethod5);

        int[] orderMethod3={10};
        RopMethod ropMethod3=new RopMethod(basicBlockList1,10);
        BlockAddresses blockAddresses3=new BlockAddresses(ropMethod3);
        StdCatchBuilder stdCatchBuilder3=new StdCatchBuilder(ropMethod3,orderMethod3,blockAddresses3);

        DalvCode code3=new DalvCode(2,outputFinisherMethod3,stdCatchBuilder3);
        EncodedMethod method3=new EncodedMethod(methodref3,1,code3,new StdTypeList(0));
        clazz.addVirtualMethod(method3);
        outputDex.add(clazz);

        outputDex.writeTo(fileOutputStream, null, false);
        fileOutputStream.flush();
        fileOutputStream.close();


        InputStream is = new FileInputStream("mnt/sdcard/classes.dex");

        int len;
        int size = 1024;
        byte[] buf;

        if (is instanceof ByteArrayInputStream) {
          size = is.available();
          buf = new byte[size];
          len = is.read(buf, 0, size);
        } else {
          ByteArrayOutputStream bos = new ByteArrayOutputStream();
          buf = new byte[size];
          while ((len = is.read(buf, 0, size)) != -1)
            bos.write(buf, 0, len);
          buf = bos.toByteArray();
        }
        System.out.println(System.getProperty("user.dir"));
       System.out.println("buf "+buf.toString());
       com.android.dx.command.dexer.Main m=new com.android.dx.command.dexer.Main();
        m.createJar("mnt/sdcard/HelloWorld.jar", buf);
        System.out.println("Yeahhhhh");


    //  ClassDefIt

    }


        /**
         * Returns a copy of the given args array, but without the indicated
         * element.
         *
         * @param orig non-null; original array
         * @param n which element to omit
         * @return non-null; new array
         */
        private static String[] without(String[] orig, int n) {
            int len = orig.length - 1;
            String[] newa = new String[len];
            System.arraycopy(orig, 0, newa, 0, n);
            System.arraycopy(orig, n + 1, newa, n, len - n);
            return newa;
        }



    public static void main(String[] args){

        String[] args2={"--dex","--output=HolaMundo.jar","HolaMundo.class"};
        Main m=new Main();
        try{

            m.createDexFile();

        }catch(Exception e){System.out.println(e.getMessage());}
    }
}

1 Ответ

0 голосов
/ 25 января 2012

Я реализовал следующий класс, используя ASM и BCEL:

public class HelloWorld {
    public static void hello(){
        int a=0xabcd;
        int b=0xaaaa;
        int c=a-b;
        String s=Integer.toHexString(c);
        System.out.println(s);
    }

}

Во-первых, я использовал BCEL или ASM для создания нового специального класса в SD-карте. Во-вторых, я преобразовал класс Java в класс Dex с помощью утилиты Dxclient на SD-карте. Наконец, я создал файл JAR, а затем я загрузил этот пакет в устройство с SD-карты

DXClient reference

https://github.com/headius/dexclient/blob/master/src/DexClient.java

Вы можете проверить мой код с https://github.com/sciruela/android

...