写在前面
程序员在日常开发工作过程中,经常需要临时配合服务端查网络请求报文以排查问题。
一般在这种情况下,我们会将手机连接到开发电脑上打开发包运行来查看logcat。
这种方式费时费力,而且一旦身边没有电脑或电脑上没有对应的开发环境,此工作将无法进行。
另外,开发人员的手机上一般安装的都是测试环境app,要排查生产环境的问题也要重新打包。
之前的做法
为了解决这个问题,之前曾将此类debug相关逻辑打包在产品中(例如日志写在文件中),并使用一种比较隐蔽的方式进入debug界面进行设置。 这种方式的缺点比较明显:
- debug相关的功能在产品中,存在安全性风险
- 日志要写到本地文件中,查看起来比在AndroidStudio中查看Logcat要麻烦很多
新的解决方案
整体思路
- 新建一个app(debug服务端:Server),将debug面板相关功能放到此app中
- 新建一个lib(debug客户端:Client),实现对应的debug功能,供需要debug功能的app依赖
- Server创建一个ServerSocket等待Client连接,并将ip和port通过广播发送出去
- Client通过BroadcastReceiver接收到Server发起的广播后,建立一个连接Server的Socket
- 连接成功后,通过socket通道,实现Client-Server双向通信
- Client负责执行Server的指令,并将结果回传给Server
- Server负责发送相关指令以及展示Client发送过来的信息
安全性保证
- 此套方案的debug相关功能触发不再包含在app中,用户无法触发这些功能
-
主体app的debug功能由Server触发,只要保证了Server的合法性即可保护debug的相关功能不会被第三方hacker任意触发:
在第4步,通过校验Server与Client的签名是否一致来确保Server的来源不是第三方hacker 可以通过设置自定义权限并添加android:protectionLevel="signature"属性,来确保只能接收到相同签名的app发来的该广播信息
- Server应用安装包不会对外公开,一般只在开发人员的设备上运行
- 对安全性要求更高的场景可以在打正式发布的apk时去除此功能
已开源的工具
-
使用比较简单: 只需一行依赖即可, 零代码侵入
compile 'com.billy.android:app-debugger:1.3.2'
以上内容全小写,csdn会将android第一个字母’a’自动转为大写的’A’ -
目前功能比较少,只有logcat日志查看功能
2.1 支持实时日志查看
2.2 支持日志级别过滤
2.3 支持日志关键词过滤
2.4 支持日志级别不同颜色显示
2.5 支持超长日志的单击展开/收缩
2.6 支持日志长按查看详情,会自动格式化json,并且支持滚动及手势缩放查看
2.7 支持选择多条日志进行复制/分享
2.8 支持清除当前日志 -
功能比较容易扩展
3.1 Client添加AbstractMessageProcessor的子类进行消息处理
DebugController.addProcessor(processor)
3.2 Client 发送信息到Server
AbstractMessageProcessor.sendMessage(message)
3.3 Server添加IServerMessageProcessor的实现类进行消息的处理
ServerMessageProcessorManager.addProcessor(processor)
3.4 Server发送信息到Client
ServerMessageProcessorManager.sendMessageToClient(processor, message)
最后,附上几张运行效果图: