gpt4 book ai didi

android - Android应用程序中使用的类加载器

转载 作者:行者123 更新时间:2023-11-30 03:37:23 25 4
gpt4 key购买 nike

我在处理 Android 应用程序时遇到了一个棘手的问题 - 从应用程序中的 .zip 或 .dex 加载类。我无法处理 Classloader 问题。请帮助我,谢谢。我正在尝试从 zip 加载一个类,但是该类(例如 Android 提供程序或类似的东西)需要在程序启动时加载。所以,我必须在我的程序中留下一个文件,例如,包 com.example.androidprovider 和文件 TestProvider.java。

package com.example.androidprovider;
public class TestProvider extends ContentProvider {
public static final String AUTHORY="com.lcz.tst";
DBHelper dbHelp;
SQLiteDatabase sq;
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
sq.delete(DBHelper.TABLE, selection, selectionArgs);
return 0;
}
...
@Override
public boolean onCreate() {
dbHelp=new DBHelper(getContext(),null, null, 1);
sq=dbHelp.getWritableDatabase();
Log.i("TestProvider", "text");
return true;
}
}

在我的 .zip 文件中,我用包 com.example.androidprovider 和类名 TestProvider 打包了一个类。(这两个类是不同的,第二个类是我真正需要的类(class)。)

package com.example.androidprovider;
public class TestProvider extends ContentProvider {
public static final String AUTHORY="com.lcz.tst";
DBHelper dbHelp;
SQLiteDatabase sq;
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
sq.delete(DBHelper.TABLE, selection, selectionArgs);
return 0;
}
...
@Override
public boolean onCreate() {
dbHelp=new DBHelper(getContext(),null, null, 1);
sq=dbHelp.getWritableDatabase();
Log.i("Original Provider", "This is the original!!!");
return true;
}
}

现在,这是我的加载程序代码。

public void loadDex(String strActivity){
final File optimizedDexOutputPath = oriActivity.getDir("outdex", Context.MODE_PRIVATE);
// Initialize the class loader with the secondary dex file.
//dexInternalStoragePath.getAbsolutePath() is the path there the .zip is,
DexClassLoader cl = new DexClassLoader(dexInternalStoragePath.getAbsolutePath(),
optimizedDexOutputPath.getAbsolutePath(),
libPath,
this.getClass().getClassLoader());
Class<?> cls;
try {
cls = cl.loadClass("com.example.androidprovider.TestProvider");
Object instant = cls.newInstance();
Method method = cls.getDeclaredMethod("onCreate");
method.invoke(instant);
}catch (Exception e) {
e.printStackTrace();
}

我检查了 logcat,但日志总是显示 "TestProvider text"。所以,这意味着我的加载程序代码失败了。我认为原因是,我的应用程序初始化了一个 com.example.androidprovider.TestProvider (第一段代码)类,加载器加载了一个具有相同包和名称的不同类,所以第二类无法加载成功。

但我真的需要加载第二个类。我可以使用一些方法来开始第二节课吗?谢谢...

最佳答案

一种更简洁的方法是通过覆盖 Application 类中的 attachBaseContext() 来修改基础上下文的类加载器。

protected void attachBaseContext(Context base)
{
Log.i(loggerName, "Attaching base context");
super.attachBaseContext(base);

// Modify base.getClassLoader() via reflection.
// Load classes as normal without having to tinker around with loadClass etc.

}

关于android - Android应用程序中使用的类加载器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16435285/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com