Android:动态卸载的apk加载

Android:动态卸载的apk加载,android,dynamic-class-loaders,dexclassloader,Android,Dynamic Class Loaders,Dexclassloader,我试图建立一个应用程序,允许用户安装额外的插件的应用程序。我正在将插件模块构建为apk,并尝试在运行时使用DexClassLoader加载这些类 当我调用非活动类时,效果很好。当我尝试启动一个活动时,它会给我一个错误,说“未找到活动”。您是否在AndroidManifest.xml中声明了该活动 有没有一种方法可以让我的插件apk中的资源正常工作 public class MainActivity extends AppCompatActivity { private DexClassL

我试图建立一个应用程序,允许用户安装额外的插件的应用程序。我正在将插件模块构建为apk,并尝试在运行时使用DexClassLoader加载这些类

当我调用非活动类时,效果很好。当我尝试启动一个活动时,它会给我一个错误,说“未找到活动”。您是否在AndroidManifest.xml中声明了该活动

有没有一种方法可以让我的插件apk中的资源正常工作

public class MainActivity extends AppCompatActivity {
    private DexClassLoader mDexClassLoader;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        loadApk();

        Button launchBtn = (Button) findViewById(R.id.launch_btn);
        launchBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (mDexClassLoader != null) {
                    try {
                        //Works Fine
                        Class<?> clazz = mDexClassLoader.loadClass("com.dexplugintest.ToastTest");
                        Object object = clazz.newInstance();
                        Method toastMethod = clazz.getMethod("showToast", Context.class, String.class);
                        toastMethod.invoke(object, MainActivity.this, "Hello from test app!");

                        //Gives Error
                        Class calledClass = mDexClassLoader.loadClass("com.dexplugintest.PluginLaunchActivity");
                        Intent intent = new Intent(MainActivity.this, calledClass);
                        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        startActivity(intent);
                    } catch (Exception exception) {
                        // Handle exception gracefully here.
                        exception.printStackTrace();
                    }
                }
            }
        });
    }

    private void loadApk() {
        File file = DexUtil.copyFileToInternal(this, "app-debug.apk");

        if (file != null) {
            File optimizedDexOutputPath = getDir("outdex", Context.MODE_PRIVATE);
            mDexClassLoader = new DexClassLoader(file.getAbsolutePath(),
                    optimizedDexOutputPath.getAbsolutePath(),
                    null,
                    getClassLoader());
        }
    }
}
public类MainActivity扩展了AppCompatActivity{
私有DexClassLoader MDSSLoader;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
loadApk();
按钮launchBtn=(按钮)findviewbyd(R.id.launch\u btn);
launchBtn.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
if(MDSSloader!=null){
试一试{
//很好
Class clazz=mdapprowsloader.loadClass(“com.dexpluginest.toast测试”);
Object=clazz.newInstance();
方法toastMethod=clazz.getMethod(“showtoos”,Context.class,String.class);
调用(对象,MainActivity.this,“来自测试应用的你好!”);
//出错
类calledClass=mdExportsLoader.loadClass(“com.dexpluginest.pluginLunchActivity”);
意向意向=新意向(MainActivity.this,称为类);
intent.setFlags(intent.FLAG\u活动\u新任务);
星触觉(意向);
}捕获(异常){
//在这里优雅地处理异常。
异常。printStackTrace();
}
}
}
});
}
私有void loadApk(){
File File=DexUtil.copyFileToInternal(这是“app debug.apk”);
如果(文件!=null){
文件optimizedDexOutputPath=getDir(“outdex”,Context.MODE\u PRIVATE);
MDEQUOTSSLOADER=新的DexClassLoader(file.getAbsolutePath(),
optimizedDexOutputPath.getAbsolutePath(),
无效的
getClassLoader());
}
}
}

您计划在哪里发布此应用程序?Play Store已经发布了我计划在Play Store分发的应用程序中使用的公共软件。这是新事物吗?有些图书馆提供了这种方法,但它们已经有几年的历史了。我无法使用这些库。有没有更好的方法来实现Android应用程序的插件式架构?“这是新的东西吗?”——条款和条件中的特定限制是新的。“有没有更好的方法为Android应用程序实现插件式架构?”——标准IPC。插件公开活动、服务、提供者和/或接收者,插件主机通过这些组件与插件通信。我们将对此进行调查。感谢您提供@commonware的信息