Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cde5e99d authored by Neil Fuller's avatar Neil Fuller
Browse files

Logging improvements for time zone updates

Logging improvements for time zone updates:
1) Add EventLog entries time zone update service interactions.
2) Add more information to dumpsys logs to improve debugging.

Unit tests run with:

make -j30 FrameworksServicesTests
adb install -r -g \
  "out/target/product/angler/data/app/FrameworksServicesTests/FrameworksServicesTests.apk"
adb shell am instrument -e package com.android.server.timezone -w \
  com.android.frameworks.servicestests \
  "com.android.frameworks.servicestests/android.support.test.runner.AndroidJUnitRunner"

Bug: 31008728
Test: See above for unit testing.
Test: Internal xTS tests
Test: adb shell dumpsys timezone
Test: adb logcat -b events -v threadtime -v printable -v uid -d *:v
Change-Id: I9356f4694e60b49e4b06aadd632d1bad517b8a29
(cherry picked from commit d857f676)
parent e7e68b89
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -268,3 +268,16 @@ option java_package com.android.server
# GestureLauncherService.java
# ---------------------------
40100 camera_gesture_triggered (gesture_on_time|2|3), (sensor1_on_time|2|3), (sensor2_on_time|2|3), (event_extra|1|1)

# ---------------------------
# timezone/RulesManagerService.java
# ---------------------------
51600 timezone_trigger_check (token|3)
51610 timezone_request_install (token|3)
51611 timezone_install_started (token|3)
51612 timezone_install_complete (token|3), (result|1)
51620 timezone_request_uninstall (token|3)
51621 timezone_uninstall_started (token|3)
51622 timezone_uninstall_complete (token|3), (result|1)
51630 timezone_request_nothing (token|3)
51631 timezone_nothing_complete (token|3)
+3 −2
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.server.timezone;

import com.android.server.EventLogTags;

import android.app.timezone.RulesUpdaterContract;
import android.content.BroadcastReceiver;
import android.content.Context;
@@ -24,8 +26,6 @@ import android.content.IntentFilter;
import android.os.PatternMatcher;
import android.util.Slog;

import java.util.regex.Pattern;

/**
 * The bona fide implementation of {@link IntentHelper}.
 */
@@ -75,6 +75,7 @@ final class IntentHelperImpl implements IntentHelper {
    public void sendTriggerUpdateCheck(CheckToken checkToken) {
        RulesUpdaterContract.sendBroadcast(
                mContext, mUpdaterAppPackageName, checkToken.toByteArray());
        EventLogTags.writeTimezoneTriggerCheck(checkToken.toString());
    }

    @Override
+20 −2
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.server.timezone;

import com.android.internal.annotations.VisibleForTesting;
import com.android.server.EventLogTags;
import com.android.server.SystemService;
import com.android.timezone.distro.DistroException;
import com.android.timezone.distro.DistroVersion;
@@ -56,8 +57,6 @@ import static android.app.timezone.RulesState.STAGED_OPERATION_NONE;
import static android.app.timezone.RulesState.STAGED_OPERATION_UNINSTALL;
import static android.app.timezone.RulesState.STAGED_OPERATION_UNKNOWN;

// TODO(nfuller) Add EventLog calls where useful in the system server.
// TODO(nfuller) Check logging best practices in the system server.
// TODO(nfuller) Check error handling best practices in the system server.
public final class RulesManagerService extends IRulesManager.Stub {

@@ -203,6 +202,7 @@ public final class RulesManagerService extends IRulesManager.Stub {
            if (checkTokenBytes != null) {
                checkToken = createCheckTokenOrThrow(checkTokenBytes);
            }
            EventLogTags.writeTimezoneRequestInstall(toStringOrNull(checkToken));

            synchronized (this) {
                if (distroParcelFileDescriptor == null) {
@@ -254,6 +254,8 @@ public final class RulesManagerService extends IRulesManager.Stub {

        @Override
        public void run() {
            EventLogTags.writeTimezoneInstallStarted(toStringOrNull(mCheckToken));

            boolean success = false;
            // Adopt the ParcelFileDescriptor into this try-with-resources so it is closed
            // when we are done.
@@ -266,6 +268,7 @@ public final class RulesManagerService extends IRulesManager.Stub {
                TimeZoneDistro distro = new TimeZoneDistro(is);
                int installerResult = mInstaller.stageInstallWithErrorCode(distro);
                int resultCode = mapInstallerResultToApiCode(installerResult);
                EventLogTags.writeTimezoneInstallComplete(toStringOrNull(mCheckToken), resultCode);
                sendFinishedStatus(mCallback, resultCode);

                // All the installer failure modes are currently non-recoverable and won't be
@@ -273,6 +276,8 @@ public final class RulesManagerService extends IRulesManager.Stub {
                success = true;
            } catch (Exception e) {
                Slog.w(TAG, "Failed to install distro.", e);
                EventLogTags.writeTimezoneInstallComplete(
                        toStringOrNull(mCheckToken), Callback.ERROR_UNKNOWN_FAILURE);
                sendFinishedStatus(mCallback, Callback.ERROR_UNKNOWN_FAILURE);
            } finally {
                // Notify the package tracker that the operation is now complete.
@@ -308,6 +313,7 @@ public final class RulesManagerService extends IRulesManager.Stub {
        if (checkTokenBytes != null) {
            checkToken = createCheckTokenOrThrow(checkTokenBytes);
        }
        EventLogTags.writeTimezoneRequestUninstall(toStringOrNull(checkToken));
        synchronized(this) {
            if (callback == null) {
                throw new NullPointerException("callback == null");
@@ -337,6 +343,7 @@ public final class RulesManagerService extends IRulesManager.Stub {

        @Override
        public void run() {
            EventLogTags.writeTimezoneUninstallStarted(toStringOrNull(mCheckToken));
            boolean success = false;
            try {
                success = mInstaller.stageUninstall();
@@ -344,8 +351,12 @@ public final class RulesManagerService extends IRulesManager.Stub {
                // against SUCCESS. More granular failures may be added in future.
                int resultCode = success ? Callback.SUCCESS
                        : Callback.ERROR_UNKNOWN_FAILURE;
                EventLogTags.writeTimezoneUninstallComplete(
                        toStringOrNull(mCheckToken), resultCode);
                sendFinishedStatus(mCallback, resultCode);
            } catch (Exception e) {
                EventLogTags.writeTimezoneUninstallComplete(
                        toStringOrNull(mCheckToken), Callback.ERROR_UNKNOWN_FAILURE);
                Slog.w(TAG, "Failed to uninstall distro.", e);
                sendFinishedStatus(mCallback, Callback.ERROR_UNKNOWN_FAILURE);
            } finally {
@@ -372,7 +383,9 @@ public final class RulesManagerService extends IRulesManager.Stub {
        if (checkTokenBytes != null) {
            checkToken = createCheckTokenOrThrow(checkTokenBytes);
        }
        EventLogTags.writeTimezoneRequestNothing(toStringOrNull(checkToken));
        mPackageTracker.recordCheckResult(checkToken, success);
        EventLogTags.writeTimezoneNothingComplete(toStringOrNull(checkToken));
    }

    @Override
@@ -445,6 +458,7 @@ public final class RulesManagerService extends IRulesManager.Stub {
        pw.println("RulesManagerService state: " + toString());
        pw.println("Active rules version (ICU, libcore): " + ICU.getTZDataVersion() + ","
                + ZoneInfoDB.getInstance().getVersion());
        pw.println("Distro state: " + rulesState.toString());
        mPackageTracker.dump(pw);
    }

@@ -491,4 +505,8 @@ public final class RulesManagerService extends IRulesManager.Stub {
                return "Unknown";
        }
    }

    private static String toStringOrNull(Object obj) {
        return obj == null ? null : obj.toString();
    }
}