相关疑难解决方法(0)

动态生成Dalvik字节码到运行的Dalvik/Android应用程序

关于在运行时动态生成和加载java字节码到运行的Dalvik VM,已经多次询问(和回答)这个问题,但有没有办法在运行时将dex文件/字节码加载到应用程序中?

谢谢

android dalvik

25
推荐指数
2
解决办法
8737
查看次数

Android,如何使用DexClassLoader动态替换Activity或Service

我正在尝试做类似于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,它启动静态加载到项目中的活动.

android auto-update

18
推荐指数
1
解决办法
1万
查看次数

在Android 5.0上动态加载DEX文件

在Android 5.0之前,我能够使用DexClassLoader和调用loadClass()方法动态加载DEX文件,但是使用最新的Android版本,我得到了一个ClassNotFoundException.

这是我在做的事情:

  1. 生成DEX文件.

    ../android-sdk/android-sdk-linux_86/build-tools/21.1.1/dx --dex --output=bin/output.dex  bin/output.jar
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建一个DexClassLoader.

    DexClassLoader cl = new DexClassLoader(
    dexFile.getAbsolutePath(),
    odexFile.getAbsolutePath(),
    null,
    mContext.getClassLoader());
    
    Run Code Online (Sandbox Code Playgroud)
  3. 呼叫 cl.loadClass("myMethod");

我知道ART使用dex2oat来生成一个由ART加载的ELF文件但是在步骤2中我生成了一个ODEX文件,因此我不需要在ART中运行以在运行时加载DEX文件,任何人都可以帮助我 ?

android classloader dex android-runtime dex2oat

15
推荐指数
1
解决办法
6947
查看次数