Dalvik——如何控制vm

从ET到PT阶段:一文详解汽车零部件DV与PV测试的完整流程(含常见问题解析) 本文深入解析汽车零部件开发中的DV(设计验证)与PV(性能验证)测试全流程,涵盖从ET到PT阶段的关键技术要点与常见问题解决方案。针对车载开发工程师,提供实战指南与优化策略,帮助提升零部件质量与生产效率,确保符合行业标准与市场需求。 阅读详情

 

一、简介

         Dalvik虚拟机支持一系列的命令行参数(使用adbshell dalvikvm –help获取列表),但是不可能通过android应用运行时来传递任意参数,但是可以通过特定的系统参数来影响虚拟机行为。

         对于下述所有参数,你都可以通过setprop来设置系统特性,shell命令如下:

adbshell setprop <name> <value>

         必须重启android运行时从而使得改变生效(adb shell stop:adb shell start)。这是因为,这些设定在zygote进程中处理,而zygote最早启动并且永远存活。

         你不可以以无特权用户的身份设定dalvik.*参数及重启系统。你可以在用户调试版本的shell上使用adb root或者运行su命令来获取root权限,如有疑问,

adbshell getprop <name>

         可以告诉你setprop是否发生。

         如果你不想在设备重启之后特性消失,在/data/local.prop上加一行:

<name>= <value>

         重启之后这样的改变也会一直存在,但是如果data分区被擦除了就消失了。(提示:在工作台上创建一个local.prop,然后adb push local.prop /data/,或者,使用类似于adb shell “echo name =value >> /data/local.prop”的命令——注意,引号很重要)

 

二、扩展的JNI检测

         JNI(Java Native Interface),java本地接口,提供了java语言程序调用本地(C/C++)代码的方法。扩展的JNI检测会引起系统运行更慢,但是可以发现一系列的讨厌的bug,防止他们产生问题。

         有两个系统参数影响这个功能,这个功能可以通过-Xcheck:jni命令行参数来激活。第一个参数是ro.kernel.android.checkjni,这是通过android编译系统对development的编译来设置的(也可以通过android模拟器设置,除非通过模拟器命令行置了-nojni标志位)。因为这是一个”ro.”特性,设备启动之后参数就不能变了。

         为了能触发CheckJNI标志位,第二种特性是dalvik.vm.checkjni,它的值覆盖了ro.kernel.android.checkjni的值。

         如果这个特性没有被定义,dalvik.vm.checkjni也没有设置成false,那么-Xcheck:jni标志位就没有传入,JNI检测也就没有使能。

         要打开JNI检测,使用以下命令:

adbshell setprop dalvik.vm.checkjni true。

         也可以通过系统特性将JNI检测选项传递给虚拟机,dalvik.vm.jniopts的值可以通过-Xjniopts参数传入,例如:

adb shellsetprop dalvik.vm.jniopts forcecopy

         更多信息见JNI建议。

 

三、断言

         dalvik虚拟机支持java编程语言的断言表达式,默认它是关闭的,但是可以通过-ea参数的方式(dalvikvm –ea …..)设置dalvik.vm.enableassertions特性。

         在其他桌面虚拟机中这个参数同样生效,通过提供class名、package名(后跟“…”),或者特殊值“all”。例如:

adbshell setprop dalvik.vm.enableassertion all

就可以在所有非系统class中使能断言。

         这个系统特性比全命令行更受限制,不可以通过-ea入口设置更多,而且没有指定-da入口的方法,而且未来也没有-esa/-dsa等价的东西。

 

四、字节码校验和优化

         系统尝试预校验dex文件中的所有类,从而降低class的负担,从而可以使用一系列的优化来提升运行性能。这些都是通过dexopt命令来实现的,不论是在编译系统中还是在安装上。在开发设备上,dexopt可能在dex文件第一次被使用时运行,而不论它或者它的依赖是否更新过(Just-in-time优化和校验,JIT)。

         有两个命令行标志位控制JIT优化和校验,-Xverify和-Xdexopt。andorid框架基于dalvik.vm.dexopt-flags特性来配置这俩参数,如果你设定:

adbshell setprop dalvik.vm.dexopt-flags v=a o=v

         那么android框架会将-Xverify:all-Xdexopt:verified传递给虚拟机,这将使能校验并且只优化校验成功的class。这是最安全的设定,也是默认的。

         你也可以设定dalvik.vm.dexopt-flags v=n使得框架传输-Xverify:none –Xdexopt:verified从而不使能校验(我们可以传输-Xdexopt:all从而允许优化,但是这并不能优化更多代码,因为没有通过校验的class可能被优化器以同样的理由跳过)。这时class不会被dexopt校验,而没被校验的代码很大难以执行。

         使能校验会使得dexopt命令明显花费更多时间,因为校验过程相对较慢,一旦校验和优化过的dex文件准备就绪,校验就不会占用额外的开销除非在加载预校验失败的class。

         如果你的dex文件的校验关闭了,而后来又打开了校验器,应用加载会明显变慢(大概40%以上)因为class会在第一次被调用的时候校验。

         为了最佳效果,当特性变化的时候你应该为dex文件强制重新调用dexopt,即:

adbshell “rm /data/dalvik-cache/*”

         它删除了暂存的dex文件,记住要中止再打开运行时(adb shell stop:adb shell start)。

(老的运行时版本支持布尔型的dalvik.vm.verify-bytecode特性,但是被dalvik.vm.dexopt-flags替代了)

 

五、运行模式

当前dalvik vm的实现包括三个独立的解释内核:“快速”(fast)、“可移植”(portable)、“调试”(debug)。快速解释器是为当前平台优化的,可能包括手动优化的汇编文件;相对的,可移植解释器是用C写的,可在广泛的平台上使用;调试解释器是可移植解释器的变种,包括了支持程序分析(profiling)和单步。

vm可能也支持just-in-time编译,严格的说它并不是另一个解释器,JIT编译器也可以被同样的标志位使能/不使能(查看dalvik –help的输出信息来查看JIT编译器是否在你的虚拟机里面使能)。

vm允许你在快速、可移植和jit中选择,通过使用-Xint参数的扩展来实现,该参数的值可以通过dalvik.vm.execution-mode系统特性来设置。为了选择可移植解释器,你应该用:
adb shell setpropdalvik.vm.execution-mode int:portable

如果该参数没有指定,系统会自动选择最合适的编译器,有时候机器可能允许选择其他模式,例如jit编译器。

不是所有的平台都有优化的实现,有时候,快速编译器是由一系列的c实现的,这个结果会比可移植编译器还慢(当我们对所有流行平台都有优化版本的时候,这个命名“快速”就更准确了)。

如果程序分析使能或者调试器连接了,vm会变为调试解释器。当程序分析结束或者调试器中断连接,就会恢复原来的解释器。(用调试解释器会明显变慢,这是在评估数据时要记住的)

JIT编译器可以通过在应用程序AndroidManifest.xml中加入android:vmSafeMode=”true”来不使能,你怀疑JIT编译器会使得你的应用运行不正常的时候可以使用。

 

六、死锁预测

         如果虚拟机以WITH_DEADLOCK_PREDICTION参数编译,那么死锁预测器会在-Xdeadlockpredict参数中使能。(dalvikvm –help会告诉你虚拟机是否编译正确——在Configured中按行查找deadlock_prediction)这个特性会让虚拟机一直跟踪对象的锁获取的顺序,如果程序试图以与之前看到不同的顺序获取一些锁,虚拟机会log一个warning并有选择的抛出异常。

         命令行参数是基于dalvik.vm.deadlock-predict特性设置的,正确的值是off表示不使能它(默认),warn表示log问题但是继续执行,err表示从monitor-enter指令中引发一个dalvik.system.PotentialDeadlockError异常,abort表示终止整个虚拟机。

         你通常可以这么使用:

adbshell setprop dalvik.vm.deadlock-predict err

         除非你可以在log信息滚动的时候一直关注着。

         注意这个特性是死锁预测,不是死锁检测——在当前实现中,在锁被获取之后才会进行计算(这减轻了代码,降低了互斥信息外的冗余)。在挂起的进程中执行kill -3时可以发现一个死锁,并且可以在log信息中检测到。

         这仅仅考虑了监督程序,本地的互斥量和其他资源也会引起死锁,而且不会被它检测到。

 

七、dump堆栈追踪

         和其他桌面虚拟机一样,dalvik虚拟机收到SIGQUIT(Ctrl-\ 或者kill -3)时,会为所有的现成dump所有的堆栈追踪。它默认写入Android 的log,但是也可以写入一个文件。

         dalvik.vm.stack-trace-file特性允许你指定要将线程堆栈追踪写入的文件名,如果不存在,将创建,新的信息将追加到文件尾,文件名通过-Xstacktracefile参数写入虚拟机。例如:

adbshell setprop dalvik.vm.stack-trace-file /tmp/stack-traces.txt

         如果这个特性没有被定义,虚拟机会在收到这个信号时将堆栈追踪信息写入android log。

 

八、dex文件和校验

         出于性能考虑,优化过的dex文件的和校验被取消了,这通常叫安全,因为文件是在设备上产生的,并且有禁止修改的权限。

         但是如果设备的存储器不可靠,就会发生数据损坏,这通常表现为重复的虚拟机崩溃。为了快速诊断这种失败,虚拟机提供了-Xcheckdexsum参数,如果设置了,在内容被使用之前所有的dex文件都会进行和校验。

         如果dalvik.vm.check-dex-sum特性被使能,那么应用框架会在虚拟机创建时提供这个参数。

         为了使能额外的dex和校验,可以:

adbshell setprop dalvik.vm.check-dex-sum true

         不正确的和校验会组织dex数据的使用,产生错误并写入log文件,如果设备曾经有过这样的问题,那么将这个特性写入/data/local.prop很有用。

         注意dexdump工具每次都会进行dex和校验,它也可以用于检测大量的文件。

 

九、产生标志位

         在“Honeycomb”版本中引入了一系列的汇编,它们通过标志位写入虚拟机:

adb shell setprop dalvik.vm.extra-opts “flag1flag2 … flagN”

         这些标志位之间用空格隔开。你可以指定任意多的标志位只要它们在系统特性值的长度范围内(目前是92个字符)。

         这些额外的标志位会被加到命令行的底端,意味着它们会覆盖之前的设定。这些可以用于例如测试不同的-Xmx的值即使android框架层已经设定过了

杰理AC696N系列芯片外部中断使用教程 本教程详细介绍了杰理AC696N芯片的GPIO引脚中断唤醒功能实现方法。主要内容包括: 功能特点: 支持任意GPIO引脚配置为中断源 可灵活选择上升沿或下降沿触发 提供自定义中断回调函数接口 核心实现: 通过port_wkup_interrupt_init()函数配置GPIO属性 使用request_irq()注册中断服务程序 提供中断使能/关闭接口 注意事项: 此功能在低功耗模式下无效 需注意引脚冲突和中断优先级设置 建议在回调函数中实现简洁的逻辑 应用场景: 按键检测 外部信号监测 事件触发等 本方案提 阅读详情

相关推荐

microduck复刻实战:强化学习机器人从仿真训练到真机部署全攻略

强化学习是智能体通过与环境交互试错来学习最优策略的机器学习范式,在机器人控制领域,常借助物理仿真环境进行策略训练,以降低真实世界的试错成本。其核心原理是通过奖励信号引导策略网络迭代优化,PPO等算法则在稳定性和样本效率之间取得平衡。仿真训练的价值在于可批量验证控制策略,但仿真与真实硬件之间存在物理参数偏差,需通过域随机化等技术实现迁移。从四足机器人到仿生机器人,这类方案广泛应用于复杂运动控制任务。microduck作为一个典型的强化学习机器人项目,其复刻过程涉及环境搭建、奖励设计、PPO调参及Sim-to-

weixin_29061425的博客 360

深入探索编译插桩技术(一、编译基础)

编译插桩

QG 722

别再只看K线了!聊聊“板块联动”和“热点轮动”的跟踪方法与工具(实战派分享)

本文深入解析了如何通过板块联动和热点轮动构建高效交易系统。从三维验证框架到主流工具配置,再到持续性热点的五大特征,实战派交易员分享了识别市场主线和预判轮动方向的高阶技巧,帮助投资者摆脱单纯依赖K线的局限,提升交易决策效率。

weixin_29281941的博客 759

android app停止jit,Android关闭JIT的方法

Android关闭JIT的方法Android 2.2的新特性中有条是“使用了全新的JIT内核编译器”,号称性能提高了5倍。有得同学提出JIT会带来稳定性问题,有时会报异常。下面是关闭系统JIT的方法:在AndroidManifest.xml中把的android:vmSafeMode属性设置true就可以对APK禁用JIT。示例:package="test.ts.wader.mytest"andro...

weixin_36199877的博客 909

人大金仓集群部署(主备)

4.2 上传安装包镜像和授权文件到install目录下并授权。1、复制系统脚本到/opt/kingbase目录下(主节点)4.2 修改cluster_install.sh。回车进行下一步,直到出现以下界面,回复Y键回车。三、安装kingbase客户端段(都要安装)install目录作为安装包具体存放目录。4.1 修改install.conf文件。2、复制授权文件到安装目录下(主节点)3、修改ssh参数(节点都要配置)5、安装kingbase客户端。二、基本环境配置(都要配置)6、数据库集群安装(主节点)

edutech_wang的博客 1995

Python模拟发送SOME/IP消息(Scapy模块)

SOMEIP提供服务、订阅、响应、通知等Python代码示例

liluo0815481的博客 3068

关于Android编译,你需要了解什么

本文来自张绍文老师的《Android开发高手课》,我把我认为比较好的文章整理分享给大家。 作为一名 Android 工程师,我们每天都会经历无数次编译。对于小项目来说,半分钟或者1,2分钟即可编译完成,而对于大型项目来说,每次编译可能需要花去一杯咖啡的时间。可能我讲具体的数字你会更有体会,当时我在微信团队时,全量编译 Debug 包需要 5 分钟,而编译 Release 包更是要超过 15 分钟。...

xiangzhihong8的专栏 1445

11、Windows Autopilot 部署与设备注册全攻略

本文详细介绍了Windows Autopilot的完整部署流程,涵盖注册配置文件设置、注册状态页面(ESP)配置、设备注册方法(包括CSV导入、JSON注入、在线注册等)、自动化脚本实现及故障排除技巧。通过手动与PowerShell自动化两种方式指导用户完成配置,并提供流程图、最佳实践和常见问题解答,帮助IT管理员高效实现设备零接触部署与管理。

ii567的博客 342

Dalvik控制VM详解

1.扩展的JNI检测      JNI(Java native Interface)是Java本地接口,提供了Java语言程序调用本地(C/C++)代码的方法。为了能触发CheckJNI标志位,第二种特性是dalvik.vm.checkjni,它的值覆盖了ro.kernel.Android.checkjni的值。如果这个特性没有被定义,dalvik.vm.checkjni也没有设置成false,

CodeMyDream的专栏 2315

基于Python的Booking酒店数据爬虫实战:最新技术与完整代码解析

本文将详细介绍如何使用Python构建一个高效的Booking酒店数据爬虫,涵盖从基础爬取到高级反反爬技术的完整实现。我们将使用最新的Python爬虫技术栈,包括requests-html、Playwright、智能代理轮换等技术,并提供完整的可运行代码示例。文章将深入探讨爬虫的各个组成部分,包括数据提取、存储、反反爬策略以及性能优化等方面。关键词:Python爬虫、Booking数据采集、反反爬技术、Playwright、数据存储。

2201_76125261的博客 936

使用MATLAB的COMSOL LiveLink:实时连接和数据传输

COMSOL LiveLink是一种功能强大的MATLAB工具包,它允许用户在MATLAB环境中与COMSOL Multiphysics软件进行实时连接和数据传输。COMSOL LiveLink是一种功能强大的MATLAB工具包,它允许用户在MATLAB环境中与COMSOL Multiphysics软件进行实时连接和数据传输。使用COMSOL LiveLink,你可以进行更复杂的模型设置和数据传输使用MATLAB的COMSOL LiveLink:实时连接和数据传输。

PixelNinja的博客 2088

【翻译】Dalvik——如何控制vm

一、简介          Dalvik虚拟机支持一系列的命令行参数(使用adbshell dalvikvm –help获取列表),但是不可能通过android应用运行时来传递任意参数,但是可以通过特定的系统参数来影响虚拟机行为。          对于下述所有参数,你都可以通过setprop来设置系统特性,shell命令如下: adbshell setprop          必须

Kuangjp的专栏 843

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Android Dalvik VM GC options 命令控制参数

} else if (strncmp(argv[i], "-Xgc:", 5) == 0) { //In VM thread, there is a register map for marking each stack item's status whether it is an object or internal value. And In GC step, only obje...

PC的€$~!@#% 392

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

android 命令行gc,Android Dalvik VM GC options 命令控制参数

} else if (strncmp(argv[i], "-Xgc:", 5) == 0) {//In VM thread, there is a register map for marking each stack item's status whether it is an object or internal value. And In GC step, only object item ...

weixin_30350469的博客 267

android dalvik heap 浅析

Android 系统中可以在prop中配置dalvik堆的有关设定。具体设定由如下三个属性来控制 -dalvik.vm.heapstartsize                  堆分配的初始大小,调整这个值会影响到应用的流畅性和整体ram消耗。这个值越小,系统ram消耗越慢, 但是由于初始值较小,一些较大的应用需要扩张这个堆,从而引发gc和堆调整的策略,会应用反应

狂奔的奶牛 1090

Android 中的 Dalvik Heap 和 Native Heap

Android程序为什么容易出现OOM 这个是因为 Android系统对 dalvik 的 vm heapsize 作了硬性限制,当 java 进程申请的 java 空间超过阈值时,就会抛出OOM异常(这个阈值可以是48 M、24 M、16 M等,视机型而定),可以通过adb shell getprop 或者 grep dalvik.vm.heapgrowthlimit 查看此值。 也就是说,程序发生 OMM 并不表示 RAM 不足,而是因为程序申请的 java heap 对象超过了 dalvik vm

王温暖的博客 6156

android studio 的gitignore

/build *.iml Android的项目.gitignore文件推荐这么写Built application files*.apk *.ap_Files for the Dalvik VM*.dexJava class files*.classGenerated filesbin/ gen/Gradle files.gradle/ build/Local configuration

xiawu1990的专栏 304

Controlling application separation

From: http://mylifewithandroid.blogspot.com/2009/06/controlling-application-separation.html I thought I knew how application separation in Android works. Then I had a little project and I realiz

CodeJoker的专栏 907
上一篇: dpkg的使用
下一篇: Linux中通过script命令那个记录屏幕的输出
gracioushe
博客等级 码龄25年 62粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值