Изображения не загружаются должным образом с DexClassLoader - PullRequest
0 голосов
/ 29 марта 2020

У меня есть APK с class, расширяющим абстрактный класс AbstractPluggableViews. AbstractPluggableViews дочерний класс вызывает изображение png в ImageView. Однако во время выполнения я загружаю другое изображение в ImageView, отличное от того, которое я вызывал.

Даже ImageView.setColorFilter() и ImageView.setBackgroundColor() не дают намеченных цветов.

Это дочерний класс плагинов:

public class MyPluginClass extends AbstractPluggableViews {

    private Context mContext;

    public MyPluginClass(Context mContext) {
        super(mContext);
        this.mContext = mContext;
    }

    @Override
    public ImageView getMyPluginView() {
        int imageSize = 100;

        ImageView imageView = new ImageView(mContext);
        imageView.setColorFilter(mContext.getResources().getColor(R.color.my_teal_dark));
        imageView.setBackgroundColor(ContextCompat.getColor(mContext, R.color.my_default_background));
        imageView.setLayoutParams(new LinearLayout.LayoutParams(imageSize, imageSize));

        Picasso.get()
                .load(R.drawable.ic_contacts_black_48dp)
                .resize(imageSize, imageSize)
                .centerCrop()
                .into(imageView);

        return imageView;
    }
}  

Так я вызываю и создаю экземпляры классов, используя DexClassLoader:

public class LoadedPlugin {

    final private Context baseContext;
    final private PluginContext pluginContext;
    final private String apkPath;
    final private DexClassLoader dexClassLoader;

    final private AbstractPluggableViews abstractPluggableViews;

    public LoadedPlugin(Context context, String _apkPath) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {

        this.baseContext = context;
        this.apkPath = _apkPath;

        File codeCacheDir;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            codeCacheDir = context.getCodeCacheDir();
        } else {
            codeCacheDir = context.getCacheDir();
        }

        dexClassLoader = new DexClassLoader(apkPath, codeCacheDir.getAbsolutePath(), null, context.getClassLoader());
        pluginContext = new PluginContext(baseContext, apkPath);

        File apkFile = new File(apkPath);

        String apkName = apkFile.getName().replace(".apk", "").toLowerCase();
        String viewCreatorClassName = "com.my_app." + apkName + ".MyPluginClass";

        Class myClass = dexClassLoader.loadClass(viewCreatorClassName);

        Constructor constructor = myClass.getConstructor(Context.class);

        abstractPluggableViews = (AbstractPluggableViews) constructor.newInstance(pluginContext);
    }

    public AbstractPluggableViews getAbstractPluggableViews() {
        return abstractPluggableViews;
    }
}  
...