Ric*_*red 18 android auto-update
我正在尝试做类似于stackoverflow发布的事情.我想要做的是从SD卡读取活动或服务的定义.为了避免明显的权限问题,我在.apk中创建了此活动的shell版本,但尝试将其替换为运行时驻留在SD卡上的同名活动.不幸的是,我能够使用DexClassLoader从SD卡加载活动类定义,但原始的类定义是执行的定义.有没有办法指定新的类定义替换旧的类定义,或者有关避免清单权限问题的任何建议,而不实际提供包中所需的活动?代码示例:
ClassLoader cl = new DexClassLoader("/sdcard/mypath/My.apk",
getFilesDir().getAbsolutePath(),
null,
MainActivity.class.getClassLoader());
try {
Class<?> c = cl.loadClass("com.android.my.path.to.a.loaded.activity");
Intent i = new Intent(getBaseContext(), c);
startActivity(i);
}
catch (Exception e) {
Run Code Online (Sandbox Code Playgroud)
启动com.android.my.path.to.a.loaded.activity指定的Intead /sdcard/mypath/My.apk,它启动静态加载到项目中的活动.
Sim*_*Sun 15
通过DexClassLoader启动一个Activity会非常棘手,因为你没有安装APK,所以没有什么可以处理你的Intent.
您应该在平台APK中拥有相同的活动类,并在AndroidManifest.xml中声明它.然后,您应该将当前的ClassLoader更改为您想要的DexClassLoader.因此,它将启动您的插件APK.(注意:"平台APK"是指已经安装在手机中的应用程序,而"插件APK"是指保存在SD卡中的apk文件.)
该平台的应用程序应如下所示:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
有关更多代码,请访问https://github.com/Rookery/AndroidDynamicLoader
我正在阅读Android源代码,以便找到更优雅的方法来实现此功能.如果您有任何想法,请随时与我联系.
| 归档时间: |
|
| 查看次数: |
11347 次 |
| 最近记录: |