【问题标题】:custom class loader for android?android的自定义类加载器?
【发布时间】:2012-05-31 10:43:16
【问题描述】:

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

它的作用是:

  1. 公开一个采用单个参数的 main,即目标类的 main
  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 清单以用“包装”活动替换现有活动,然后安装类加载器并调用原始底层活动。有没有更好的办法?

【问题讨论】:

    标签: java android reflection mobile javassist


    【解决方案1】:

    有一个名为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);
        }
    }
    

    【讨论】:

    • 这看起来正是我的想法。我不清楚这是否需要修改清单,但我需要等到今晚回家再深入研究。
    猜你喜欢
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    相关资源
    最近更新 更多