一个Android代码JIT友好度检测工具

利用周末的时间,写了一个检测Android代码JIT友好度的工具,取个名字为DroidJitChecker。希望可以帮助大家快速发现有坏味道的代码,并且及时修正。

名词解释

  • JIT:JIT全称Just-in-time compilation。意思为实时编译,是JVM中一种优化技术,对频繁调用并且符合条件的方法进行优化将字节码翻译成机器代码,提升执行效率。
  • 方法大小:每个方法的方法体实现都可用字节作为单位进行衡量,通常情况下,方法体越大,其方法大小也越大。
  • JIT友好:通常方法体实现越小越简单,越对JIT编译友好。

这是什么

  • 这是一个检测Android(目录组织结构)代码JIT友好度的工具
  • 该工具基于AdoptOpenJDK/jitwatch中的jarScan.sh进行组装
  • 输出结果支持html,便于在浏览器中查看

前提准备

  • 所检测Android项目可以支持Gradle编译成功
  • 安装jitwatch套件
  • ruby运行环境

安装

安装jitwatch组件

获取代码

1

git clone git@github.com:AdoptOpenJDK/jitwatch.git

编译 进入上面的repo目录,采用以下三种方法之一即可

ant

1

ant clean compile test run

Maven

1

mvn clean compile test exec:java

Gradle

1

gradlew clean build run

配置

获取本repo的代码,并打开config.ini文件修改

1 2 3 4

[setup] jarScan = "/Users/androidyue/github/jitwatch/jarScan.sh" maxMethodSize = 325 outputDir = "/tmp/DroidJitChecker/output_new/"

修改说明

  • jarScan 必须修改,修改成已经安装的的JarScan路径
  • maxMethodSize 无需更改,如更改请谨慎
  • 输出目录,outputDir,建议修改为可以持续存在的目录

如何使用

使用比较简单,打开终端,执行如下语句

1

ruby jitChecker.rb your_android_project jarTask

注意:jarTask是一个将工程的java文件编译成jar包的任务,可以通过执行./gradlew tasks 查看,然后选择以jar开头的任务即可。

查看结果

  • 检查结束后,会自动使用浏览器打开结果
  • 结果文件路径也会输出到终端
  • 结果文件名中包含了相关的jarTask信息,便于查找
  • 结果内容,依照方法的字节大小,从大到小降序排列

一个典型的内容示例

1 2 3 4 5

MD4.mdfour64 Package:com.app.utils Parameters:int[] ByteSize:1129

  • MD4.mdfour64 对JIT不友好的方法及其所属类
  • Package:com.app.utils 上述MD4所属的包
  • Parameters:int[] mdfour64方法接受的参数
  • ByteSize:1129 表示mdfour64方法持有的大小

如何解决

  • 书写逻辑简单,职责单一的小方法
  • 书写逻辑简单,职责单一的小方法
  • 书写逻辑简单,职责单一的小方法

贡献代码

任何有帮助的建议都欢迎。

以下代码贡献更收欢迎

  • 美化结果展示页面(HTML,CSS)

问题

问:字节量大的方法一定要修改么,修改后就能JIT编译么

  • 答:字节量大的方法建议修改,非强制,修改后不一定就能JIT编译,因为对JIT优化并不意味着JIT就编译该方法,还需要其他因素,比如该方法的调用频率。所以这是一个你情我愿的事情。

为什么用Ruby

  • 答:有了idea时很纠结,因为不确定用什么语言实现,尤其是在Python和ruby之间,为此问了不少同学,最后“一意孤行”决定用Ruby了,不喜欢Python的强制对齐,超级喜欢Ruby的字符串模板。Ruby很简单,很人性化,相信你会喜欢的。

源码

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏漏斗社区

您有一份CTF代码审计文件等待查收

0x01 背景 上周总结了一些文件包含与伪协议结合的利用方法,本周就找一道例题进行演练。题目源自国外某挑战平台,平台上还有许多其他有趣的challenges题目...

3845
来自专栏Java3y

COW奶牛!Copy On Write机制了解一下

触及到知识的盲区了,于是就去搜了一下copy-on-write写时复制这个技术究竟是怎么样的。发现涉及的东西蛮多的,也挺难读懂的。于是就写下这篇笔记来记录一下我...

1673
来自专栏信安之路

通过POC来学习漏洞的原理

本文介绍的是 easyFTPServer 1.7.0.2 ‘Http’ remote Buffer Overflow 的漏洞执行流程,通过已知的 POC 来推断...

1510
来自专栏大前端_Web

nodejs学习一CommonJS和AMD

版权声明:本文为吴孔云博客原创文章,转载请注明出处并带上链接,谢谢。 https://blog.csdn.net/wkyseo/articl...

2062
来自专栏专注 Java 基础分享

弄懂 JRE、JDK、JVM 之间的区别与联系

其实很多 Java 程序员在写了很多代码后,你问他 jre 和 jdk 之间有什么关系,jvm 又是什么东西,很多人不知所云。本篇不会讲述 jvm 底层是如何与...

3674
来自专栏IT技术精选文摘

RPC原理及实现

1 简介 RPC 的主要功能目标是让构建分布式计算(应用)更容易,在提供强大的远程调用能力时不损失本地调用的语义简洁性。为实现该目标,RPC 框架需提供一种透明...

7209
来自专栏非著名程序员

Android Studio你不知道的调试技巧

? 写代码不可避免有Bug,通常情况下除了日志最直接的调试手段就是debug;那么你的调试技术停留在哪一阶段呢?仅仅是下个断点单步执行吗?或者你知道 Eval...

29310
来自专栏Java帮帮-微信公众号-技术文章全总结

Web-第二十天 Redis学习【悟空教程】

rpm -e --nodeps java-1.6.0-openjdk-1.6.0.0-1.66.1.13.0.el6.i686

1835
来自专栏java一日一条

40+个对初学者非常有用的PHP技巧(二)

考虑使用ob_gzhandler?不,别这样做。它没有任何意义。PHP应该是来写应用程序的。不要担心PHP中有关如何优化在服务器和浏览器之间传输的数据。

931
来自专栏码洞

求不更学不动之Redis5.0新特性Stream尝鲜

Redis5.0最近被作者突然放出来了,增加了很多新的特色功能。而Redis5.0最大的新特性就是多出了一个数据结构Stream,它是一个新的强大的支持多播的可...

1752

扫码关注云+社区

领取腾讯云代金券