零代码侵入给app添加应用外debug工具

834 阅读3分钟
原文链接: blog.csdn.net

写在前面

程序员在日常开发工作过程中,经常需要临时配合服务端查网络请求报文以排查问题。
一般在这种情况下,我们会将手机连接到开发电脑上打开发包运行来查看logcat。
这种方式费时费力,而且一旦身边没有电脑或电脑上没有对应的开发环境,此工作将无法进行。
另外,开发人员的手机上一般安装的都是测试环境app,要排查生产环境的问题也要重新打包。

之前的做法

为了解决这个问题,之前曾将此类debug相关逻辑打包在产品中(例如日志写在文件中),并使用一种比较隐蔽的方式进入debug界面进行设置。 这种方式的缺点比较明显:

  • debug相关的功能在产品中,存在安全性风险
  • 日志要写到本地文件中,查看起来比在AndroidStudio中查看Logcat要麻烦很多

新的解决方案

整体思路

  1. 新建一个app(debug服务端:Server),将debug面板相关功能放到此app中
  2. 新建一个lib(debug客户端:Client),实现对应的debug功能,供需要debug功能的app依赖
  3. Server创建一个ServerSocket等待Client连接,并将ip和port通过广播发送出去
  4. Client通过BroadcastReceiver接收到Server发起的广播后,建立一个连接Server的Socket
  5. 连接成功后,通过socket通道,实现Client-Server双向通信
  6. Client负责执行Server的指令,并将结果回传给Server
  7. Server负责发送相关指令以及展示Client发送过来的信息

安全性保证

  1. 此套方案的debug相关功能触发不再包含在app中,用户无法触发这些功能
  2. 主体app的debug功能由Server触发,只要保证了Server的合法性即可保护debug的相关功能不会被第三方hacker任意触发:

    在第4步,通过校验Server与Client的签名是否一致来确保Server的来源不是第三方hacker
    可以通过设置自定义权限并添加android:protectionLevel="signature"属性,来确保只能接收到相同签名的app发来的该广播信息
    
  3. Server应用安装包不会对外公开,一般只在开发人员的设备上运行
  4. 对安全性要求更高的场景可以在打正式发布的apk时去除此功能

已开源的工具

DebugController

  1. 使用比较简单: 只需一行依赖即可, 零代码侵入
    compile 'com.billy.android:app-debugger:1.3.2'
    以上内容全小写,csdn会将android第一个字母’a’自动转为大写的’A’

  2. 目前功能比较少,只有logcat日志查看功能
    2.1 支持实时日志查看
    2.2 支持日志级别过滤
    2.3 支持日志关键词过滤
    2.4 支持日志级别不同颜色显示
    2.5 支持超长日志的单击展开/收缩
    2.6 支持日志长按查看详情,会自动格式化json,并且支持滚动及手势缩放查看
    2.7 支持选择多条日志进行复制/分享
    2.8 支持清除当前日志

  3. 功能比较容易扩展
    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)

最后,附上几张运行效果图:

这里写图片描述

这里写图片描述