2012-05-31 2 views
4

저는 데스크톱과 모바일 (Android)에서 모두 작업하고 싶은 도구 라이브러리를 작성하고 있습니다.android 용 사용자 정의 클래스 로더?

  1. 는 단일 매개 변수, 모두가로드로 클래스 및 악기 그들에게
을 차단하는 클래스 로더를 설치 대상 클래스
  • 의 주요 소요되는 메인을 노출 :에 의해

    그것은 기능

    과 같이 :

    // 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 }); 
        } 
    

    문제는 생입니다 s :

    어떻게하면 Android 앱에서 대략 동일한 작업을 수행 할 수 있습니까?

    한 가지 아이디어는 기존 액티비티를 "래퍼"액티비티로 바꾸기 위해 안드로이드 매니페스트를 수정 한 다음 클래스 로더를 설치하고 원래의 기본 액티비티를 호출하는 것입니다. 더 좋은 방법이 있습니까?

  • 답변

    5

    안드로이드 멀웨어를 탐지하는 프로젝트는 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); 
        } 
    } 
    
    +0

    이것은 내가 염두에 두었던 것과 정확히 같습니다. 나는 이것이 매니페스트에 대한 수정을 필요로하는지에 관해 명확하지 않지만, 오늘 밤에 집에 들어가서 파고들 때까지 기다려야한다. – amirpc

    관련 문제