当前位置:   article > 正文

Android 开发者定位调整log缓冲区来解决丢log的问题_logd.logpersistd

logd.logpersistd

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开关打开的时候来设置。

  1. console:/ # getprop | grep logd
  2. [init.svc.logd]: [running]
  3. [init.svc.logd-reinit]: [stopped]
  4. [logd.logpersistd]: []
  5. [logd.logpersistd.enable]: [true]
  6. [persist.logd.logpersistd]: []
  7. [persist.logd.size]: [1048576]
  8. [ro.boottime.logd]: [14823168131]
  9. [ro.boottime.logd-reinit]: [15467994381]
  10. [ro.logd.size.stats]: [64K]
  1. console:/ # start logd-reinit
  2. console:/ # [153290.668414@0] logd.daemon: reinit

下面是逻辑

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

  1. public abstract class AbstractLogdSizePreferenceController extends
  2. DeveloperOptionsPreferenceController implements Preference.OnPreferenceChangeListener

比如

  1. public void setTitle(CharSequence title) {
  2. if (title == null && mTitle != null || title != null && !title.equals(mTitle)) {
  3. mTitleRes = 0;
  4. mTitle = title;
  5. notifyChanged();
  6. }
  7. }

notifiyChanged就会调用回调

  1. /**
  2. * Should be called when the data of this {@link Preference} has changed.
  3. */
  4. protected void notifyChanged() {
  5. if (mListener != null) {
  6. mListener.onPreferenceChange(this);
  7. }
  8. }

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

  1. @Override
  2. public boolean onPreferenceChange(Preference preference, Object newValue) {
  3. if (preference == mLogdSize) {
  4. writeLogdSizeOption(newValue);
  5. return true;
  6. } else {
  7. return false;
  8. }
  9. }
  1. public void writeLogdSizeOption(Object newValue) {
  2. boolean disable = (newValue != null) &&
  3. (newValue.toString().equals(SELECT_LOGD_OFF_SIZE_MARKER_VALUE));
  4. String currentTag = SystemProperties.get(SELECT_LOGD_TAG_PROPERTY);
  5. if (currentTag == null) {
  6. currentTag = "";
  7. }
  8. // filter clean and unstack all references to our setting
  9. String newTag = currentTag.replaceAll(
  10. ",+" + SELECT_LOGD_TAG_SILENCE, "").replaceFirst(
  11. "^" + SELECT_LOGD_TAG_SILENCE + ",*", "").replaceAll(
  12. ",+", ",").replaceFirst(
  13. ",+$", "");
  14. if (disable) {
  15. newValue = SELECT_LOGD_MINIMUM_SIZE_VALUE;
  16. // Make sure snet_event_log get through first, but do not override
  17. String snetValue = SystemProperties.get(SELECT_LOGD_SNET_TAG_PROPERTY);
  18. if ((snetValue == null) || (snetValue.length() == 0)) {
  19. snetValue = SystemProperties.get(SELECT_LOGD_RUNTIME_SNET_TAG_PROPERTY);
  20. if ((snetValue == null) || (snetValue.length() == 0)) {
  21. SystemProperties.set(SELECT_LOGD_SNET_TAG_PROPERTY, DEFAULT_SNET_TAG);
  22. }
  23. }
  24. // Silence all log sources, security logs notwithstanding
  25. if (newTag.length() != 0) {
  26. newTag = "," + newTag;
  27. }
  28. // Stack settings, stack to help preserve original value
  29. newTag = SELECT_LOGD_TAG_SILENCE + newTag;
  30. }
  31. if (!newTag.equals(currentTag)) {
  32. SystemProperties.set(SELECT_LOGD_TAG_PROPERTY, newTag);
  33. }
  34. String defaultValue = defaultLogdSizeValue();
  35. final String size = ((newValue != null) && (newValue.toString().length() != 0)) ?
  36. newValue.toString() : defaultValue;
  37. SystemProperties.set(SELECT_LOGD_SIZE_PROPERTY, defaultValue.equals(size) ? "" : size);
  38. SystemProperties.set("ctl.start", "logd-reinit");
  39. SystemPropPoker.getInstance().poke();
  40. updateLogdSizeValues();
  41. }

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

  1. public static class PokerTask extends AsyncTask<Void, Void, Void> {
  2. @VisibleForTesting
  3. String[] listServices() {
  4. return ServiceManager.listServices();
  5. }
  6. @VisibleForTesting
  7. IBinder checkService(String service) {
  8. return ServiceManager.checkService(service);
  9. }
  10. @Override
  11. protected Void doInBackground(Void... params) {
  12. String[] services = listServices();
  13. if (services == null) {
  14. Log.e(TAG, "There are no services, how odd");
  15. return null;
  16. }
  17. for (String service : services) {
  18. IBinder obj = checkService(service);
  19. if (obj != null) {
  20. Parcel data = Parcel.obtain();
  21. try {
  22. obj.transact(IBinder.SYSPROPS_TRANSACTION, data, null, 0);
  23. } catch (RemoteException e) {
  24. // Ignore
  25. } catch (Exception e) {
  26. Log.i(TAG, "Someone wrote a bad service '" + service
  27. + "' that doesn't like to be poked", e);
  28. }
  29. data.recycle();
  30. }
  31. }
  32. return null;
  33. }
  34. }

 


 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/745395
推荐阅读
相关标签
  

闽ICP备14008679号