5

デスクトップとモバイル (Android) の両方で動作するインストルメンテーション ライブラリを作成しています。

次のように機能します。

  1. ターゲット クラスのメインである、単一のパラメーターを受け取るメインの公開
  2. すべてのクラスをロード時にインターセプトして計測するクラスローダーをインストールする

そのようです:

    // Expects args[0] to contain the name of the INNER main
    public static void main(String[] args) throws Throwable {
            String className = args[0];
            String [] newArgs = new String[0];

            if(args.length > 1) {
                    newArgs = Arrays.copyOfRange(args, 1, args.length-1);
            }

            System.out.println("Bootstrapping " + className);

            Loader s = new Loader(ClassLoader.getSystemClassLoader().getParent());
            Class<?> c = s.loadClass(className);
            c.getDeclaredMethod("main", new Class[] { String[].class }).invoke(
                            null, new Object[] { newArgs });
    }

質問はこれです:

Androidアプリでほぼ同じことを行うにはどうすればよいですか?

1 つのアイデアは、Android マニフェストを変更して既存のアクティビティを「ラッパー」アクティビティに置き換え、クラス ローダーをインストールして、元の基になるアクティビティを呼び出すことです。より良い方法はありますか?

4

1 に答える 1

5

Android マルウェアを検出するdroidboxというプロジェクトがあります。あなたを大いに助けることができるコードがあります。

package com.loader;

import dalvik.system.DexClassLoader;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;

public class LoaderActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        DexClassLoader dLoader = new DexClassLoader("/sdcard/DroidBoxTests.apk","/sdcard/", null, ClassLoader.getSystemClassLoader().getParent());

        Class calledClass = null;
        try {
            calledClass = dLoader.loadClass("droidbox.tests.DroidBoxTests");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        Intent it=new Intent(this, calledClass);
        it.setClassName("droidbox.tests", "droidbox.tests.DroidBoxTests");
        startActivity(it);
    }
}
于 2012-05-31T11:49:03.623 に答える