am,pm,app_process

本文介绍了在Android环境中启动Java程序的四种主要方法,包括通过Intent启动应用、使用am命令、通过dalvikvm命令以及利用app_process程序。每种方法都有其特点与适用场景。

http://hubingforever.blog.163.com/blog/static/17104057920126166411775/


在Android中启动JAVA程序其实有很多种方式,现总结如下

一、在Android应用程序中发送 Intent启动Android应用程序
这个方式最简单,最常用。在此不在累述。关于Intent的更多内容请阅读《 Intent技术简介
二、shell控制台通过 am命令发送Intent来启动 Android应用程序
在Android的shell控制台通过am命令发送Intent来启动 Android应用程序
关于此的详细内容请参考《 Android命令am详解
三、 shell控制台直接通过 davlikvm命令启动一个JAVA程序。
该方式有个天生的缺点,即在其中,很多Android的JNI无法调用。因为Android的很多JNI其实是需要手动注册的。
关于请参考《 基本Dalvik VM调用》
四、shell 控制台直接 通过运行 app_process 程序启动一个JAVA程序
app_process 程序中,他会对 Android的JNI进行手动注册的,能很好的使用Android的API,因此 通过运行 app_process 程序启动一个JAVA程序,是一个比较完美的方式。 app_process 程序是一个C程序,它的源码位于frameworks\base\cmds\app_process。
关于它的使用请参考 Android命令am详解 》以及shell脚本 frameworks\base\cmds\am\am和frameworks\base\cmds\pm\pm
am脚本文件如下:

# Script to start "am" on the device, which has a very rudimentary
# shell.
#
base=/system
export CLASSPATH=$base/framework/am.jar
exec app_process $base/bin com.android.commands.am.Am "$@"

pm脚本文件如下:

# Script to start "pm" on the device, which has a very rudimentary
# shell.
#
base=/system
export CLASSPATH=$base/framework/pm.jar
exec app_process $base/bin com.android.commands.pm.Pm "$@"

CLASSPATH 指定了你的程序的位置, com.android.commands.pm.Pm 则说明了程序的入口为 com.android.commands.pm.Pm ,即 入口函数 main()所在的 类, " $@ " 就是传递给main()函数的参数,只是这里 " $@ "本身又是个shell传入的参数而已
需要注意的是CLASSPATH中的文件必须是dalvik文件格式的,关于此的转换请参考《基本Dalvik VM调用》 当然CLASSPATH中的文件可以是apk文件,只是你的apk中至少应该有个拥有main()入口函数的类。
10-31 03:32:01.197870 3048 4880 I Athena : OplusClearSystemService: K [10,22719,1010266,com.oplus.gesture,100, reason: 3 o-kill(322)] 15524,1: 10-31 03:32:01.197927 3048 4880 I am_kill : [10,22719,com.oplus.gesture,100,o-kill(322)] 10-31 03:32:01.292418 3048 6844 I ActivityManager: Death received, pid = 22719, processName = com.oplus.gesture for thread android.os.BinderProxy@5b3ceab 10-31 03:32:01.292568 3048 5775 I OplusAppSwitchManagerService: hanldeBinderDied 15581,1: 10-31 03:32:01.296444 3048 8995 I am_proc_died: [10,22719,com.oplus.gesture,100,6] 15707,1: 10-31 03:32:01.829473 3048 3694 I am_proc_start: [10,5047,1010266,com.oplus.gesture,service,{com.oplus.gesture/com.oplus.gesture.OplusAppServicesManagerClient},{ callingPackage = com.oplus.exsystemservice, serviceType = bindService }] 15728,1: 10-31 03:32:02.050959 3048 5118 I am_proc_bound: [10,5047,com.oplus.gesture] 10-31 03:32:02.162647 5047 5047 D ScreenOffGestureStatusProvider: onCreate 10-31 03:32:02.166551 5047 5047 D AndroidRuntime: Shutting down VM 10-31 03:32:02.166758 5047 5047 E AndroidRuntime: FATAL EXCEPTION: main Process: com.oplus.gesture, PID: 5047 java.lang.RuntimeException: Unable to get provider androidx.startup.InitializationProvider: g1.d: android.content.pm.PackageManager$NameNotFoundException: ComponentInfo{com.oplus.gesture/androidx.startup.InitializationProvider} at android.app.ActivityThread.installProvider(ActivityThread.java:9465) at android.app.ActivityThread.installContentProviders(ActivityThread.java:8975) 帮我分析下这个异常的原因
11-05
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值