2014-02-10 4 views
0

Я комбинирую статический анализ кода с динамическим. Я в основном создаю новую деятельность и настрою ее как начальную деятельность. Во время работы следует называть различные методы в существующих мероприятиях.Inject Context to activity

Я могу позвонить, например. onCreate извне, однако вызов super Activity не удастся (или вызывает SharedPreferences или другие интересные классы), поскольку Android использует некоторые элементы инициализации при использовании намерений для вызова активности (например, установки контекста). Но мне нужно как-то вызвать методы, подобные onCreate, или снаружи, давая целевой активности действительный контекст.

В моей недавно созданной деятельности у меня есть действующий контекст. Я попытался передать его по телефону ContextWrapper.attachBaseContext, но все еще есть NullPointerException где-то в Android из-за недостающего контекста. Есть ли способ взломать это как-то в рабочее состояние? Использование отражения или других хаков не было бы проблемой, поскольку оно предназначено только для анализа.

Большое спасибо за любые советы. Я мог бы каким-либо образом модифицировать анализируемые приложения, чтобы это работало.

Однако: Использование намерения не является опцией, поскольку я не могу контролировать, какие методы активности вызывается, когда и как часто. Я знаю, что андроид не был создан для непосредственного вызова этих методов, но это не обычный случай: :);

ответ

0

Я создал хак, который, кажется, помогает (я могу получить допустимый контекст в взломанной деятельности). Посмотрим, как далеко я буду пользоваться этим. public static void hack (Activity hack, Activity main) { try { Поле mActivityInfo = getField (Activity.class, "mActivityInfo"); mActivityInfo.set (hack, getClass ("android.content.pm.ActivityInfo"). NewInstance()); Поле mFragments = getField (Activity.class, "mFragments"); Поле mContainer = getField (Activity.class, «mContainer»); Поле mApplication = getField (Activity.class, "mApplication"); Поле mWindow = getField (Activity.class, "mWindow"); Класс FragmentManagerImpl = getClass ("android.app.FragmentManagerImpl"); FragmentManager manager = (FragmentManager) mFragments.get (hack);

 mApplication.set(hack, main.getApplication()); 
     mWindow.set(hack, main.getWindow()); 

     Class<?> FragmentContainer = getClass("android.app.FragmentContainer"); 
     Method attachActivity = getMethod(FragmentManagerImpl, "attachActivity", Activity.class, FragmentContainer, Fragment.class); 
     attachActivity.invoke(manager, hack, mContainer.get(hack), null); 


     Method attachBaseContext = getMethod(ContextWrapper.class, "attachBaseContext", Context.class); 
     attachBaseContext.invoke(hack, new HackContext(main)); 
     System.out.println("Hack performed"); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     System.err.println("Hack failed :("); 
    } 

}

Смежные вопросы