Ответ 1
Запуск Activity через DexClassLoader будет очень сложным, потому что вы не установили APK, и поэтому вам нечего справиться с вашим намерением.
У вас должен быть тот же класс активности в вашей APK платформы и объявить его в AndroidManifest.xml. Затем вы должны изменить текущий ClassLoader на желаемый DexClassLoader. В результате он запустит ваш плагин APK. (Примечание: "APK платформы" относится к приложению, которое уже установлено в телефоне, тогда как "плагин APK" относится к файлу apk, сохраненному на вашей SD-карте.)
Приложение платформы должно выглядеть примерно так:
public static ClassLoader ORIGINAL_LOADER;
public static ClassLoader CUSTOM_LOADER = null;
@Override
public void onCreate() {
super.onCreate();
try {
Context mBase = new Smith<Context>(this, "mBase").get();
Object mPackageInfo = new Smith<Object>(mBase, "mPackageInfo")
.get();
//get Application classLoader
Smith<ClassLoader> sClassLoader = new Smith<ClassLoader>(
mPackageInfo, "mClassLoader");
ClassLoader mClassLoader = sClassLoader.get();
ORIGINAL_LOADER = mClassLoader;
MyClassLoader cl = new MyClassLoader(mClassLoader);
//chage current classLoader to MyClassLoader
sClassLoader.set(cl);
} catch (Exception e) {
e.printStackTrace();
}
}
class MyClassLoader extends ClassLoader {
public MyClassLoader(ClassLoader parent) {
super(parent);
}
@Override
public Class<?> loadClass(String className)
throws ClassNotFoundException {
if (CUSTOM_LOADER != null) {
try {
Class<?> c = CUSTOM_LOADER.loadClass(className);
if (c != null)
return c;
} catch (ClassNotFoundException e) {
}
}
return super.loadClass(className);
}
}
Для получения большего количества кода вы можете посетить https://github.com/Rookery/AndroidDynamicLoader
Я читаю исходный код Android, чтобы найти более элегантный метод для реализации этой функции. Если у вас есть идеи, не стесняйтесь обращаться ко мне.