Loading packages/CrashRecovery/services/module/java/com/android/server/PackageWatchdog.java +27 −21 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.server; import static android.content.Intent.ACTION_REBOOT; import static android.content.Intent.ACTION_SHUTDOWN; import static android.service.watchdog.ExplicitHealthCheckService.PackageConfig; import static android.util.Xml.Encoding.UTF_8; import static com.android.server.crashrecovery.CrashRecoveryUtils.dumpCrashRecoveryEvents; Loading Loading @@ -58,13 +59,14 @@ import android.util.XmlUtils; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.FastXmlSerializer; import com.android.modules.utils.BackgroundThread; import com.android.modules.utils.TypedXmlPullParser; import com.android.modules.utils.TypedXmlSerializer; import libcore.io.IoUtils; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlSerializer; import java.io.BufferedReader; import java.io.BufferedWriter; Loading Loading @@ -1152,7 +1154,8 @@ public class PackageWatchdog { mAllObservers.clear(); try { infile = mPolicyFile.openRead(); final TypedXmlPullParser parser = Xml.resolvePullParser(infile); final XmlPullParser parser = Xml.newPullParser(); parser.setInput(infile, UTF_8.name()); XmlUtils.beginDocument(parser, TAG_PACKAGE_WATCHDOG); int outerDepth = parser.getDepth(); while (XmlUtils.nextElementWithin(parser, outerDepth)) { Loading @@ -1163,7 +1166,7 @@ public class PackageWatchdog { } } catch (FileNotFoundException e) { // Nothing to monitor } catch (IOException | NumberFormatException | XmlPullParserException e) { } catch (Exception e) { Slog.wtf(TAG, "Unable to read monitored packages, deleting file", e); mPolicyFile.delete(); } finally { Loading Loading @@ -1237,10 +1240,11 @@ public class PackageWatchdog { } try { TypedXmlSerializer out = Xml.resolveSerializer(stream); XmlSerializer out = new FastXmlSerializer(); out.setOutput(stream, UTF_8.name()); out.startDocument(null, true); out.startTag(null, TAG_PACKAGE_WATCHDOG); out.attributeInt(null, ATTR_VERSION, DB_VERSION); out.attribute(null, ATTR_VERSION, Integer.toString(DB_VERSION)); for (int oIndex = 0; oIndex < mAllObservers.size(); oIndex++) { mAllObservers.valueAt(oIndex).writeLocked(out); } Loading Loading @@ -1356,12 +1360,12 @@ public class PackageWatchdog { * Does not persist any package failure thresholds. */ @GuardedBy("mLock") public boolean writeLocked(TypedXmlSerializer out) { public boolean writeLocked(XmlSerializer out) { try { out.startTag(null, TAG_OBSERVER); out.attribute(null, ATTR_NAME, name); if (Flags.recoverabilityDetection()) { out.attributeInt(null, ATTR_MITIGATION_COUNT, mMitigationCount); out.attribute(null, ATTR_MITIGATION_COUNT, Integer.toString(mMitigationCount)); } for (int i = 0; i < mPackages.size(); i++) { MonitoredPackage p = mPackages.valueAt(i); Loading Loading @@ -1486,7 +1490,7 @@ public class PackageWatchdog { * #loadFromFile which in turn is only called on construction of the * singleton PackageWatchdog. **/ public static ObserverInternal read(TypedXmlPullParser parser, PackageWatchdog watchdog) { public static ObserverInternal read(XmlPullParser parser, PackageWatchdog watchdog) { String observerName = null; int observerMitigationCount = 0; if (TAG_OBSERVER.equals(parser.getName())) { Loading @@ -1501,9 +1505,9 @@ public class PackageWatchdog { try { if (Flags.recoverabilityDetection()) { try { observerMitigationCount = parser.getAttributeInt(null, ATTR_MITIGATION_COUNT); } catch (XmlPullParserException e) { observerMitigationCount = Integer.parseInt( parser.getAttributeValue(null, ATTR_MITIGATION_COUNT)); } catch (Exception e) { Slog.i( TAG, "ObserverInternal mitigation count was not present."); Loading Loading @@ -1579,13 +1583,14 @@ public class PackageWatchdog { hasPassedHealthCheck, mitigationCalls); } MonitoredPackage parseMonitoredPackage(TypedXmlPullParser parser) MonitoredPackage parseMonitoredPackage(XmlPullParser parser) throws XmlPullParserException { String packageName = parser.getAttributeValue(null, ATTR_NAME); long duration = parser.getAttributeLong(null, ATTR_DURATION); long healthCheckDuration = parser.getAttributeLong(null, ATTR_EXPLICIT_HEALTH_CHECK_DURATION); boolean hasPassedHealthCheck = parser.getAttributeBoolean(null, ATTR_PASSED_HEALTH_CHECK); long duration = Long.parseLong(parser.getAttributeValue(null, ATTR_DURATION)); long healthCheckDuration = Long.parseLong(parser.getAttributeValue(null, ATTR_EXPLICIT_HEALTH_CHECK_DURATION)); boolean hasPassedHealthCheck = Boolean.parseBoolean(parser.getAttributeValue(null, ATTR_PASSED_HEALTH_CHECK)); LongArrayQueue mitigationCalls = parseLongArrayQueue( parser.getAttributeValue(null, ATTR_MITIGATION_CALLS)); return newMonitoredPackage(packageName, Loading Loading @@ -1643,12 +1648,13 @@ public class PackageWatchdog { * @hide */ @GuardedBy("mLock") public void writeLocked(TypedXmlSerializer out) throws IOException { public void writeLocked(XmlSerializer out) throws IOException { out.startTag(null, TAG_PACKAGE); out.attribute(null, ATTR_NAME, getName()); out.attributeLong(null, ATTR_DURATION, mDurationMs); out.attributeLong(null, ATTR_EXPLICIT_HEALTH_CHECK_DURATION, mHealthCheckDurationMs); out.attributeBoolean(null, ATTR_PASSED_HEALTH_CHECK, mHasPassedHealthCheck); out.attribute(null, ATTR_DURATION, Long.toString(mDurationMs)); out.attribute(null, ATTR_EXPLICIT_HEALTH_CHECK_DURATION, Long.toString(mHealthCheckDurationMs)); out.attribute(null, ATTR_PASSED_HEALTH_CHECK, Boolean.toString(mHasPassedHealthCheck)); LongArrayQueue normalizedCalls = normalizeMitigationCalls(); out.attribute(null, ATTR_MITIGATION_CALLS, longArrayQueueToString(normalizedCalls)); out.endTag(null, TAG_PACKAGE); Loading Loading
packages/CrashRecovery/services/module/java/com/android/server/PackageWatchdog.java +27 −21 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.server; import static android.content.Intent.ACTION_REBOOT; import static android.content.Intent.ACTION_SHUTDOWN; import static android.service.watchdog.ExplicitHealthCheckService.PackageConfig; import static android.util.Xml.Encoding.UTF_8; import static com.android.server.crashrecovery.CrashRecoveryUtils.dumpCrashRecoveryEvents; Loading Loading @@ -58,13 +59,14 @@ import android.util.XmlUtils; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.FastXmlSerializer; import com.android.modules.utils.BackgroundThread; import com.android.modules.utils.TypedXmlPullParser; import com.android.modules.utils.TypedXmlSerializer; import libcore.io.IoUtils; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlSerializer; import java.io.BufferedReader; import java.io.BufferedWriter; Loading Loading @@ -1152,7 +1154,8 @@ public class PackageWatchdog { mAllObservers.clear(); try { infile = mPolicyFile.openRead(); final TypedXmlPullParser parser = Xml.resolvePullParser(infile); final XmlPullParser parser = Xml.newPullParser(); parser.setInput(infile, UTF_8.name()); XmlUtils.beginDocument(parser, TAG_PACKAGE_WATCHDOG); int outerDepth = parser.getDepth(); while (XmlUtils.nextElementWithin(parser, outerDepth)) { Loading @@ -1163,7 +1166,7 @@ public class PackageWatchdog { } } catch (FileNotFoundException e) { // Nothing to monitor } catch (IOException | NumberFormatException | XmlPullParserException e) { } catch (Exception e) { Slog.wtf(TAG, "Unable to read monitored packages, deleting file", e); mPolicyFile.delete(); } finally { Loading Loading @@ -1237,10 +1240,11 @@ public class PackageWatchdog { } try { TypedXmlSerializer out = Xml.resolveSerializer(stream); XmlSerializer out = new FastXmlSerializer(); out.setOutput(stream, UTF_8.name()); out.startDocument(null, true); out.startTag(null, TAG_PACKAGE_WATCHDOG); out.attributeInt(null, ATTR_VERSION, DB_VERSION); out.attribute(null, ATTR_VERSION, Integer.toString(DB_VERSION)); for (int oIndex = 0; oIndex < mAllObservers.size(); oIndex++) { mAllObservers.valueAt(oIndex).writeLocked(out); } Loading Loading @@ -1356,12 +1360,12 @@ public class PackageWatchdog { * Does not persist any package failure thresholds. */ @GuardedBy("mLock") public boolean writeLocked(TypedXmlSerializer out) { public boolean writeLocked(XmlSerializer out) { try { out.startTag(null, TAG_OBSERVER); out.attribute(null, ATTR_NAME, name); if (Flags.recoverabilityDetection()) { out.attributeInt(null, ATTR_MITIGATION_COUNT, mMitigationCount); out.attribute(null, ATTR_MITIGATION_COUNT, Integer.toString(mMitigationCount)); } for (int i = 0; i < mPackages.size(); i++) { MonitoredPackage p = mPackages.valueAt(i); Loading Loading @@ -1486,7 +1490,7 @@ public class PackageWatchdog { * #loadFromFile which in turn is only called on construction of the * singleton PackageWatchdog. **/ public static ObserverInternal read(TypedXmlPullParser parser, PackageWatchdog watchdog) { public static ObserverInternal read(XmlPullParser parser, PackageWatchdog watchdog) { String observerName = null; int observerMitigationCount = 0; if (TAG_OBSERVER.equals(parser.getName())) { Loading @@ -1501,9 +1505,9 @@ public class PackageWatchdog { try { if (Flags.recoverabilityDetection()) { try { observerMitigationCount = parser.getAttributeInt(null, ATTR_MITIGATION_COUNT); } catch (XmlPullParserException e) { observerMitigationCount = Integer.parseInt( parser.getAttributeValue(null, ATTR_MITIGATION_COUNT)); } catch (Exception e) { Slog.i( TAG, "ObserverInternal mitigation count was not present."); Loading Loading @@ -1579,13 +1583,14 @@ public class PackageWatchdog { hasPassedHealthCheck, mitigationCalls); } MonitoredPackage parseMonitoredPackage(TypedXmlPullParser parser) MonitoredPackage parseMonitoredPackage(XmlPullParser parser) throws XmlPullParserException { String packageName = parser.getAttributeValue(null, ATTR_NAME); long duration = parser.getAttributeLong(null, ATTR_DURATION); long healthCheckDuration = parser.getAttributeLong(null, ATTR_EXPLICIT_HEALTH_CHECK_DURATION); boolean hasPassedHealthCheck = parser.getAttributeBoolean(null, ATTR_PASSED_HEALTH_CHECK); long duration = Long.parseLong(parser.getAttributeValue(null, ATTR_DURATION)); long healthCheckDuration = Long.parseLong(parser.getAttributeValue(null, ATTR_EXPLICIT_HEALTH_CHECK_DURATION)); boolean hasPassedHealthCheck = Boolean.parseBoolean(parser.getAttributeValue(null, ATTR_PASSED_HEALTH_CHECK)); LongArrayQueue mitigationCalls = parseLongArrayQueue( parser.getAttributeValue(null, ATTR_MITIGATION_CALLS)); return newMonitoredPackage(packageName, Loading Loading @@ -1643,12 +1648,13 @@ public class PackageWatchdog { * @hide */ @GuardedBy("mLock") public void writeLocked(TypedXmlSerializer out) throws IOException { public void writeLocked(XmlSerializer out) throws IOException { out.startTag(null, TAG_PACKAGE); out.attribute(null, ATTR_NAME, getName()); out.attributeLong(null, ATTR_DURATION, mDurationMs); out.attributeLong(null, ATTR_EXPLICIT_HEALTH_CHECK_DURATION, mHealthCheckDurationMs); out.attributeBoolean(null, ATTR_PASSED_HEALTH_CHECK, mHasPassedHealthCheck); out.attribute(null, ATTR_DURATION, Long.toString(mDurationMs)); out.attribute(null, ATTR_EXPLICIT_HEALTH_CHECK_DURATION, Long.toString(mHealthCheckDurationMs)); out.attribute(null, ATTR_PASSED_HEALTH_CHECK, Boolean.toString(mHasPassedHealthCheck)); LongArrayQueue normalizedCalls = normalizeMitigationCalls(); out.attribute(null, ATTR_MITIGATION_CALLS, longArrayQueueToString(normalizedCalls)); out.endTag(null, TAG_PACKAGE); Loading