Android函数插桩,Android 代码插桩 ~ Misaki’s Blog
8种机械键盘轴体对比
本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?
何为代码插桩
最早是由J.C. Huang 教授提出的,它是在保证被测程序原有逻辑完整性的基础上在程序中插入一些探针(又称为“探测仪”,本质上就是进行信息采集的代码段,可以是赋值语或采集覆盖信息的函数调用,通过探针的执行并抛出程序运行的特征数据,通过对这些数据的分析,可以获得程序的控制流和数据流信息,进而得到逻辑覆盖等动态信息,从而实现测试目的的方法。
何为安卓插桩测试,插桩测试提供了一种通过 am instrument 命令启动的特殊测试执行环境,其中目标应用进程会重启并使用基本的应用上下文进行初始化,并在应用进程虚拟机内启动插桩线程。您的测试代码在此插桩线程上开始执行,并附带一个 Instrumentation 实例,该实例可提供对应用上下文和 API 的访问权限,以操纵接受测试的应用进程。
详细内容可以查看谷歌的插桩测试框架和方式:插桩测试
Log插桩
此处,仅利用打印Log的方式来表示如何进行插桩。代码使用之前调试的代码,尝试来打印输入的字符串。
反编译后如下代码:
分析代码可以看到,如果需要打印输出,则实际获取到字符串的代码为Name.getText().toString().trim()
因此,需要在onClick函数中打印输出,函数需要在按钮事件中触发,按钮相关的事件代码在MainActivity$1中。
在MainActivity$1中查看onClick函数。
假设,需要打印输入的name变量。则需要在如下添加:iget-object v1, p0, Lcom/example/user/application/MainActivity$1;->this$0:Lcom/example/user/application/MainActivity;
iget-object v1, v1, Lcom/example/user/application/MainActivity;->Name:Landroid/widget/EditText;
invoke-virtual {v1}, Landroid/widget/EditText;->getText()Landroid/text/Editable;
move-result-object v1
invoke-virtual {v1}, Ljava/lang/Object;->toString()Ljava/lang/String;
move-result-object v1
此内容为上图中关于带入name的smali代码,意思是,从MainActivity获取实例对象。赋值给v1寄存器,然后再调用getText()函数和toString()函数。
在添加const-string v0, "message"
invoke-static {v0, v1}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I
意思是调用Log.i函数打印输入,如上添加内容换算成Java代码类似于Log.i("message",Name.getText().toString());
回编译安装运行,监听日志输出,点击按钮事件可以看到如下的日志输出。
此种形式可以用在获取函数变量值和某些动态生成的参数中,来理解程序运行的结果和函数运行的方式。
Android函数插桩,Android 代码插桩 ~ Misaki’s Blog相关推荐
- android 函数返回string,Android应用开发之android 对话框对于返回值的处理方法
本文将带你了解Android应用开发之android 对话框对于返回值的处理方法,希望本文对大家学Android有所帮助. android对话框是异步的,因此无法获得其返回值. 例如: 我们给出一个提 ...
- android 函数名注册,Android JNI 函数注册的两种方式(静态注册/动态注册)
在Android开发中,由于种种原因我们需要调用C/C++代码, 这个时候就要用到Android开发者都听说过的JNI(Java Native Interface)了, 在调用JNI相关方法之前, 要 ...
- android函数未定义,android – 方法findViewById(int)未定义
我是 Android开发的新手,我正在尝试编写一个小应用程序,它允许我获取外部JSON文件并解析它.我得到了它的工作,但如果我尝试在后台执行它作为AsyncTask它不会工作. Eclipse给了我错 ...
- android 函数文档,Android文档ActivityManager.RunningTaskInfo翻译
ActivityManager.RunningTaskInfo 结构 继承关系 public class ActivityManager.RunningTaskInfo extends Object ...
- appium android函数,appium连接Android真机,并调试
Android真机:华为pad2 Android和Windows连接同一个局域网 连接USB Android机设置: 打开USB调试 cmd>adb devices,显示Android序列号 , ...
- 【Android 逆向】函数拦截 ( GOT 表拦截 与 插桩拦截 | 插桩拦截简介 | 插桩拦截涉及的 ARM 和 x86 中的跳转指令 )
文章目录 一.GOT 表拦截与插桩拦截 二.插桩拦截简介 三.插桩拦截涉及的 ARM 和 x86 中的跳转指令 一.GOT 表拦截与插桩拦截 函数拦截有 222 种方式 : 使用 GOT 表进行函数拦 ...
- Android实现无痕埋点具体实现-采用代码插桩的方式
目录 1.View.AccessibilityDelegate 1.1先看下为什么采用View.AccessibilityDelegate方式,通过View源码如何执行点击事件: 1.2完成替换Vie ...
- 编译器 LLVM Clang原理与实战 制作自己的编译器 source-to-source 源代码转换 编译遍 compile pass 代码插桩
编译器 LLVM Clang原理与实战 参考1 clang LLVM CMU 教案 深入剖析-iOS-编译-Clang-LLVM LLVM_proj LLVM编程索引 llvm源码浏览带跳转 llvm ...
- 【字节码插桩】AOP 技术 ( “字节码插桩“ 技术简介 | AspectJ 插桩工具 | ASM 插桩工具 )
文章目录 一." 字节码插桩 " 技术简介 二.AspectJ 插桩工具 三.ASM 插桩工具 一." 字节码插桩 " 技术简介 性能优化 , 插件化 , 热修 ...
- 【转载】Android音频(7)——项目实战——耳麦插拔
Android音频(7)--项目实战--耳麦插拔 7.4.3 声音路由切换实例分析 · 深入理解Android:卷1 · 看云 一.驱动程序上报耳麦拔插事件 1. 在有些Android版本中并不会在状 ...
最新文章
- supervisor 守护php,laravel队列之Supervisor守护进程(centos篇)
- python字符串出栈方法_python字符串常用方法
- 【Java源码分析】Android-LruCache源码分析
- TCP/IP详解--第五章
- Spring Security(一):整合JWT
- python调用java方法_python加载和使用java的类的方法
- Java 网络实例一(获取指定主机的IP地址、查看端口是否已使用、获取本机ip地址及主机名、获取远程文件大小)
- bitcoin jsonrpc java_BitcoinCore JSONRPC Java使用创建账号,获取余额,转账等等...
- 微信小程序开发的游戏《拼图游戏》
- C++ 返回类型协变
- 光盘装系统和U盘装系统有什么区别吗?
- linux vi编辑撤销,vi撤销命令(u和U),撤销上一次的操作
- VGG16和VGG19的理解
- 计算机关于职业与道德的论文怎么写,计算机职业道德论文提纲模板 计算机职业道德论文大纲怎么写...
- 林軒田《机器学习基石》课程总结
- 鲁大师 android模拟器,手机模拟大师怎么安装?鲁大师安卓模拟器安装教程
- iphone计算机照片大小,如何把iphone照片导入电脑 四种方法分享【图文】
- iphone邮件服务器 263,在iphone上怎么设置263邮箱
- ASO优化之AppStore规则介绍
- 企业WAP建站的10个理由
热门文章
- 都说程序员秃头996,你见过游戏3D建模师爆肝007吗?
- word自动生成目录和页码设置
- webgame php源码,最WEB游戏源码服务端(完整修改版).doc
- MySQL5.7 Group Replication (MGR)
- java 调用本地播放器_Java调用本地播放器播放视频文件
- 微服务超 10 万、跨语言场景,字节服务网格依靠 CloudWeGo 扛住流量洪峰
- iTunes修改备份文件路径
- 钓鱼网站制作 ---- Setoolkit 克隆web页面钓鱼
- latex 去掉(不显示)空白页的页码与页眉
- windows共享时出现“指定网络名不再可用”解决办法