假设当前路径下有一个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.bat
或 d8
所在目录(如 build-tools/<版本>/
)添加到系统PATH。
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线程