1.android ddms heap内存分析工具使用步骤(监测内存)
2.代码分析神器:understand、码分bouml
3.AS自带的析工 检测工具Lint
4.安卓逆向工具-JD-GUI
5.Android apk分析工具: APK分析器
6.Android Adb 源码分析(一)
android ddms heap内存分析工具使用步骤(监测内存)
无 论怎么小心,想完全避免bad code是码分不可能的,此时就需要一些工具来帮助我们检查代码中是析工否存在会造成内存泄漏的地方。 Android tools中的码分DDMS就带有一个很不错的内存监测工具Heap(这里我使用eclipse的ADT插件,并以真机为例,析工PDB指标源码在模拟器中的码分情 况类似)。
用Heap监测应用进程使用内存情况的析工步骤如下:
1。 启动eclipse后,码分切换到DDMS视图,析工并确认Devices视图、码分Heap视图都是析工打开的;2。 将手机通过USB链接至电脑,码分链接时需要确认手机是析工处于“USB调试”模式;3。
链接成功后,码分在DDMS的Devices视图中将会显示手机设备的序列号,以及设备中正在运行的部分进程信息;4。 点击选中想要监测的进程,比如system_process进程;5。 点击选中Devices视图界面中最上方一排图标中的“Update Heap”图标;6。
点击Heap视图中的“Cause GC”按钮;7。 此时在Heap视图中就会看到当前选中的进程的内存使用量的详细情况[如图所示]。说明:a) 点击“Cause GC”按钮相当于向虚拟机请求了一次gc操作;b) 当内存使用信息第一次显示以后,无须再不断的点击“Cause GC”,Heap视图界面会定时刷新,在对应用的不断的操作过程中就可以看到内存使用的变化;
如何才能知道我们的程序是否有内存泄漏的可能性呢。
这里需要注意一个值:Heap视图中部有一个Type叫做data object,即数据对 象,也就是我们的程序中大量存在的类类型的对象。在data object一行中有一列是“Total Size”,其值就是当前进程中所有Java数据 对象的内存总量,一般情况下,这个值的大小决定了是否会有内存泄漏。
可以这样判断:
a) 不断的操作当前应用,同时注意观察data object的Total Size值;b) 正 常情况下Total Size值都会稳定在一个有限的范围内,也就是说由于程序中的的代码良好,没有造成对象不被垃圾回收的情况,所以说虽然我们 不断的操作会不断的生成很多对象,而在虚拟机不断的net自动缩小源码进行GC的过程中,这些对象都被回收了,内存占用量会会落到一个稳定的水平;c) 反之如果代码中存在没有释放对象引用的情况,则data object的Total Size值在每次GC后不会有明显的回落,随着操作次数的增多Total Size的值会越来越大。
直到到达一个上限后导致进程被kill掉。d) 此处已system_process进程为例,在我的测试环境中system_process进程所占用的内存的data object的Total Size正常情况下会稳定在2。2~2。
8之间,而当其值超过3。后进程就会被kill。
总之,使用DDMS的Heap视图工具可以很方便的确认我们的程序是否存在内存泄漏的可能性。如果使用DDMS确实发现了我们的程序中存在内存泄漏,那又如何定位到具体出现问题的代码片段,最终找到问题所在呢?如果从头到尾的分析代码逻 辑,那肯定会把人逼疯,特别是在维护别人写的代码的时候。
这里介绍一个极好的内存分析工具 -- Memory Analyzer Tool(MAT)。
代码分析神器:understand、bouml
在工程源码分析中,面对复杂的函数调用关系,特别是开源项目如Linux、Android源码或第三方库时,自行梳理难度较大。这时,借助代码分析工具能提供极大帮助。以下介绍两款工具:understand和bouml。
bouml是一款面向对象语言分析工具,支持C++、Java、IDL、PHP、Python、MySQL等。在4.版本之前提供免费版,但可能存在一些bug,例如误删调用关系后无法恢复。如何阅读hive源码对于专业使用,建议购买正版。bouml主要用于分析类继承与函数调用关系。
understand软件虽无免费版本,但CSDN上能找到注册机下载。支持多种编程语言,包括C、C++、C#、Ada、Java、Fortran、Delphi、Jovial等,尤其适合嵌入式工程师。了解其功能后,网上能找到大量使用教程。
bouml利用UML生成调用关系图,提供时序图等可视化展示,有助于理解函数生命周期。除此之外,市场上还有更多付费UML工具,功能更加强大。
understand则提供了详细的代码分析功能,通过官网scitools.com可了解更多信息。在源码分析过程中,运用understand和bouml可大幅提升效率与准确性。
AS自带的 检测工具Lint
Lint 是 Android Studio 自带的代码扫描分析工具,旨在帮助开发者发现并解决代码结构和质量问题,提供解决方案,而无需编写测试用例。Lint 提供的问题描述和严重等级类似于测试中发现的 bug,便于定位并按优先级进行解决。开发者可以根据需要调整严重程度标准,确保原则问题得到严格处理。
Lint 的工作方式是检查 Android 项目的源文件,如 Java 代码、XML 代码、中意广告联盟源码图标以及 ProGuard 配置文件等,以发现潜在的 bug 或优化点。优化内容包括但不限于无障碍性、正确性、国际化、性能和安全性等方面。
Android Studio 内置了 Lint 工具,使用方法为工具栏中的“Analyze”选项,然后点击“Inspect Code”。在弹出的菜单中,可以选择项目、模块或特定文件进行检查。此外,还可以通过自定义范围选择特定类进行检查。
为了自定义 Lint 的检查规则,打开“Preferences/Settings”并搜索“Inspections”。在检测配置页面中,可以修改拼写警告等级,通过搜索“spelling”找到并调整“Typo”的严重程度,将其设置为“Error”以在拼写不规范时报告错误。
Lint 提供了多种警告严重程度级别,包括“Unused Entry”、“Typo”、“Server Problem”、“Info”、“Weak Warning”和“Error”。开发者可以根据需要选择合适的严重程度,以突出显示需要优先解决的问题。
在 Java 代码中,可以使用注解 `@SuppressLint("警告名称")` 来忽略特定的 Lint 警告。例如,忽略对新 API 的警告,可以使用 `@SuppressLint("UseNewApi")`。在 XML 文件中,通过声明 `tools:ignore="警告名"` 可以忽略 Lint 警告。在 Gradle 的 `build.gradle` 文件中,通过添加 `lintOptions{ ...}` 来配置 Lint 的操作,包括开启或关闭警告。红警1源码回忆
为了自动删除项目中查找出来的无用资源文件,开发者可以使用 Lint 工具。在 Android Studio 工具栏中选择“Analyze”并输入“Run Inspection By Name..”来启动检查。输入“无用资源”并选择相应的范围后,系统将自动检测并提示移除无用资源。点击“Remove All Unused Resources”即可自动删除这些资源。
在日常开发中,开发者经常需要处理的 Lint 相关问题包括但不限于代码结构优化、拼写错误、资源重复或未使用、性能瓶颈、安全风险等。通过定期使用 Lint 工具进行代码扫描,开发者可以持续提高代码质量,确保应用程序的稳定性和用户体验。
安卓逆向工具-JD-GUI
JD-GUI,作为一款强大的Android逆向工程工具,专为Java字节码文件(如classes.dex)的反编译而设计,它将不可读的编译代码转化为易于理解的源代码,极大地便利了逆向工程师的工作。 这款开源工具以其用户友好的界面著称,使得分析和解读应用程序代码的过程更为直观和高效。通过JD-GUI,用户可以直接打开classes.dex文件,进行反编译操作。 使用JD-GUI的一般步骤如下:从官方网站(piler.free.fr/)下载并安装适合你操作系统的版本,然后按照说明进行安装。
启动JD-GUI,启动后即可开始对classes.dex文件的处理。
在使用过程中,你可以利用其功能特性,如导出源代码(保存所有源代码)、双击跳转(快速查看代码结构)、代码搜索(查找关键信息)以及代码比较(跟踪版本差异)等,提升逆向分析的效率。 然而,需注意的是,尽管JD-GUI功能强大,但因为编译过程的复杂性和一些高级技术的保护,反编译结果可能并不完美,某些代码可能难以完全还原。因此,在进行代码分析时,可能需要结合其他工具和技术,以获取更全面和准确的信息。Android apk分析工具: APK分析器
Android Studio 2.2随附了一个分析工具: APK分析器. 这是一个专门分析apk的工件,主要功能如下:
(重要)直观地查看apk中每个文件的大小(例如DEX,资源等). 我们可以根据文件大小信息来减少apk的大小; (重要)了解大型企业应用程序的命名约定和目录体系结构规范,并查看大型公司应用程序使用了哪些技术和第三方框架;了解DEX文件的组成;快速查看APK版本信息(例如apk文件解析工具,还可以看到androidmanifest.xml);直接比较这两个APK的信息,如果有比较就有害;
有以下三种使用APK分析器的方法:
双击方法
菜单栏选择方法
下面,我将用最新的Zhihu apk(4..1)进行演示.
APK分析器分析页面
首先,中的第一个红色框显示了整个apk的软件包名称和版本名称. 版本名称[XXX]实际上对应于android: androidmanifest中的versionName =“ [XXX]”.
中的第二个红色框有两种尺寸. 原始文件大小表示原始文件的大小,下载大小表示Google Play压缩的apk大小. 分析APK中文件或文件夹的比例也与下载大小有关.
中的第三个红色框是整个apk的文件结构. 我们熟悉的资源,AndroidManifest.xml,资产,lib等在这里. 而且[XXX] .dex可以看到整个项目的目录框架.
classes.dex
第二个红色框表示我们可以检查dex文件中有多少个类,该类中有多少个方法以及引用了多少个方法.
可以看到第三个红色框. 知道apk使用混乱,我们看不到真正的方法名称.
以上仅讨论了APK分析器的使用apk文件解析工具,有很多地方需要您深入研究.
Android APK分析器官方介绍
我如何在5分钟内将应用程序大小减少%
Android Adb 源码分析(一)
面对Android项目的调试困境,我们的团队在项目临近量产阶段,将userdebug版本切换为了user版本,并对selinux权限进行了调整。然而,这一转变却带来了大量的bug,日志文件在/data/logs/目录下,因为权限问题无法正常pull出来,导致问题定位变得异常困难。面对这一挑战,我们尝试了两种解决方案。
首先,我们尝试修改data目录的权限,使之成为system用户,以期绕过权限限制,然而数据目录下的logs文件仍保留了root权限,因此获取日志依然需要root权限,这并未解决问题。随后,我们找到了一个相对安全的解决办法——通过adb命令的后门机制,将获取root权限的命令修改为adb aaa.bbb.ccc.root。这一做法在一定程度上增加了后门的隐蔽性,避免了被窃取,同时对日常开发的影响也降至最低。
在解决这一问题的过程中,我们对Android ADB的相关知识有了更深入的理解。ADB是Android系统中用于调试的工具,它主要由三部分构成:adb client、adb service和adb daemon。其中,adb client运行于主机端,提供了命令接口;adb service作为一个后台进程,位于主机端;adb daemon则是运行于设备端(实际机器或模拟器)的守护进程。这三个组件共同构成了ADB工具的完整框架,且它们的代码主要来源于system/core/adb目录,用户可以在此目录下找到adb及adbd的源代码。
为了实现解决方案二,我们对adb的代码进行了修改,并通过Android SDK进行编译。具体步骤包括在Windows环境下编译生成adb.exe,以及在设备端编译adbd服务。需要注意的是,在进行编译前,需要先建立Android的编译环境。经过对ADB各部分关系及源代码结构的梳理,我们对ADB有了更深入的理解。
在后续的开发过程中,我们将继续深入研究ADB代码,尤其是关于如何实现root权限的功能。如果大家觉得我们的分享有价值,欢迎关注我们的微信公众号“嵌入式Linux”,一起探索更多关于Android调试的技巧与知识。
android 逆向常用工具?AndroidKiller是什么?
在探索Android逆向工程的世界里,常有一些强大且实用的工具帮助开发者们分析和理解应用的内部结构。本文将对这些工具进行总结,并着重介绍一款名为AndroidKiller的逆向神器。
AndroidKiller是逆向工程领域中一款广受赞誉的可视化工具。它通过直观的界面,简化了反编译过程,无需开发者深入理解复杂的编译工具操作。借助AndroidKiller,开发者能够轻松地进行反编译,分析应用的源代码结构,从而进行深入的研究和定制。
然而,如同任何技术一样,AndroidKiller并非没有局限。随着Android版本的快速迭代更新,这款逆向工具却未能同步跟进,停止了更新。这无疑成为了一点遗憾。在此背景下,有些开发者可能会转向其他替代方案,例如APK改之理(又称为APKIDE),尝试在高版本的编译中获得更好的支持。
综上所述,AndroidKiller作为一款高效的逆向工具,以其简洁的界面和强大的功能,成为了开发者进行应用逆向分析时的得力助手。尽管其在更新方面存在一定局限性,但其在逆向工程领域的应用价值依然不容忽视。
找到卡顿来源,BlockCanary源码精简分析
通过屏幕渲染机制我们了解到,Android的屏幕渲染是通过vsync实现的。软件层将数据计算好后,放入缓冲区,硬件层从缓冲区读取数据绘制到屏幕上,渲染周期是ms,这让我们看到不断变化的画面。如果计算时间超过ms,就会出现卡顿现象,这通常发生在软件层,而不是硬件层。卡顿发生的原因在于软件层的计算时间需要小于ms,而计算的执行地点则在Handler中,具体来说是在UI的Handler中。Android进程间的交互通过Binder实现,线程间通信通过Handler。
软件层在收到硬件层的vsync信号后,会在Java层向UI的Handler中投递一个消息,进行view数据的计算。这涉及到测量、布局和绘制,通常在`ViewRootImpl`的`performTraversals()`函数中实现。因此,view数据计算在UI的Handler中执行,如果有其他操作在此执行且耗时过长,则可能导致卡顿,我们需要找到并优化这些操作。
要找到卡顿的原因,可以通过在消息处理前后记录时间,计算时间差,将这个差值与预设的卡顿阈值比较。如果大于阈值,表示发生了卡顿,此时可以dump主线程堆栈并显示给开发者。实现这一功能的关键在于在Looper中设置日志打印类。通过`Looper.loop()`函数中的日志打印,我们可以插入自定义的Printer,并在消息执行前后计算时间差。另一种方法是在日志中添加前缀和后缀,根据这些标志判断时间点。
BlockCanary是一个用于检测Android应用卡顿的工具,通过源码分析,我们可以了解到它的实现逻辑。要使用BlockCanary,首先需要定义一个继承`BlockCanaryContext`的类,并重写其中的关键方法。在应用的`onCreate()`方法中调用BlockCanary的安装方法即可。当卡顿发生时,BlockCanary会通知开发者,并在日志中显示卡顿信息。
BlockCanary的核心逻辑包括安装、事件监控、堆栈和CPU信息的采集等。在事件发生时,会创建LooperMonitor,同时启动堆栈采样和CPU采样。当消息将要执行时,开始记录开始时间,执行完毕后停止记录,并计算执行时间。如果时间差超过预设阈值,表示发生了卡顿,并通过回调传递卡顿信息给开发者。
堆栈和CPU信息的获取通过`AbstractSampler`类实现,它通过`post`一个`Runnable`来触发采样过程,循环调用`doSample()`函数。StackSampler和CpuSampler分别负责堆栈和CPU信息的采集,核心逻辑包括获取当前线程的堆栈信息和CPU速率,并将其保存。获取堆栈信息时,通过在`StackSampler`类中查找指定时间范围内的堆栈信息;获取CPU信息时,从`CpuSampler`类中解析`/proc/stat`和`/proc/mpid/stat`文件的CPU数据,并保存。
总结而言,BlockCanary通过在消息处理前后记录时间差,检测卡顿情况,并通过堆栈和CPU信息提供详细的卡顿分析,帮助开发者定位和优化性能问题。