如何访问Android应用程序的classes.dex?

时间:2012-04-12 11:46:34

标签: android directory install

启动活动时,系统会加载classes.dex文件并开始执行指令。我需要只读访问当前活动正在执行的同一应用程序的classes.dex。

在网上搜索了几个小时后,我只能推断Android安全系统不允许访问应用程序沙箱。

但是,我需要readonly访问classes.dex文件才能完成我的任务。

有没有人对此有所了解?

提前致谢!

2 个答案:

答案 0 :(得分:4)

取决于您要执行的操作,但您可以访问DexFile:

String sourceDir = context.getApplicationInfo().sourceDir;
DexFile dexFile = new DexFile(sourceDir);

它为您提供了一个http://developer.android.com/reference/dalvik/system/DexFile.html,您可以枚举它,并从中加载类。

答案 1 :(得分:2)

你可以为" classes.dex"获得一个InputStream。通过以下方式:

  1. 检索应用程序的apk容器的路径。
  2. 检索" classes.dex"感谢JarFile类,在你的apk容器中输入。
  3. 获取输入流。
  4. 以下是一段代码示例:

            // Get the path to the apk container.
            String apkPath = getApplicationInfo().sourceDir;
            JarFile containerJar = null;
    
            try {
    
                // Open the apk container as a jar..
                containerJar = new JarFile(apkPath);
    
                // Look for the "classes.dex" entry inside the container.
                ZipEntry ze = containerJar.getEntry("classes.dex");
    
                // If this entry is present in the jar container 
                if (ze != null) {
    
                     // Get an Input Stream for the "classes.dex" entry
                     InputStream in = containerJar.getInputStream(ze);
    
                     // Perform read operations on the stream like in.read();
                     // Notice that you reach this part of the code
                     // only if the InputStream was properly created;
                     // otherwise an IOException is raised
                }   
    
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (containerJar != null)
                    try {
                        containerJar.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
            }
    

    希望它有所帮助!