做一个可调试的Android应用

在Android APP开发测试的过程中通常会有如下的需求:动态开关某一功能,方便对比验证,如在测试环境和生产环境之间切换网络请求的接口;或者是线上版本出问题时,打开某些测试功能或者日志的开关,方便定位问题。如果采用修改代码重新打包的方式则太繁琐,类似情况下常见的有如下一些方式从外部传递给APP一些参数来修改APP的配置。

1、留彩蛋

留彩蛋的意思就是事先将Debug相关的功能开关写在一个隐藏的设置界面里,打开这个设计界面的路径比较深或者操作比较复杂,普通用户常规操作一般不会触发这个隐藏的设置界面。比如Android手机的“开发者选项”界面。进入这种彩蛋页面的操作一般是某个按钮的连续点击+物理按键的长按,或者是搜索框/输入框输入特定的字符串,或者是扫描特定二维码等等。


开发者选项

2、配置文件

还有一种做法是在想要调试我们的应用时,可以在设备SD卡的特定路径上放置一个固定名称的文件。当应用启动时可以去约定的路径下查找,看是否存在相应的文件,如果有就可以进入debug模式,还可以从该文件中读取到相应的配置参数。

3、Android系统相关属性

3.1 Intent中带参数
我们想要调试的应用是A,另外做一个应用B,B这个应用的唯一作用就是来启动A,启动时从Intent中带所需的调试参数过去。也就是我们把A应用的调试参数配置界面写在B应用里,当我们想要调试A时,不要直接从桌面图标中进入A,而是先进入B应用,在B应用里配置好我们所需要的参数后,再从B应用里的跳转按钮进入A应用,这样在B中配置的参数就可以通过Intent传递到A应用中了。

Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setClassName("com.android.settings","com.android.settings.wifi.WifiNoInternetDialog");
intent.putExtra("debugInfo", "api=debug&log=open");
mContext.startActivity(intent);

3.2 设置系统属性
Android系统中有一个系统属性服务,这个服务管理系统全局的配置和状态,这些配置和状态都是一些key-value。系统中每个进程都可以通过SystemProperties.get("key")来获取这些全局的属性值。这些属性值还可以adb shell下通过getpropsetprop命令来查询和设置。这样我们就可以在APP中通过读取我们自定义的属性值来判断是否进入调试模式,在我们需要调试应用时可以通过adb命令来设置对应的属性值即可。

系统属性

3.3 dumpsys命令传递参数
我们在性能优化时通常会用到dumpsys这么一个工具。这个工具可以获取到系统服务相关信息。如adb shell dumpsys activity activities可以获取到activity的信息。这个命令执行的时候,系统会遍历系统中所有Activity实例,然后调用他们的dump方法。

Activity的dump方法

这样我们就可以在我们的Activity中复写这个方法,来接收从命令行传递过来的数据,然后配置相应的调试环境。

示例

你可能感兴趣的:(做一个可调试的Android应用)