Android的自定义类加载器?

时间:2012-05-31 10:43:17

标签: java android reflection mobile javassist

我正在编写一个我想在桌面和移动设备(Android)上工作的工具库。

它的功能是:

  1. 公开一个带有一个参数的main,即目标类的主要
  2. 安装一个类加载器,它在加载时拦截所有类并对它们进行检测
  3. 像这样:

        // 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应用程序做同样的事情?

    一个想法是修改android清单,用“wrapper”活动替换现有活动,然后安装类加载器并调用原始底层活动。还有更好的方法吗?

1 个答案:

答案 0 :(得分:5)

有一个名为droidbox的项目来检测Android恶意软件。有一个代码可以帮助你很多。

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);
    }
}
相关问题