[Soot-list] How to Instrument the apk file before the callsite of doInBackground?

Jin Li lijin1988 at gmail.com
Mon Jun 16 06:53:06 EDT 2014


Hi All,
I read the jimple file of my AsyncTask class,  there are two
doInBackground() method:

protected transient android.graphics.Bitmap
doInBackground(java.lang.String[])
    {
        com.rapptors.jamood.DownloadImageTask $r0;
        java.lang.String[] $r1;
        java.lang.Exception $r2;
        java.io.InputStream $r3;
        java.lang.String $r4, $r6;
        java.lang.StringBuilder $r5;
        int $i1;
        java.net.URL $r8;
        android.graphics.Bitmap $r9;

        $r0 := @this: com.rapptors.jamood.DownloadImageTask;
        $r1 := @parameter0: java.lang.String[];
        $r4 = $r1[0];
        $r5 = new java.lang.StringBuilder;
        specialinvoke $r5.<java.lang.StringBuilder: void
<init>(java.lang.String)>("tid is ");
        $i1 = staticinvoke <android.os.Process: int myTid()>();
        $r5 = virtualinvoke $r5.<java.lang.StringBuilder:
java.lang.StringBuilder append(int)>($i1);
        $r5 = virtualinvoke $r5.<java.lang.StringBuilder:
java.lang.StringBuilder append(java.lang.String)>(" pid is ");
        $i1 = staticinvoke <android.os.Process: int myPid()>();
        $r5 = virtualinvoke $r5.<java.lang.StringBuilder:
java.lang.StringBuilder append(int)>($i1);
        $r6 = virtualinvoke $r5.<java.lang.StringBuilder: java.lang.String
toString()>();
        staticinvoke <android.util.Log: int
d(java.lang.String,java.lang.String)>("DownloadImage", $r6);
        $r8 = new java.net.URL;

     label1:
        specialinvoke $r8.<java.net.URL: void
<init>(java.lang.String)>($r4);
        $r3 = virtualinvoke $r8.<java.net.URL: java.io.InputStream
openStream()>();
        $r9 = staticinvoke <android.graphics.BitmapFactory:
android.graphics.Bitmap decodeStream(java.io.InputStream)>($r3);

     label2:
        return $r9;

     label3:
        $r2 := @caughtexception;
        $r6 = virtualinvoke $r2.<java.lang.Exception: java.lang.String
getMessage()>();
        staticinvoke <android.util.Log: int
e(java.lang.String,java.lang.String)>("Error", $r6);
        virtualinvoke $r2.<java.lang.Exception: void printStackTrace()>();
        staticinvoke <ThreadHelper: void stopThreadProfile()>();
        return null;

        catch java.lang.Exception from label1 to label2 with label3;
    }

    protected transient volatile java.lang.Object
doInBackground(java.lang.Object[])
    {
        com.rapptors.jamood.DownloadImageTask $r0;
        java.lang.Object[] $r1;
        android.graphics.Bitmap $r2;
        java.lang.String[] $r3;

        $r0 := @this: com.rapptors.jamood.DownloadImageTask;
        $r1 := @parameter0: java.lang.Object[];
        $r3 = (java.lang.String[]) $r1;
        $r2 = virtualinvoke $r0.<com.rapptors.jamood.DownloadImageTask:
android.graphics.Bitmap doInBackground(java.lang.String[])>($r3);
        return $r2;
    }

But when I attempt to instrument some codes before the call site of the
doInBackground, I can't find that invokeExpr (red line). My code is like
this:

for(Iterator<Unit> iter = units.snapshotIterator(); iter.hasNext();) {
                final Unit u = iter.next();
                u.apply(new AbstractStmtSwitch() {

                    public void caseInvokeStmt(InvokeStmt stmt) {
                        InvokeExpr invokeExpr = stmt.getInvokeExpr();
                        SootMethod targetMethod = invokeExpr.getMethod();
                        String targetName =
invokeExpr.getMethod().getName();
                        System.out.println("invoke name is "+targetName);
                        if(targetName.equals("doInBackground")){

                            System.out.println("instrument thread
doInBackground start");
                        }
}

Does anybody know the reason?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mailman.CS.McGill.CA/pipermail/soot-list/attachments/20140616/ae101600/attachment-0001.html 


More information about the Soot-list mailing list