Android 进阶第一篇——善用工具

本文总结了Android开发过程中常用的adb命令及Shell命令,包括设备管理、应用管理、性能测试等方面,帮助开发者提高工作效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

笔者本身从事的是和系统相关性比较大的系统应用的开发,在这里我总结了一下自身的经验,将工作中经常用到的一些工具做了简要罗列,我之所以将其作为进阶第一篇,是因为工欲善其事必先利其器,只有善用工具才能提升效率,节省更多时间去学习和实践。其实我工作中也不都是敲命令,出于工作繁忙的原因,我将这些命令都用Python封装成了GUI界面工具,自动化或半自动化的一键式的运行,这里我就不放出工具了,一是因为界面丑陋,二是绑定和耦合了工作模块的代码逻辑等,不适合拿出来,而且我也懒得去重新封装,大家看我写的Python tkinter系列博客,再去简单学习一下Python语法,完全可以自己定制属于自己的自动化工具,很推荐Python,简单易用,开发高效,非常不错的语言!

命令工具

如果在Windows上使用命令工具,那么在使用之前你或许需要一个超级命令行工具,因为Windows的cmd命令行简直low爆了!这里我极力推荐ConEmu 命令工具,非常好用,谁用谁知道。有些人喜欢推荐cmder工具,但它有一个我无法忍受的bug,有多蛋疼,谁用谁知道

这里写图片描述

  • adb 基础命令
    以下这些命令是最为基础常用的adb命令,相信很多开发者都已经熟悉,在此列出做一个总结
#查看设备,有多个设备连接时,执行该命令列出每个设备的serialNumber,后续命令加-s <serialNumber>可指定执行命令的设备
adb devices   

adb root      #运行后以root权限执行adb命令 (需要提前root手机)
adb remount   #重新挂载分区,执行后可对/system/ 等目录进行读写操作(需要提前root手机)

#手机上未安装该apk文件,运行此命令(不在同一目录下,需带路径)
adb install <Apk文件名>
#如手机上已经安装该apk,加-r参数重装
adb install -r <Apk文件名>  

#卸载软件,加-k命令,卸载软件时可以保留配置和缓存文件
adb uninstall [-k] <应用包名>    

#把本地PC上的文件或者文件夹拷贝到设备
adb push <本地PC路径> <手机端路径> 

#把设备上的文件或者文件夹拷贝到本地PC
adb pull <远程路径> <本地路径>

#启动adb服务
adb start-server
#杀死adb服务,结合启动命令,可以用来重启adb服务
adb kill-server

#重启手机
adb reboot

#进入设备的Linux命令行,可用来执行Linux命令
adb shell

adb -h  #查看帮助手册
  • Android下常用的shell命令

这些命令既可通过adb shell进入Linux命令行去执行,也可使用adb shell 直接加命令执行

我们通常直接使用adb shell 组合一些Linux常用命令去执行,而不是进入Linux命令行,这样会更加方便。如常见的cd、ls、mkdir、rm、mv、cat等

adb shell top         #即Linux下的top命令,查看设备cpu和内存情况
adb shell top -m 3      #查看占用内存前3的app
adb shell ps          #查看进程列表
adb shell ps -x [PID]     #查看指定进程状态
adb shell kill [PID]    #杀死一个进程
adb shell service list   #查看后台services信息
adb shell getprop         #查看所有系统的属性信息(同adb shell cat /system/build.prop)
adb shell setprop [name] [value]   #设置系统的属性信息,需root
adb shell getprop ro.build.version.release

#查看手机芯片平台,带有mt字样的为MTK平台,sp或sc为展讯平台,Qualcomm或者msm为高通平台,
#不同平台,某些框架层代码区别很大,一般的第三方应用开发者无感
adb shell cat /proc/cpuinfo | grep Hardware

#查看当前电量
adb shell dumpsys battery | grep level

#获取wifi密码(需root)
adb shell cat /data/misc/wifi/*.conf

获取当前Activity信息是非常有用的命令,特别是用来分析未知的apk,与屏幕相关的几个命令,在调试UI界面时也十分有用

#查看当前界面的Activity
adb shell dumpsys activity activities | grep mFocusedActivity

adb shell wm size         #获取屏幕分辨率
adb shell wm density 	  #获取屏幕密度
adb shell wm density <数值> #修改屏幕密度

以下录屏与截屏命令,在测试apk的时候相当有用,很多人却不知道,现在学习一下,就再也不需要去安装一个第三方软件了,其中添加–bugreport命令,可以在性能不太差的机器上做启动速度测试,具体可参考Android app启动时间测试
但其实这种录屏数据仅仅作为一点参考,并不太准确,我在很多不同型号机器上实践过,都有或多或少的偏差,因为当你处于录屏时,本身就会影响性能,就会影响启动速度。

#屏幕截图,并将截图保存到sd卡
adb shell screencap -p /sdcard/screenshot.png

#录制屏幕命令,将录屏以mp4格式保存到设备的sd卡 (/sdcard)
adb shell screenrecord /sdcard/filename.mp4

#bugreport参数使录屏增加一些时间信息和帧信息,可用来测试应用启动速度
adb shell screenrecord --bugreport /sdcard/filename.mp4
#size参数用于设置视频的尺寸,可调整录屏的大小
adb shell screenrecord --size 1280x720 /sdcard/filename.mp4

以上一些命令中,很多都可以通过Linux管道"|“连接grep进行过滤,如
adb shell getprop | grep persist
它会过滤结果,返回只包含persist关键字的结果;我们还可以通过Windows命令行的管道”>"命令将结果导入本地PC的文件中进行保存和查看
adb shell getprop > D:\filename.txt
adb shell top > D:\proc.txt
还可将两个管道结合使用,我们要知道,管道正是命令行的精髓之所在!
adb shell getprop | grep persist > prop.txt

  • pm命令
#列出所有安装的应用的包名
adb shell pm list packages

#加-f参数,还可显示该apk文件的路径
adb shell pm list packages -f

#根据包名查看其apk文件的路径
adb shell pm path <包名>

#清除应用数据与缓存
adb shell pm clear <包名>

这些命令都可以使用管道操作符连接grep工具进行过滤显示,其中清除应用数据与缓存的命令很常用,现在我们知道这个命令,再也不用笨拙的到手机设置应用列表中去寻找到我们的app,然后去清除app的缓存数据,用命令只需一秒搞定。

这里针对adb shell pm list packages命令做一点扩展,列出了该命令支持的所有参数,实际上我也没有怎么使用过,因为我认为搭配上grep去过滤已经足够了

-f 显示应用关联的 apk 文件
-d 只显示 disabled 的应用
-e 只显示 enabled 的应用
-s 只显示系统应用
-3 只显示第三方应用
-i 显示应用的 installer
-u 包含已卸载应用

这个地方我想做一点补充说明,假设一种场景,你的手机无意中了广告木马病毒,不停弹出广告页面,那么我们就可以使用上面讲的命令,快速导出该木马反编译做分析。首先第一步的思路就是要知道这个木马的包名,不知包名一切皆休!
adb shell dumpsys activity activities | grep mFocusedActivity
执行上述命令,获取到该界面的包名类名
adb shell pm path <包名>
执行上述命令,获取到木马的apk路径
adb pull <apk路径> D:\text
最后导出apk(需root)

  • am命令
#列出所有的Activity任务栈信息
adb shell am stack list

#强制停止应用,可用于杀进程
adb shell am force-stop <包名>

adb shell am start        [options] <INTENT>	#启动指定的 Activity
adb shell am startservice [options] <INTENT>	#启动 指定的 Service
adb shell am broadcast    [options] <INTENT>	#发送指定的广播

对于启动Activity、Service以及发送广播,可以携带一些数据,这里列出其中一些参数

-a 指定 action,比如 android.intent.action.DIAL
-c 指定 category,比如 android.intent.category.APP_CONTACTS
-d <DATA_URI>: 指定 Intent data的URI
-n 指定完整 component 名,明确指定启动的Activity,格式为 <包名/完整类名>
-t <MIME_TYPE>: 指定Intent MIME Type
-p : 指定包名

这里给出启动一个activity的示例,其他的用法也类似

adb shell am start -a android.intent.action.DIAL -d tel:10000
adb shell am start -n com.android.camera/com.android.camera.Camera

除了上述用法,am start命令还可以用来做冷热启动速度的测试工具,平时工作中会经常有性能优化的指标,其中启动速度算一项,当然,我们一般关注的是冷启动速度,也就是进程不在后台的启动,如进程已经挂在后台,这种启动是热启动

#冷启动速度,切记带上-S参数,否则每次测试不会杀进程,得出来的就是热启动数据,切记切记
adb shell am start -W -S <包名/完整类名>

#加上R参数,后面跟次数,表示自动循环测试的次数,这个参数就很ok了,测十次不需要手动去把命令执行十次
adb shell am start -W -S —R <次数> <包名/完整类名>
  • dumpsys命令

dumpsys命令可以说是最为强大的命令,它是用来拉取信息的,上述一些命令的功能,基本上用dumpsys命令都能获取,也正是因为过于强大,导致返回的信息过多,可使用的参数也过多,反而使用的不是特别多。这里简要列举几个最为常用的,实际上前面在获取当前activity时已经使用过

#拉取设备上所有安装应用的activity信息,其中包括包括#activity的布局层级、Fragment等等
adb shell dumpsys activity
#上述命令返回的信息量太过庞大,可以加p参数限制包名
adb shell dumpsys activity -p <包名>

#返回当前activity任务栈详细状态信息
adb shell dumpsys activity a
#具体堆栈状态信息
adb shell dumpsys activity activities

#更多详细使用,查看dumpsys activity命令的帮助手册
adb shell dumpsys activity -h

查看已安装应用包相关的信息,与dumpsys activity一样,加-h获取帮助手册

#拉取设备上所有安装应用的包相关信息,其中信息量相当庞大
adb shell dumpsys package

#可指定包名,获取该包的所有详细信息,就相当于获取到AndroidManifest的内容
adb shell dumpsys package <包名>

#获取所有已安装包的基本信息,包括安装路径、so路径以及权限等等
adb shell dumpsys package p

#获取所有已安装包的content providers信息
adb shell dumpsys package prov

dumpsys 命令后面除了可跟activity和package外,实际上可以跟的参数相当多,通过跟不同参数,几乎可以查看到设备相关的所有信息,由于参数过多,这里不再列举,想要查看可以跟哪些具体参数,通过添加-l命令即可获取

adb shell dumpsys -l

日志工具

分析日志调试BUG是平时的家常便饭了,但是大多数第三方app开发者使用的日志工具是IDE里面的logcat工具,也有一部分人使用adb命令抓取日志,实际上这都是在线日志,我这里介绍的是离线日志工具,这些工具是由手机芯片厂商提供的,并集成到手机上的,使用它的好处就是可以一直开启日志,24小时连续不间断的录制日志,并保存到SD卡,通常测试人员使用该工具,它还有另一个好处,就是可以用来调试一些首次开机发生的BUG,因为是首次开机,adb命令很可能无法抓取到开机时的boot日志,对于第三方应用可能使用不到,对于一些系统应用来说是非常有用的。这些离线日志工具和平台厂商有关,不同的平台不一样,其中高通平台更是没有提供

	#展讯平台工程模式,选择DEBUG & LOG页,LogManager菜单
	adb shell am start -n com.sprd.engineermode/.EngineerModeActivity
	#或者直接拉起日志录制界面
	adb shell am start -n com.sprd.engineermode/.activity.slog.SlogActivity
	
	#MTK平台工程模式,选择Log and Debugging页,MTKLogger菜单开启离线日志
	adb shell am start -n com.mediatek.engineermode/.EngineerMode
	
	#直接拉起MTK离线日志界面,切记在设置中只开启MobileLog选项,否则会抓取Modem等日志,导致体积庞大
	adb shell am start -n com.mediatek.mtklogger/.MainActivity
	
	#高通平台工程模式,高通芯片厂商并未提供现成的工程模式,都是由个手机厂商自己实现的,
	#这样就导致并没有统一的接口,每个厂商的都不一样,这时候,我们之前总结的各种工具命令就派上了用场了
	adb shell pm list packages -f -s | grep eng*
	
	#在所有的系统应用包名中,过滤出包含eng关键字的结果,-f参数输出apk的路径。
	#因为通常工程模式的包名都会含有:EngineerMode、EngMode关键字,我们找到apk的路径,
	#就可以导出apk并反编译清单文件,获取MainAcitivity的完整类名,这样就可以使用am命令启动了,
	#当然,前提是你的手机得root。因为每个手机厂商的命名可能不一样,
	#使用该方法不一定能找到手机中的工程模式,这就要看运气了
	
	#这里给出一个小米手机的工程模式,拉起后点击菜单然后去开始日志录制
	adb shell am start -n com.miui.cit/.CitLauncherActivity

adb命令抓取日志,实际上adb logcat命令可以配合的参数相当多,主要用来控制日志输入的格式,然而我认为并没有什么卵用,我这里给出了比较友好完整的日志输出格式,使用该格式即可,-b参数表示输出日志缓冲区的内容,后面的参数分别表示几种不同的日志类型,通常应用比较关注的是main日志,我一般会同时输出这四种日志到本地文件中保存,我前面讲到的,使用">" 管道命令即可,然后使用notepad++打开日志文件查看,因为notepad++是我用过的支持搜索最友好的编辑器,它可以将搜索结果全部排列查看,还可以实现多个日志文件的搜索结果对比查看,总之谁用谁知道。

adb logcat -v threadtime -b main
adb logcat -v threadtime -b events
adb logcat -v threadtime -b system
adb logcat -v threadtime -b crash

该命令日志输入格式为
<datetime> <pid> <tid> <priority> <tag>\: <message>

这里写图片描述

开发者选项工具

相信手机上的开发者选项工具大家都不陌生,通常用到它是为了连接USB数据线,实际上该选项提供了相当有用的一些工具给开发者测试和调试应用。

不锁定屏幕

插上数据线调试手机时,非常有用,这样就不会锁屏

输入选项卡下
显示点按操作反馈

开启它有助于观察点击屏幕时,是否点击到了,大家录屏的时候一定要开启它,获得更好的录屏体验
#####指针位置
开启它之后,点击屏幕会显示一些坐标信息以及滑动轨迹,通常用来调试屏幕驱动比较有用,当手机触摸操作无反应会不灵敏时,开启它有助于检查屏幕是否有损坏或者屏幕驱动是否失灵

绘图选项卡下
显示布局边界

这个工具对于应用开发者是非常有用的,可以用来观察和调试不同屏幕上的UI适配,调整布局等等,开启它之后就能清晰的看到应用的布局显示效果

动画程序时长缩放

其实在绘图选项卡下,有好几个关于动画的选项功能,我这里仅仅提一下动画程序时长缩放,设置它能加倍慢放APP的动画效果,可以细致的观察分析动画效果,算是比较有用的,其他几个可自行体会

硬件加速渲染选项卡下
调试GPU过度绘制

该功能主要是用来优化UI绘制的,做app性能优化的时候肯定是会用到它的,当view上的布局层级嵌套越深时,开启该选项后,看到的布局颜色就会变红,这就说明该布局方案不理想,应该优化,在后面我会专门写博客总结我做app性能优化时学习的一些经验。

监控选项卡下
启用严格模式

开启后,可用于检测,应用在主线程中是否存在耗时操作,当存在耗时操作时,屏幕会闪烁,该选项也是在性能优化时作为一个重要指标的
#####GPU呈现模式分析
用于检测UI的流畅性的,开启后,屏幕上会出现一条横向的绿线,代表16ms每帧的绘制,当屏幕上的柱状图在横线之下时,代表最理想的状态,表示UI流畅,不卡顿,该选项也是性能优化的重要指标,这里简单一提,后续性能优化博客中会详细说明。

应用选项卡下
不保留活动
后台进程限制

以上两个选项在应用开发中也非常有用,可以模拟某些情景对应用做测试,不保留活动,表示从当前activity跳转离开后,该activity会被立即销毁,后台进程限制也是类似,可以模拟内存紧缺时,进程被杀的场景,尤其是后台做某些操作时突然被杀死这种情景,可以非常容易的模拟这些情景。

以上是我对于工作中的一些总结,列出来的绝对是最常用的东西,这些工具都是非常有效的,实际上好用有效的工具还有非常多,但那些工具都有一些特定的用途,比如Lint、MAT等等,这些工具基本都在SDK中提供了,只是去关注并熟练使用的人不是特别多,后续博客中我会继续总结一些特定工具 。很多人谈到Android进阶时,总是喜欢大谈特谈各种原理,很少谈工具,我认为技能的提升应该首先从工具开始,应该从脚踏实地开始,熟练运用工具,提高效率才能更快速的学习其他东西,这里与诸君共勉!

这里放上两种不同手机的截图,可以看到都是差不多的,对于某些比较老旧的Android版本,某些功能可能没有,这可能说明你应该放弃该版本的兼容了。
这里写图片描述
这里写图片描述

<think>好的,我现在要帮用户解答如何自学编程的问题。首先,我需要回顾用户之前的对话历史,确保回答的一致性和连贯性。用户之前询问了PCA,这是一个关于机器学习的降维方法,现在转向自学编程,可能用户对数据科学或机器学习感兴趣,所以可能需要结合这些领域来回答。 用户的问题是如何自学编程,这是一个比较广泛的问题,所以需要结构化的回答。首先,我应该考虑用户可能的背景和目标。他们可能刚开始学习,没有明确的编程经验,所以需要从基础开始指导。同时,用户可能对应用编程到数据分析或机器学习有兴趣,因为之前的问题涉及PCA。 接下来,我需要确定回答的结构。通常,自学编程的步骤包括明确目标、选择语言、学习资源、实践项目、社区参与、持续学习等。我需要分步骤详细说明每个部分,并给出具体例子和建议,特别是针对数据科学领域的语言如Python或R。 同时,用户之前的回答中提到了数学公式和结构化的步骤,可能希望同样清晰的列表和分点说明。需要确保回答结构清晰,步骤明确,并提供实用资源,如推荐书籍、在线课程、练习平台等。 还要注意用户可能遇到的常见问题,比如如何保持动力、如何调试代码、如何解决实际问题,这些都需要在回答中涵盖。此外,强调实践的重要性,因为编程是技能,需要不断练习。 最后,要确保语言口语化,避免使用专业术语过多,但又要准确。可能需要检查推荐的资源是否最新,是否有免费选项,以及是否适合初学者。例如,推荐Codecademy、LeetCode、Kaggle这些平台,并提供书籍如《Python编程:从入门到实践》等。 总结一下,回答需要包括明确目标、选择语言、学习资源、实践项目、社区参与、持续学习等步骤,每个部分给出具体建议,并结合用户可能的兴趣领域(如数据科学)来推荐相关工具和资源。同时,保持鼓励和支持,强调坚持和解决问题的态度。</think>自学编程需要系统规划和持续实践,以下是一份详细指南,结合技术学习与工程实践,帮助你高效入门: --- ### 一、明确学习目标(关键起点) 1. **领域定位** - **Web开发**:JavaScript + React + Node.js - **数据分析**:Python (Pandas/Numpy) + SQL - **人工智能**:Python (PyTorch/TensorFlow) + 数学基础 - **移动开发**:Swift (iOS) / Kotlin (Android) 2. **阶段目标拆解** - 第1个月:掌握基础语法 - 第3个月:完成小型项目 - 第6个月:构建完整应用 --- ### 二、选择编程语言(推荐路径) | 语言 | 学习难度 | 应用场景 | 新手友好度 | |-----------|----------|--------------------|------------| | **Python** | ⭐★ | AI/数据分析/自动化 | ★★★★★ | | **JavaScript** | ⭐⭐★ | Web全栈开发 | ★★★★☆ | | **Java** | ⭐⭐⭐ | 企业级后端/Android | ★★★☆☆ | > 建议:**从Python入手** → 语法简洁 + 生态丰富 + 跨领域适用 --- ### 三、高效学习路径 #### 阶段1:基础语法(2-4周) - **核心内容**: ✅ 变量/数据类型 ✅ 条件/循环语句 ✅ 函数与模块 ✅ 文件操作 ✅ 异常处理 - **实践工具**: - [Codecademy](https://www.codecademy.com/) 交互式学习 - 《Python编程:从入门到实践》手把手项目驱动 #### 阶段2:算法与数据结构(4-8周) - **必学内容**: 🔹 时间/空间复杂度分析 🔹 链表/栈/队列 🔹 排序算法(快排/归并) 🔹 二叉树/哈希表 - **训练平台**: - [LeetCode](https://leetcode.com/)(从Easy难度起步) - 《算法图解》可视化理解算法 #### 阶段3:项目实战(持续进行) - **项目演进路线**: ```markdown 1. 命令行工具:TODO清单/文件管理器 2. Web应用:博客系统/电商页面 3. 数据分析:COVID数据可视化 4. 机器学习:手写数字识别 ``` - **代码托管**: 立即注册[GitHub](https://github.com/),学习Git基础命令 ```bash git clone | commit | push | pull request ``` --- ### 四、关键技术栈扩展 1. **开发工具链** - IDE:VS Code(安装Python/Prettier扩展) - 调试:Python Debugger (pdb) - 环境管理:conda/pipenv 2. **工程化能力** - 单元测试:pytest框架 - 代码规范:PEP8标准 - 文档编写:Markdown + Sphinx --- ### 五、突破瓶颈的策略 1. **Debug方法论** - 使用`print()`定位问题范围 - 二分法注释代码 - 阅读错误堆栈信息(关键行标记) 2. **知识管理** - 建立代码片段库(如Gist) - 用Obsidian做学习笔记,建立知识图谱 3. **社区资源** - Stack Overflow提问模板: ``` 1. 问题现象 2. 已尝试方案 3. 错误日志截图 4. 相关代码段 ``` --- ### 六、学习路线图(以Python为例) ```mermaid gantt title 6个月Python学习计划 section 基础阶段 语法基础 :a1, 2023-10-01, 30d 数据结构 :a2, after a1, 20d section 进阶阶段 Web开发基础 :a3, after a2, 40d 数据库操作 :a4, after a3, 30d section 专项突破 数据分析 :a5, after a4, 50d 机器学习 :a6, after a5, 60d ``` --- ### 七、持续成长建议 1. **参与开源项目**:从修复文档开始(GitHub的"good first issue"标签) 2. **技术博客**:每月输出1篇技术总结(推荐用Hexo搭建博客) 3. **建立学习小组**:通过Discord/微信群组互相代码审查 --- 坚持每日编码,**100小时定律**比10000小时更适用于入门阶段。遇到问题记住: **"所有你卡住的问题,一定有前人解决过"** —— 善用搜索,保持耐心!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程之路从0到1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值