https://blog.csdn.net/kc58236582/article/details/51506896

里面提到了开发者定位来调整缓冲区的逻辑,进而理了一下。

frameworks/base/packages/SettingsLib/src/com/android/settingslib/development/AbstractLogdSizePreferenceController.java

关键prop是persist.logd.size,平常我们可以在debug的时候设置这个prop,比如1000000(大约1MB),然后再重启logd,start logd_reinit.或者修改init.rc来在debug开关打开的时候来设置。

console:/ # getprop | grep logd
[init.svc.logd]: [running]
[init.svc.logd-reinit]: [stopped]
[logd.logpersistd]: []
[logd.logpersistd.enable]: [true]
[persist.logd.logpersistd]: []
[persist.logd.size]: [1048576]
[ro.boottime.logd]: [14823168131]
[ro.boottime.logd-reinit]: [15467994381]
[ro.logd.size.stats]: [64K]
console:/ # start logd-reinit
console:/ # [153290.668414@0] logd.daemon: reinit

下面是逻辑

这个类实现了OnPreferenceChangeListener接口,需要实现onPreferenceChange方法。这个方法会在每次变更Preference Screen时都会调用到。

public abstract class AbstractLogdSizePreferenceController extendsDeveloperOptionsPreferenceController implements Preference.OnPreferenceChangeListener

比如

    public void setTitle(CharSequence title) {if (title == null && mTitle != null || title != null && !title.equals(mTitle)) {mTitleRes = 0;mTitle = title;notifyChanged();}}

notifiyChanged就会调用回调

    /*** Should be called when the data of this {@link Preference} has changed.*/protected void notifyChanged() {if (mListener != null) {mListener.onPreferenceChange(this);}}

这样在选择某个新的缓冲区的值之后,比如1M

    @Overridepublic boolean onPreferenceChange(Preference preference, Object newValue) {if (preference == mLogdSize) {writeLogdSizeOption(newValue);return true;} else {return false;}}
    public void writeLogdSizeOption(Object newValue) {boolean disable = (newValue != null) &&(newValue.toString().equals(SELECT_LOGD_OFF_SIZE_MARKER_VALUE));String currentTag = SystemProperties.get(SELECT_LOGD_TAG_PROPERTY);if (currentTag == null) {currentTag = "";}// filter clean and unstack all references to our settingString newTag = currentTag.replaceAll(",+" + SELECT_LOGD_TAG_SILENCE, "").replaceFirst("^" + SELECT_LOGD_TAG_SILENCE + ",*", "").replaceAll(",+", ",").replaceFirst(",+$", "");if (disable) {newValue = SELECT_LOGD_MINIMUM_SIZE_VALUE;// Make sure snet_event_log get through first, but do not overrideString snetValue = SystemProperties.get(SELECT_LOGD_SNET_TAG_PROPERTY);if ((snetValue == null) || (snetValue.length() == 0)) {snetValue = SystemProperties.get(SELECT_LOGD_RUNTIME_SNET_TAG_PROPERTY);if ((snetValue == null) || (snetValue.length() == 0)) {SystemProperties.set(SELECT_LOGD_SNET_TAG_PROPERTY, DEFAULT_SNET_TAG);}}// Silence all log sources, security logs notwithstandingif (newTag.length() != 0) {newTag = "," + newTag;}// Stack settings, stack to help preserve original valuenewTag = SELECT_LOGD_TAG_SILENCE + newTag;}if (!newTag.equals(currentTag)) {SystemProperties.set(SELECT_LOGD_TAG_PROPERTY, newTag);}String defaultValue = defaultLogdSizeValue();final String size = ((newValue != null) && (newValue.toString().length() != 0)) ?newValue.toString() : defaultValue;SystemProperties.set(SELECT_LOGD_SIZE_PROPERTY, defaultValue.equals(size) ? "" : size);SystemProperties.set("ctl.start", "logd-reinit");SystemPropPoker.getInstance().poke();updateLogdSizeValues();}

SELECT_LOGD_SIZE_PROPERTY即是persist.logd.size, 写ctl.start为logd-reinit是要启动logd-reinit service,即重启logd。后面的日志删除就会根据这个prop来进行配置。缓冲区大了就会少丢日志。

    public static class PokerTask extends AsyncTask<Void, Void, Void> {@VisibleForTestingString[] listServices() {return ServiceManager.listServices();}@VisibleForTestingIBinder checkService(String service) {return ServiceManager.checkService(service);}@Overrideprotected Void doInBackground(Void... params) {String[] services = listServices();if (services == null) {Log.e(TAG, "There are no services, how odd");return null;}for (String service : services) {IBinder obj = checkService(service);if (obj != null) {Parcel data = Parcel.obtain();try {obj.transact(IBinder.SYSPROPS_TRANSACTION, data, null, 0);} catch (RemoteException e) {// Ignore} catch (Exception e) {Log.i(TAG, "Someone wrote a bad service '" + service+ "' that doesn't like to be poked", e);}data.recycle();}}return null;}}

Android 开发者定位调整log缓冲区来解决丢log的问题相关推荐

  1. android开发百度地图定位到几内亚湾问题的解决

    android开发一直定位的几内亚湾,这个问题我大概停在这里3,4天,看网上的各种回答试了很多都不行,头疼.偶然看到一位大佬写的具体定位代码的写法,解决了这个问题.原博客https://blog.cs ...

  2. android百度定位失败的原因,百度定位中出现4.9E-324问题的原因和解决办法

    百度定位请查看官方开发文档 定位过程中出现经纬度为4.9E-324错误的可能情况,目前收集到四种: 1.权限错误 什么是权限错误呢?分为两种情况: 一是权限没有添加完全,没有从开发文档中完全拷贝到项目 ...

  3. Android开发者选项 介绍

    15个必知的Android开发者选项 https://www.jianshu.com/p/07b551ee260b  1.Stay awake 充电时保持屏幕唤醒,开发的时候,时不时的锁屏真是够了,开 ...

  4. 扔物线------给 Android 开发者的 RxJava 详解

    本文转载自扔物线的文章:http://gank.io/post/560e15be2dca930e00da1083 给 Android 开发者的 RxJava 详解 <p>作者:<a ...

  5. Android 开发者的 RxJava 详解 - 作者:扔物线

    前言 我从去年开始使用 RxJava ,到现在一年多了.今年加入了 Flipboard 后,看到 Flipboard 的 Android 项目也在使用 RxJava ,并且使用的场景越来越多 .而最近 ...

  6. 给 Android 开发者的 RxJava 详解(作者:扔物线)

    前言 我从去年开始使用 RxJava ,到现在一年多了.今年加入了 Flipboard 后,看到 Flipboard 的 Android 项目也在使用 RxJava ,并且使用的场景越来越多 .而最近 ...

  7. 给 Android 开发者的 RxJava1.0 详解 (转载)

    作者:扔物线 HenCoder 给高级 Android 工程师的进阶指南: 前言 我从去年开始使用 RxJava ,到现在一年多了.今年加入了 Flipboard 后,看到 Flipboard 的 A ...

  8. android ------- 开发者的 RxJava 详解

    在正文开始之前的最后,放上 GitHub 链接和引入依赖的 gradle 代码: Github:  https://github.com/ReactiveX/RxJava  https://githu ...

  9. 火速收藏!Android 开发者必会的内存泄漏指南

    [CSDN 编者按]对于众多 Android 程序员而言,在需求与应用性能之间,主要精力都会放到新需求的开发.随着项目复杂度的增加,应用性能越来越低,出现各种问题.程序员们奔波于各种"救火现 ...

最新文章

  1. RDKit | 比较化合物并通过PCA可视化化学空间
  2. USB port 如何识别不同的Charger类型
  3. 第2章 信号、接口和引脚(XIlinx ZYNQ-7000 SOC UG-585文档)
  4. lable标签的用途
  5. Jenkins + Gitlab + Ansible--playbook 代码上线流程
  6. genymotion 极速模拟器
  7. 客户端配置_交换机作为STelnet客户端登录其他设备配置示例
  8. 番茄花园win11 32位专业版镜像系统v2021.07
  9. DNS服务器介绍(二)——主从复制和区域转发
  10. Ps 初学者教程,如何在图片中创造双色效果?
  11. 「洛谷5017」「NOIP2018」摆渡车【DP,经典好题】
  12. IntelliJ IDEA创建JavaWeb项目
  13. 【智能控制实验】基于MATLAB的BP神经网络PID控制器设计
  14. Python爬取有道词典
  15. 基于CList链表类的故障树分析算法的实现
  16. 英文论文评审意见_怎样写英文审稿意见
  17. 华为云D-Plan解决方案为企业数智升级注入AI新动力
  18. 解决微信小程序主包太大问题
  19. golang 实现华容道
  20. Android 9.0 (Pie)

热门文章

  1. php 批量生成数量,laravel批量生成假数据的方法
  2. Streamsets技术验证
  3. CAN总线加终端电阻的原因
  4. 网络安全行业黑话大全
  5. 微信小程序按钮分享好友的onShareAppMessage不起作用的解决办法
  6. 清华大学计算机系面向全球诚聘英才(教研/研究/教学系列教师岗位和博士后)...
  7. multiset用法
  8. 247条Web可用性指南
  9. 百度富文本编辑器手机端预览插件开发
  10. 苹果pencil买原装还是平替?实用的苹果pencil推荐