Android 开发者定位调整log缓冲区来解决丢log的问题
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的问题相关推荐
- android开发百度地图定位到几内亚湾问题的解决
android开发一直定位的几内亚湾,这个问题我大概停在这里3,4天,看网上的各种回答试了很多都不行,头疼.偶然看到一位大佬写的具体定位代码的写法,解决了这个问题.原博客https://blog.cs ...
- android百度定位失败的原因,百度定位中出现4.9E-324问题的原因和解决办法
百度定位请查看官方开发文档 定位过程中出现经纬度为4.9E-324错误的可能情况,目前收集到四种: 1.权限错误 什么是权限错误呢?分为两种情况: 一是权限没有添加完全,没有从开发文档中完全拷贝到项目 ...
- Android开发者选项 介绍
15个必知的Android开发者选项 https://www.jianshu.com/p/07b551ee260b 1.Stay awake 充电时保持屏幕唤醒,开发的时候,时不时的锁屏真是够了,开 ...
- 扔物线------给 Android 开发者的 RxJava 详解
本文转载自扔物线的文章:http://gank.io/post/560e15be2dca930e00da1083 给 Android 开发者的 RxJava 详解 <p>作者:<a ...
- Android 开发者的 RxJava 详解 - 作者:扔物线
前言 我从去年开始使用 RxJava ,到现在一年多了.今年加入了 Flipboard 后,看到 Flipboard 的 Android 项目也在使用 RxJava ,并且使用的场景越来越多 .而最近 ...
- 给 Android 开发者的 RxJava 详解(作者:扔物线)
前言 我从去年开始使用 RxJava ,到现在一年多了.今年加入了 Flipboard 后,看到 Flipboard 的 Android 项目也在使用 RxJava ,并且使用的场景越来越多 .而最近 ...
- 给 Android 开发者的 RxJava1.0 详解 (转载)
作者:扔物线 HenCoder 给高级 Android 工程师的进阶指南: 前言 我从去年开始使用 RxJava ,到现在一年多了.今年加入了 Flipboard 后,看到 Flipboard 的 A ...
- android ------- 开发者的 RxJava 详解
在正文开始之前的最后,放上 GitHub 链接和引入依赖的 gradle 代码: Github: https://github.com/ReactiveX/RxJava https://githu ...
- 火速收藏!Android 开发者必会的内存泄漏指南
[CSDN 编者按]对于众多 Android 程序员而言,在需求与应用性能之间,主要精力都会放到新需求的开发.随着项目复杂度的增加,应用性能越来越低,出现各种问题.程序员们奔波于各种"救火现 ...
最新文章
- RDKit | 比较化合物并通过PCA可视化化学空间
- USB port 如何识别不同的Charger类型
- 第2章 信号、接口和引脚(XIlinx ZYNQ-7000 SOC UG-585文档)
- lable标签的用途
- Jenkins + Gitlab + Ansible--playbook 代码上线流程
- genymotion 极速模拟器
- 客户端配置_交换机作为STelnet客户端登录其他设备配置示例
- 番茄花园win11 32位专业版镜像系统v2021.07
- DNS服务器介绍(二)——主从复制和区域转发
- Ps 初学者教程,如何在图片中创造双色效果?
- 「洛谷5017」「NOIP2018」摆渡车【DP,经典好题】
- IntelliJ IDEA创建JavaWeb项目
- 【智能控制实验】基于MATLAB的BP神经网络PID控制器设计
- Python爬取有道词典
- 基于CList链表类的故障树分析算法的实现
- 英文论文评审意见_怎样写英文审稿意见
- 华为云D-Plan解决方案为企业数智升级注入AI新动力
- 解决微信小程序主包太大问题
- golang 实现华容道
- Android 9.0 (Pie)