didi / DoKit

一款面向泛前端产品研发全生命周期的效率平台。
Apache License 2.0
20.09k stars 3.09k forks source link

feat:add power consumption detection #1086

Open Truth-NJU opened 1 year ago

Truth-NJU commented 1 year ago

需要注意的地方:

  1. Android/dokit-powerdetection/src/main/java/com/example/androidpowercomsumption/utils/monitor/LogFileWriter.java中write方法的作用是将耗电检测报告的相关信息写入文件中,其中的 filePath 变量对应的是要写入文件的位置,可以根据需要修改。
  2. 使用时主要起作用的类就是Android/dokit-powerdetection/src/main/java/com/example/androidpowercomsumption/utils/AppStateApplication.java类,它通过实现ActivityLifecycleCallbacks拿到App所有Activity的生命周期回调。通过重写其中的方法来实现对线程、系统服务调用次数、App和设备状态的监控。
  3. 使用时可以以Android/dokit-powerdetection/src/main/java/com/example/androidpowercomsumption/MainActivity.java为例来进行测试。也可以使用其他activity来测试,只要正确的引入AppStateApplication类即可。在使用Android/dokit-powerdetection/src/main/java/com/example/androidpowercomsumption/MainActivity.java测试时,为了正确的模拟app的退出(生命周期的结束),在测试时退出app时需要按两次返回键,按下第一次返回键后会有相应的提示。正确退出后即可以在1中filepath对应的位置查询电量报告。

代码说明:

  1. Android/dokit-powerdetection/src/main/java/com/example/androidpowercomsumption/controller包下面的类主要负责开启和关闭监控,并输出相应的耗电检测数据。
  2. Android/dokit-powerdetection/src/main/java/com/example/androidpowercomsumption/diff包下面的类负责计算线程功耗在监控开启和结束时间点的开销的差异,从而确定该时间段内线程的消耗。
  3. Android/dokit-powerdetection/src/main/java/com/example/androidpowercomsumption/utils/monitor包将各个模块的功能进行整合。
  4. Android/dokit-powerdetection/src/main/java/com/example/androidpowercomsumption/utils/state包下的类主要负责获得App和设备状态,会被controller包下的类调用。
  5. Android/dokit-powerdetection/src/main/java/com/example/androidpowercomsumption/utils/systemservice包下的类实现了对各个系统服务的hook。
  6. Android/dokit-powerdetection/src/main/java/com/example/androidpowercomsumption/utils/AppStateApplication.java类通过实现ActivityLifecycleCallbacks拿到App所有Activity的生命周期回调。通过重写其中的方法来实现对线程、系统服务调用次数、App和设备状态的监控。
  7. Android/dokit-powerdetection/src/main/java/com/example/androidpowercomsumption/utils/systemservice/SimulateSystemService.java类用来模拟系统服务的调用,用作测试。在Android/dokit-powerdetection/src/main/java/com/example/androidpowercomsumption/utils/AppStateApplication.java类中被调用。实际使用AppStateApplication.java类时需要删除其中调用的SimulateSystemService.java类的内容。