diff --git a/src/com/android/packageinstaller/EventLogTags.logtags b/src/com/android/packageinstaller/EventLogTags.logtags
index 5cb5d91f4a4ab4df77f9a2a3e81c4e0a9e037cc3..018314883592c5d64d872aebb1af1b7775c2af45 100644
--- a/src/com/android/packageinstaller/EventLogTags.logtags
+++ b/src/com/android/packageinstaller/EventLogTags.logtags
@@ -3,4 +3,4 @@
 option java_package com.android.packageinstaller
 
 # APK install attempt via PackageInstaller (see InstallFlowAnalytics for format)
-90300 install_package_attempt (type|4)
+90300 install_package_attempt (result_and_flags|1),(total_time|1|3),(time_till_pkg_info_obtained|1|3),(time_till_install_clicked|1|3)
diff --git a/src/com/android/packageinstaller/InstallFlowAnalytics.java b/src/com/android/packageinstaller/InstallFlowAnalytics.java
index 8fc805ade39d21a42ef9b56547c59f7edeae6fd3..ac8e53ac91b2416ed199a7f8d525ae0060e9155c 100644
--- a/src/com/android/packageinstaller/InstallFlowAnalytics.java
+++ b/src/com/android/packageinstaller/InstallFlowAnalytics.java
@@ -115,7 +115,7 @@ public class InstallFlowAnalytics implements Parcelable {
     /**
      * Time instant when the user clicked the Install button, measured in elapsed realtime
      * milliseconds. See {@link SystemClock#elapsedRealtime()}. This field is only valid if the
-     * Install button has been clicked as recorded in {@link #mInstallButtonClicked}.
+     * Install button has been clicked, as signaled by {@link #FLAG_INSTALL_BUTTON_CLICKED}.
      */
     private long mInstallButtonClickTimestampMillis;
 
@@ -385,12 +385,45 @@ public class InstallFlowAnalytics implements Parcelable {
     }
 
     private void writeToEventLog() {
-        Object[] value = getEventLogEventValue();
-        EventLog.writeEvent(EventLogTags.INSTALL_PACKAGE_ATTEMPT, value);
+        byte packageManagerInstallResultByte = 0;
+        if (mResult == RESULT_PACKAGE_MANAGER_INSTALL_FAILED) {
+            // PackageManager install error codes are negative, starting from -1 and going to
+            // -111 (at the moment). We thus store them in negated form.
+            packageManagerInstallResultByte = clipUnsignedValueToUnsignedByte(
+                    -mPackageManagerInstallResult);
+        }
+
+        int resultAndFlags = (mResult & 0xff)
+                | ((packageManagerInstallResultByte & 0xff) << 8)
+                | ((mFlags & 0xffff) << 16);
+
+        // Total elapsed time from start to end, in milliseconds.
+        int totalElapsedTime =
+                clipUnsignedLongToUnsignedInt(mEndTimestampMillis - mStartTimestampMillis);
+
+        // Total elapsed time from start till information about the package being installed was
+        // obtained, in milliseconds.
+        int elapsedTimeTillPackageInfoObtained = (isPackageInfoObtained())
+                ? clipUnsignedLongToUnsignedInt(
+                        mPackageInfoObtainedTimestampMillis - mStartTimestampMillis)
+                : 0;
+
+        // Total elapsed time from start till Install button clicked, in milliseconds
+        // milliseconds.
+        int elapsedTimeTillInstallButtonClick = (isInstallButtonClicked())
+                ? clipUnsignedLongToUnsignedInt(
+                            mInstallButtonClickTimestampMillis - mStartTimestampMillis)
+                : 0;
+
+        EventLogTags.writeInstallPackageAttempt(
+                resultAndFlags,
+                totalElapsedTime,
+                elapsedTimeTillPackageInfoObtained,
+                elapsedTimeTillInstallButtonClick);
         mLogged = true;
 
         if (Log.isLoggable(TAG, Log.VERBOSE)) {
-            Log.v(TAG, "Aalytics:"
+            Log.v(TAG, "Analytics:"
                     + "\n\tinstallsFromUnknownSourcesPermitted: "
                         + isInstallsFromUnknownSourcesPermitted()
                     + "\n\tinstallRequestFromUnknownSource: " + isInstallRequestFromUnknownSource()
@@ -417,67 +450,11 @@ public class InstallFlowAnalytics implements Parcelable {
                         + ((isInstallButtonClicked())
                             ? ((mInstallButtonClickTimestampMillis - mStartTimestampMillis) + " ms")
                             : "n/a"));
-            StringBuilder dump = new StringBuilder();
-            for (Object element : value) {
-                if (dump.length() > 0) {
-                    dump.append(", ");
-                }
-                if (element instanceof Integer) {
-                    dump.append("0x")
-                            .append(Long.toString(((Integer) element) & 0xffffffffL, 16));
-                } else {
-                    dump.append(element);
-                }
-            }
-            Log.v(TAG, "Wrote to Event Log: " + dump);
-        }
-    }
-
-    private Object[] getEventLogEventValue() {
-        // IMPLEMENTATION NOTE: Analytics are packed into the following list:
-        // * 32-bit int (ordered from least significant to most significant bits):
-        //   * 1 byte:  outcome of the flow (see RESULT_... constants)
-        //   * 1 byte:  PackageManager install error code (negated) or 0 if it didn't run
-        //   * 2 bytes: flags (see FLAG_... constants)
-        // * 32-bit unsigned int: total elapsed time (milliseconds)
-        // * 32-bit unsigned int: time elapsed from start till information about the package being
-        //   installed was obtained (milliseconds)
-        // * 32-bit unsigned int: time elapsed from start till Install button click (milliseconds)
-
-        byte packageManagerInstallResultByte = 0;
-        if (mResult == RESULT_PACKAGE_MANAGER_INSTALL_FAILED) {
-            // PackageManager install error codes are negative, starting from -1 and going to
-            // -111 (at the moment). We thus store them in negated form.
-            packageManagerInstallResultByte = clipUnsignedValueToUnsignedByte(
-                    -mPackageManagerInstallResult);
+            Log.v(TAG, "Wrote to Event Log: 0x" + Long.toString(resultAndFlags & 0xffffffffL, 16)
+                    + ", " + totalElapsedTime
+                    + ", " + elapsedTimeTillPackageInfoObtained
+                    + ", " + elapsedTimeTillInstallButtonClick);
         }
-
-        // Total elapsed time from start to end, in milliseconds.
-        int totalElapsedTime =
-                clipUnsignedLongToUnsignedInt(mEndTimestampMillis - mStartTimestampMillis);
-
-        // Total elapsed time from start till information about the package being installed was
-        // obtained, in milliseconds.
-        int elapsedTimeTillPackageInfoObtained = (isPackageInfoObtained())
-                ? clipUnsignedLongToUnsignedInt(
-                        mPackageInfoObtainedTimestampMillis - mStartTimestampMillis)
-                : 0;
-
-        // Total elapsed time from start till Install button clicked, in milliseconds
-        // milliseconds.
-        int elapsedTimeTillInstallButtonClick = (isInstallButtonClicked())
-                ? clipUnsignedLongToUnsignedInt(
-                            mInstallButtonClickTimestampMillis - mStartTimestampMillis)
-                : 0;
-
-        return new Object[] {
-                (int) ((mResult & 0xff)
-                        | ((packageManagerInstallResultByte & 0xff) << 8)
-                        | ((mFlags & 0xffffL) << 16)),
-                 totalElapsedTime,
-                 elapsedTimeTillPackageInfoObtained,
-                 elapsedTimeTillInstallButtonClick,
-        };
     }
 
     private static final byte clipUnsignedValueToUnsignedByte(long value) {