Android直接执行Java程序

20 阅读1分钟

假设当前路径下有一个Hello.java文件,内容如下:

package com.pujh.test;

public class Hello {
    public static void main(String args[]) {
        System.out.println("Hello World");
    }
}

Java环境执行流程

1. 编译Java文件

javac -d . Hello.java

生成路径:com/pujh/test/Hello.class

2. 执行程序

java com.pujh.test.Hello

Android环境执行流程

Android SDK中的 dx/d8 工具将Java字节码转换为Dalvik可执行文件(dex),以便在Android设备上运行。

1. 环境配置
将Android SDK中 dx.batd8 所在目录(如 build-tools/<版本>/)添加到系统PATH。

blog.csdn.net/qq_45649553…

2. 编译与转换

  • 使用新版d8工具
    d8 --output=Hello.jar com/pujh/test/Hello.class
    
  • 旧版SDK使用dx工具
    dx --dex --output=Hello.jar com/pujh/test/Hello.class
    

3. 推送文件到设备

adb push Hello.jar /sdcard/

4. 在设备上执行
方式一:dalvikvm命令

adb shell dalvikvm -cp /sdcard/Hello.jar com.pujh.test.Hello

方式二:app_process命令

adb shell CLASSPATH=/sdcard/Hello.jar app_process ./ com.pujh.test.Hello

两种执行方式的区别

通过 ps -A 获取进程id,然后进行线程分析。

命令如下:

# 查看进程ID
ps -A | grep -E 'dalvikvm|app_process'

# 分析线程(替换xxx为进程ID)
cd /proc/xxx/task/
for i in *; do cat $i/comm; done

dalvikvm线程打印

main
Jit thread pool
Runtime worker
Runtime worker
Runtime worker
Runtime worker
Signal Catcher
HeapTaskDaemon
ReferenceQueueD
FinalizerDaemon
FinalizerWatchd

app_process线程打印

main
Jit thread pool
Runtime worker
Runtime worker
Runtime worker
Runtime worker
Signal Catcher
perfetto_hprof_
HeapTaskDaemon
ReferenceQueueD
FinalizerDaemon
FinalizerWatchd
Binder:5817_1
Binder:5817_2

最大区别是后者创建了binder线程