Android开发之散记

DVM执行 java 程序的工具

2019-05-20  本文已影响37人  迷你小猪
  1. jvm 执行字节码原理:java 程序运行时,是由一个 java 虚拟机来解释 java 字节码的,它将这些字节码翻译成本地 CPU 的指令码,然后执行。
  2. Android 执行指令码原理:Android 应用程序打包成 dex 包后,通过系统程序 dalvikvm 创建一个虚拟机来执行参数中指定的 java 类。相对于 java 而言,负责解释并执行的就是一个虚拟机,而对于 Linux 而言,这就是一个普通的进程,它与一个只有一行代码的 Hello World 的可执行程序无本质区别。
  3. Android 启动一个虚拟机的方法跟启动任何一个可执行程序的方法是相同的,在命令行下输入可执行程序的名称,并在参数中指定要执行的 java 类即可。

dalvikvm

dalvikvm 作用:创建一个虚拟机并执行指定的 java 类

dalvikvm 命令:dalvikvm -cp 文件路径 权限类名
如:
dalvikvm -cp /data/app/Demo.dex Demo

实例演示:


dvz

dvz 作用:从 zygote 进程中孵化出一个新的进程,新的进程也是一个 Dalvik 虚拟机。该进程与 dalvikvm 启动的虚拟机相比,区别在于该进程中已经预装了 Framework 中的大部分类和资源。

dvz 命令:dvz -classpath 文件路径 权限类名
如:
dvz -classpath /system/app/Demo.apk com.my.demo.DemoActivity

关于 Demo.apk,其代码如下:

package com.my.demo;

import android.app.*;

/**
 * 2019-05-18
 * java code for dvz Demo
 */
public class DemoActivity extends Activity {
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_demo);
    }
    
    public static void main(String[] args) {
        System.out.println("DemoActivity::Hello Android:: DemoActivity");
    }
}

上面的 main 函数并不是该程序的入口,只是用来作为开发调试。app 的主入口在 ActivityThread 中。

遗憾的是在系统中暂无 dvz 工具,暂时也未找到 dvz 的相关资料


app_process

app_process 作用:Framework 启动过程中,加载 ZygoteInit.java 和 SystemServer.java,也可以用来调试 java 程序

app_process 命令:app_process -Djava.class.path=文件路径 路径 权限类名

如:app_process -Djava.class.path=/data/app/Demo.dex /data/app Demo


由 app_process 想到的?


补充:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * 2019-05-18
 * java code for shell command demo, pm -l 
 */
public class DemoShellCmd {
    public static void main(String[] args) {
        System.out.println("");
        System.out.println("");
        System.out.println("DemoShellCmd::PMS 程序开始执行...");
        String cmd = "pm -l";
        try {
            Process exec = Runtime.getRuntime().exec(cmd);
            BufferedReader br = new BufferedReader(new InputStreamReader(exec.getInputStream()));
            String readLine=br.readLine();
            while(readLine!=null){
                System.out.println(readLine);
                readLine=br.readLine();
            }
            br.close();
            exec.destroy();
            exec=null;
            System.out.println("");
            System.out.println("");
            System.out.println("DemoShellCmd::PMS 程序执行完成");
        } catch (IOException e) {
            System.out.println("DemoShellCmd::PMS 程序执行异常");
            e.printStackTrace();
        }
    }
}

小结:

  1. 如上总结了 DVM 执行 java 程序的三种工具,也是谷歌早期调试 java 程序的重要工具。其中 dvz 工具暂未发现系统中有集成,也少有此工具的相关介绍。重要的是要学会使用 dalvikvimapp_process 工具,并对 app_process 的触发和流程做拓展,在源码中理解它的工作过程。

  2. 欢迎大家下方评论区留言,拍砖,交流。

  3. qq 邮箱: 1281641968@qq.com

上一篇 下一篇

猜你喜欢

热点阅读