用DexClassLoader加载jar没什么难度,不过用无参数的构造行数反射调用apk中的Activity就有问题,被调用的Activity中
super.onCreate(savedInstanceState);会报错,这个Activity没有被正常的初始化,Activity的父父类ContextWrapper的构造函数需要Context。只能修改要被调用的Activity了,注释掉上面出错的那行,然后提供一个有参构造函数,传一个Context过去,以后被调用的Activity里面只能使用这个Context了.
String dexPath = Environment.getExternalStorageDirectory()
+ "/Test/AAA.apk";
PackageInfo packageInfo = getPackageManager().getPackageArchiveInfo(
dexPath, PackageManager.GET_ACTIVITIES);
String activityName = packageInfo.activities[0].name;
File dirFile = getDir("whocares", 0);
DexClassLoader loader = new DexClassLoader(dexPath,
dirFile.getAbsolutePath(), null,
ClassLoader.getSystemClassLoader());
try {
Class clz = loader.loadClass(activityName);
Constructor constructor = clz
.getConstructor(new Class[] { Context.class });
Activity activity = (Activity) constructor
.newInstance(new Object[] { this });
Method create = clz.getDeclaredMethod("onCreate",
new Class[] { Bundle.class });
create.setAccessible(true);
create.invoke(activity, new Object[] { null });
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}