Use ComponentName as owner in query, event and related tables.

Bug: 315006058
Test: atest, manually tested ODP and FCP CUJ
Change-Id: I0e65a604ea51e1b43f1d4da09a7638b5094d8974
diff --git a/src/com/android/ondevicepersonalization/services/data/DataAccessServiceImpl.java b/src/com/android/ondevicepersonalization/services/data/DataAccessServiceImpl.java
index f6a3d0f..2f3a3e9 100644
--- a/src/com/android/ondevicepersonalization/services/data/DataAccessServiceImpl.java
+++ b/src/com/android/ondevicepersonalization/services/data/DataAccessServiceImpl.java
@@ -366,8 +366,8 @@
     private void getRequests(long startTimeMillis, long endTimeMillis,
             @NonNull IDataAccessServiceCallback callback) {
         try {
-            List<Query> queries = mEventsDao.readAllQueries(startTimeMillis, endTimeMillis,
-                    mService.getPackageName());
+            List<Query> queries = mEventsDao.readAllQueries(
+                    startTimeMillis, endTimeMillis, mService);
             List<RequestLogRecord> requestLogRecords = new ArrayList<>();
             for (Query query : queries) {
                 RequestLogRecord record = new RequestLogRecord.Builder()
@@ -390,9 +390,8 @@
     private void getJoinedEvents(long startTimeMillis, long endTimeMillis,
             @NonNull IDataAccessServiceCallback callback) {
         try {
-            List<JoinedEvent> joinedEvents = mEventsDao.readJoinedTableRows(startTimeMillis,
-                    endTimeMillis,
-                    mService.getPackageName());
+            List<JoinedEvent> joinedEvents = mEventsDao.readJoinedTableRows(
+                    startTimeMillis, endTimeMillis, mService);
             List<EventLogRecord> joinedLogRecords = new ArrayList<>();
             for (JoinedEvent joinedEvent : joinedEvents) {
                 RequestLogRecord requestLogRecord = new RequestLogRecord.Builder()
diff --git a/src/com/android/ondevicepersonalization/services/data/vendor/DbUtils.java b/src/com/android/ondevicepersonalization/services/data/DbUtils.java
similarity index 91%
rename from src/com/android/ondevicepersonalization/services/data/vendor/DbUtils.java
rename to src/com/android/ondevicepersonalization/services/data/DbUtils.java
index 0400c97..da1e772 100644
--- a/src/com/android/ondevicepersonalization/services/data/vendor/DbUtils.java
+++ b/src/com/android/ondevicepersonalization/services/data/DbUtils.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.ondevicepersonalization.services.data.vendor;
+package com.android.ondevicepersonalization.services.data;
 
 import android.annotation.NonNull;
 import android.content.ComponentName;
@@ -23,7 +23,8 @@
 
 /** Database utilities */
 public class DbUtils {
-    static String getTableName(
+    /** Returns the table name for a service */
+    public static String getTableName(
             @NonNull String prefix, @NonNull ComponentName owner, @NonNull String certDigest) {
         String ownerStr = owner.getPackageName() + "__" + owner.getShortClassName();
         ownerStr = ownerStr.replace(".", "_");
diff --git a/src/com/android/ondevicepersonalization/services/data/events/Event.java b/src/com/android/ondevicepersonalization/services/data/events/Event.java
index e9b1d88..6bcb9f7 100644
--- a/src/com/android/ondevicepersonalization/services/data/events/Event.java
+++ b/src/com/android/ondevicepersonalization/services/data/events/Event.java
@@ -18,9 +18,11 @@
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.content.ComponentName;
 
 import com.android.ondevicepersonalization.internal.util.AnnotationValidations;
 import com.android.ondevicepersonalization.internal.util.DataClass;
+import com.android.ondevicepersonalization.services.data.DbUtils;
 
 import java.io.Serializable;
 
@@ -43,7 +45,7 @@
 
     /** Name of the service for this event */
     @NonNull
-    private final String mServiceName;
+    private final ComponentName mService;
 
     /** The service assigned type of the event. */
     private final int mType;
@@ -55,6 +57,11 @@
     @Nullable
     private final byte[] mEventData;
 
+    /** The name of the service */
+    public String getServiceName() {
+        return DbUtils.toTableValue(mService);
+    }
+
 
 
     // Code below generated by codegen v1.0.23.
@@ -75,16 +82,16 @@
             long eventId,
             long queryId,
             int rowIndex,
-            @NonNull String serviceName,
+            @NonNull ComponentName service,
             int type,
             long timeMillis,
             @Nullable byte[] eventData) {
         this.mEventId = eventId;
         this.mQueryId = queryId;
         this.mRowIndex = rowIndex;
-        this.mServiceName = serviceName;
+        this.mService = service;
         AnnotationValidations.validate(
-                NonNull.class, null, mServiceName);
+                NonNull.class, null, mService);
         this.mType = type;
         this.mTimeMillis = timeMillis;
         this.mEventData = eventData;
@@ -120,8 +127,8 @@
      * Name of the service for this event
      */
     @DataClass.Generated.Member
-    public @NonNull String getServiceName() {
-        return mServiceName;
+    public @NonNull ComponentName getService() {
+        return mService;
     }
 
     /**
@@ -164,7 +171,7 @@
                 && mEventId == that.mEventId
                 && mQueryId == that.mQueryId
                 && mRowIndex == that.mRowIndex
-                && java.util.Objects.equals(mServiceName, that.mServiceName)
+                && java.util.Objects.equals(mService, that.mService)
                 && mType == that.mType
                 && mTimeMillis == that.mTimeMillis
                 && java.util.Arrays.equals(mEventData, that.mEventData);
@@ -180,7 +187,7 @@
         _hash = 31 * _hash + Long.hashCode(mEventId);
         _hash = 31 * _hash + Long.hashCode(mQueryId);
         _hash = 31 * _hash + mRowIndex;
-        _hash = 31 * _hash + java.util.Objects.hashCode(mServiceName);
+        _hash = 31 * _hash + java.util.Objects.hashCode(mService);
         _hash = 31 * _hash + mType;
         _hash = 31 * _hash + Long.hashCode(mTimeMillis);
         _hash = 31 * _hash + java.util.Arrays.hashCode(mEventData);
@@ -197,7 +204,7 @@
         private long mEventId;
         private long mQueryId;
         private int mRowIndex;
-        private @NonNull String mServiceName;
+        private @NonNull ComponentName mService;
         private int mType;
         private long mTimeMillis;
         private @Nullable byte[] mEventData;
@@ -216,7 +223,7 @@
          *   The id of the query.
          * @param rowIndex
          *   Index of the associated entry in the request log for this event.
-         * @param serviceName
+         * @param service
          *   Name of the service for this event
          * @param type
          *   The service assigned type of the event.
@@ -229,16 +236,16 @@
                 long eventId,
                 long queryId,
                 int rowIndex,
-                @NonNull String serviceName,
+                @NonNull ComponentName service,
                 int type,
                 long timeMillis,
                 @Nullable byte[] eventData) {
             mEventId = eventId;
             mQueryId = queryId;
             mRowIndex = rowIndex;
-            mServiceName = serviceName;
+            mService = service;
             AnnotationValidations.validate(
-                    NonNull.class, null, mServiceName);
+                    NonNull.class, null, mService);
             mType = type;
             mTimeMillis = timeMillis;
             mEventData = eventData;
@@ -281,10 +288,10 @@
          * Name of the service for this event
          */
         @DataClass.Generated.Member
-        public @NonNull Builder setServiceName(@NonNull String value) {
+        public @NonNull Builder setService(@NonNull ComponentName value) {
             checkNotUsed();
             mBuilderFieldsSet |= 0x8;
-            mServiceName = value;
+            mService = value;
             return this;
         }
 
@@ -330,7 +337,7 @@
                     mEventId,
                     mQueryId,
                     mRowIndex,
-                    mServiceName,
+                    mService,
                     mType,
                     mTimeMillis,
                     mEventData);
@@ -346,10 +353,10 @@
     }
 
     @DataClass.Generated(
-            time = 1706637135336L,
+            time = 1708721537301L,
             codegenVersion = "1.0.23",
             sourceFile = "packages/modules/OnDevicePersonalization/src/com/android/ondevicepersonalization/services/data/events/Event.java",
-            inputSignatures = "private final  long mEventId\nprivate final  long mQueryId\nprivate final  int mRowIndex\nprivate final @android.annotation.NonNull java.lang.String mServiceName\nprivate final  int mType\nprivate final  long mTimeMillis\nprivate final @android.annotation.Nullable byte[] mEventData\nclass Event extends java.lang.Object implements [java.io.Serializable]\n@com.android.ondevicepersonalization.internal.util.DataClass(genBuilder=true, genEqualsHashCode=true)")
+            inputSignatures = "private final  long mEventId\nprivate final  long mQueryId\nprivate final  int mRowIndex\nprivate final @android.annotation.NonNull android.content.ComponentName mService\nprivate final  int mType\nprivate final  long mTimeMillis\nprivate final @android.annotation.Nullable byte[] mEventData\npublic  java.lang.String getServiceName()\nclass Event extends java.lang.Object implements [java.io.Serializable]\n@com.android.ondevicepersonalization.internal.util.DataClass(genBuilder=true, genEqualsHashCode=true)")
     @Deprecated
     private void __metadata() {}
 
diff --git a/src/com/android/ondevicepersonalization/services/data/events/EventState.java b/src/com/android/ondevicepersonalization/services/data/events/EventState.java
index e0ecac7..9d4069c 100644
--- a/src/com/android/ondevicepersonalization/services/data/events/EventState.java
+++ b/src/com/android/ondevicepersonalization/services/data/events/EventState.java
@@ -17,9 +17,11 @@
 package com.android.ondevicepersonalization.services.data.events;
 
 import android.annotation.NonNull;
+import android.content.ComponentName;
 
 import com.android.ondevicepersonalization.internal.util.AnnotationValidations;
 import com.android.ondevicepersonalization.internal.util.DataClass;
+import com.android.ondevicepersonalization.services.data.DbUtils;
 
 /**
  * EventState object for the EventState table
@@ -35,12 +37,17 @@
 
     /** Name of the service package for this event */
     @NonNull
-    private final String mServiceName;
+    private final ComponentName mService;
 
     /** Unique identifier of the task for processing this event */
     @NonNull
     private final String mTaskIdentifier;
 
+    /** The name of the service */
+    public String getServiceName() {
+        return DbUtils.toTableValue(mService);
+    }
+
 
 
     // Code below generated by codegen v1.0.23.
@@ -59,14 +66,14 @@
     @DataClass.Generated.Member
     /* package-private */ EventState(
             @NonNull byte[] token,
-            @NonNull String serviceName,
+            @NonNull ComponentName service,
             @NonNull String taskIdentifier) {
         this.mToken = token;
         AnnotationValidations.validate(
                 NonNull.class, null, mToken);
-        this.mServiceName = serviceName;
+        this.mService = service;
         AnnotationValidations.validate(
-                NonNull.class, null, mServiceName);
+                NonNull.class, null, mService);
         this.mTaskIdentifier = taskIdentifier;
         AnnotationValidations.validate(
                 NonNull.class, null, mTaskIdentifier);
@@ -86,8 +93,8 @@
      * Name of the service package for this event
      */
     @DataClass.Generated.Member
-    public @NonNull String getServiceName() {
-        return mServiceName;
+    public @NonNull ComponentName getService() {
+        return mService;
     }
 
     /**
@@ -112,7 +119,7 @@
         //noinspection PointlessBooleanExpression
         return true
                 && java.util.Arrays.equals(mToken, that.mToken)
-                && java.util.Objects.equals(mServiceName, that.mServiceName)
+                && java.util.Objects.equals(mService, that.mService)
                 && java.util.Objects.equals(mTaskIdentifier, that.mTaskIdentifier);
     }
 
@@ -124,7 +131,7 @@
 
         int _hash = 1;
         _hash = 31 * _hash + java.util.Arrays.hashCode(mToken);
-        _hash = 31 * _hash + java.util.Objects.hashCode(mServiceName);
+        _hash = 31 * _hash + java.util.Objects.hashCode(mService);
         _hash = 31 * _hash + java.util.Objects.hashCode(mTaskIdentifier);
         return _hash;
     }
@@ -137,7 +144,7 @@
     public static class Builder {
 
         private @NonNull byte[] mToken;
-        private @NonNull String mServiceName;
+        private @NonNull ComponentName mService;
         private @NonNull String mTaskIdentifier;
 
         private long mBuilderFieldsSet = 0L;
@@ -150,21 +157,21 @@
          *
          * @param token
          *   Token representing the event state.
-         * @param serviceName
+         * @param service
          *   Name of the service package for this event
          * @param taskIdentifier
          *   Unique identifier of the task for processing this event
          */
         public Builder(
                 @NonNull byte[] token,
-                @NonNull String serviceName,
+                @NonNull ComponentName service,
                 @NonNull String taskIdentifier) {
             mToken = token;
             AnnotationValidations.validate(
                     NonNull.class, null, mToken);
-            mServiceName = serviceName;
+            mService = service;
             AnnotationValidations.validate(
-                    NonNull.class, null, mServiceName);
+                    NonNull.class, null, mService);
             mTaskIdentifier = taskIdentifier;
             AnnotationValidations.validate(
                     NonNull.class, null, mTaskIdentifier);
@@ -185,10 +192,10 @@
          * Name of the service package for this event
          */
         @DataClass.Generated.Member
-        public @NonNull Builder setServiceName(@NonNull String value) {
+        public @NonNull Builder setService(@NonNull ComponentName value) {
             checkNotUsed();
             mBuilderFieldsSet |= 0x2;
-            mServiceName = value;
+            mService = value;
             return this;
         }
 
@@ -210,7 +217,7 @@
 
             EventState o = new EventState(
                     mToken,
-                    mServiceName,
+                    mService,
                     mTaskIdentifier);
             return o;
         }
@@ -224,10 +231,10 @@
     }
 
     @DataClass.Generated(
-            time = 1706637187027L,
+            time = 1708721665919L,
             codegenVersion = "1.0.23",
             sourceFile = "packages/modules/OnDevicePersonalization/src/com/android/ondevicepersonalization/services/data/events/EventState.java",
-            inputSignatures = "private final @android.annotation.NonNull byte[] mToken\nprivate final @android.annotation.NonNull java.lang.String mServiceName\nprivate final @android.annotation.NonNull java.lang.String mTaskIdentifier\nclass EventState extends java.lang.Object implements []\n@com.android.ondevicepersonalization.internal.util.DataClass(genBuilder=true, genEqualsHashCode=true)")
+            inputSignatures = "private final @android.annotation.NonNull byte[] mToken\nprivate final @android.annotation.NonNull android.content.ComponentName mService\nprivate final @android.annotation.NonNull java.lang.String mTaskIdentifier\npublic  java.lang.String getServiceName()\nclass EventState extends java.lang.Object implements []\n@com.android.ondevicepersonalization.internal.util.DataClass(genBuilder=true, genEqualsHashCode=true)")
     @Deprecated
     private void __metadata() {}
 
diff --git a/src/com/android/ondevicepersonalization/services/data/events/EventsDao.java b/src/com/android/ondevicepersonalization/services/data/events/EventsDao.java
index 99c1ec4..ee9a6e8 100644
--- a/src/com/android/ondevicepersonalization/services/data/events/EventsDao.java
+++ b/src/com/android/ondevicepersonalization/services/data/events/EventsDao.java
@@ -17,6 +17,7 @@
 package com.android.ondevicepersonalization.services.data.events;
 
 import android.annotation.NonNull;
+import android.content.ComponentName;
 import android.content.ContentValues;
 import android.content.Context;
 import android.database.Cursor;
@@ -25,6 +26,7 @@
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.ondevicepersonalization.internal.util.LoggerFactory;
+import com.android.ondevicepersonalization.services.data.DbUtils;
 import com.android.ondevicepersonalization.services.data.OnDevicePersonalizationDbHelper;
 
 import java.util.ArrayList;
@@ -199,11 +201,11 @@
      *
      * @return eventState if found, null otherwise
      */
-    public EventState getEventState(String taskIdentifier, String packageName) {
+    public EventState getEventState(String taskIdentifier, ComponentName service) {
         SQLiteDatabase db = mDbHelper.getReadableDatabase();
         String selection = EventStateContract.EventStateEntry.TASK_IDENTIFIER + " = ? AND "
                 + EventStateContract.EventStateEntry.SERVICE_NAME + " = ?";
-        String[] selectionArgs = {taskIdentifier, packageName};
+        String[] selectionArgs = {taskIdentifier, DbUtils.toTableValue(service)};
         String[] projection = {EventStateContract.EventStateEntry.TOKEN};
         try (Cursor cursor = db.query(
                 EventStateContract.EventStateEntry.TABLE_NAME,
@@ -220,7 +222,7 @@
 
                 return new EventState.Builder()
                         .setToken(token)
-                        .setServiceName(packageName)
+                        .setService(service)
                         .setTaskIdentifier(taskIdentifier)
                         .build();
             }
@@ -234,13 +236,14 @@
      * Queries the events and queries table to return all new rows from given ids for the given
      * package
      *
-     * @param serviceName        Name of the service to read rows for
+     * @param service            Name of the service to read rows for
      * @param fromEventId        EventId to find all new rows from
      * @param fromQueryId        QueryId to find all new rows from
      * @return List of JoinedEvents.
      */
-    public List<JoinedEvent> readAllNewRowsForPackage(String serviceName,
+    public List<JoinedEvent> readAllNewRowsForPackage(ComponentName service,
             long fromEventId, long fromQueryId) {
+        String serviceName = DbUtils.toTableValue(service);
         // Query on the joined query & event table
         String joinedSelection = EventsContract.EventsEntry.EVENT_ID + " > ?"
                 + " AND " + EventsContract.EventsEntry.TABLE_NAME + "."
@@ -259,7 +262,7 @@
                     .setQueryId(query.getQueryId())
                     .setQueryData(query.getQueryData())
                     .setQueryTimeMillis(query.getTimeMillis())
-                    .setServiceName(query.getServiceName())
+                    .setService(query.getService())
                     .build());
         }
         return joinedEventList;
@@ -288,7 +291,7 @@
                     .setQueryId(query.getQueryId())
                     .setQueryData(query.getQueryData())
                     .setQueryTimeMillis(query.getTimeMillis())
-                    .setServiceName(query.getServiceName())
+                    .setService(query.getService())
                     .build());
         }
         return joinedEventList;
@@ -321,7 +324,7 @@
                         .setQueryId(queryId)
                         .setQueryData(queryData)
                         .setTimeMillis(timeMillis)
-                        .setServiceName(serviceName)
+                        .setService(DbUtils.fromTableValue(serviceName))
                         .build()
                 );
             }
@@ -389,7 +392,7 @@
                         .setQueryId(queryId)
                         .setQueryData(queryData)
                         .setQueryTimeMillis(queryTimeMillis)
-                        .setServiceName(serviceName)
+                        .setService(DbUtils.fromTableValue(serviceName))
                         .build()
                 );
             }
@@ -405,15 +408,15 @@
      *
      * @return true if the delete executed successfully, false otherwise.
      */
-    public boolean deleteEventState(String packageName) {
+    public boolean deleteEventState(ComponentName service) {
         SQLiteDatabase db = mDbHelper.getWritableDatabase();
         try {
             String selection = EventStateContract.EventStateEntry.SERVICE_NAME + " = ?";
-            String[] selectionArgs = {packageName};
+            String[] selectionArgs = {DbUtils.toTableValue(service)};
             db.delete(EventStateContract.EventStateEntry.TABLE_NAME, selection,
                     selectionArgs);
         } catch (Exception e) {
-            sLogger.e(e, TAG + ": Failed to delete eventState for: " + packageName);
+            sLogger.e(e, TAG + ": Failed to delete eventState for: " + service.toString());
             return false;
         }
         return true;
@@ -459,12 +462,12 @@
      * @return List of Query in the query table.
      */
     public List<Query> readAllQueries(long startTimeMillis, long endTimeMillis,
-            String packageName) {
+            ComponentName service) {
         String selection = QueriesContract.QueriesEntry.TIME_MILLIS + " > ?"
                 + " AND " + QueriesContract.QueriesEntry.TIME_MILLIS + " < ?"
                 + " AND " + QueriesContract.QueriesEntry.SERVICE_NAME + " = ?";
         String[] selectionArgs = {String.valueOf(startTimeMillis), String.valueOf(
-                endTimeMillis), packageName};
+                endTimeMillis), DbUtils.toTableValue(service)};
         return readQueryRows(selection, selectionArgs);
     }
 
@@ -474,7 +477,7 @@
      * @return List of ids in the event table.
      */
     public List<Long> readAllEventIds(long startTimeMillis, long endTimeMillis,
-            String packageName) {
+            ComponentName service) {
         List<Long> idList = new ArrayList<>();
         try {
             SQLiteDatabase db = mDbHelper.getReadableDatabase();
@@ -483,7 +486,7 @@
                     + " AND " + EventsContract.EventsEntry.TIME_MILLIS + " < ?"
                     + " AND " + EventsContract.EventsEntry.SERVICE_NAME + " = ?";
             String[] selectionArgs = {String.valueOf(startTimeMillis), String.valueOf(
-                    endTimeMillis), packageName};
+                    endTimeMillis), DbUtils.toTableValue(service)};
             String orderBy = EventsContract.EventsEntry.EVENT_ID;
             try (Cursor cursor = db.query(
                     EventsContract.EventsEntry.TABLE_NAME,
@@ -514,14 +517,14 @@
      *
      * @return List of ids in the event table.
      */
-    public List<Long> readAllEventIdsForQuery(long queryId, String packageName) {
+    public List<Long> readAllEventIdsForQuery(long queryId, ComponentName service) {
         List<Long> idList = new ArrayList<>();
         try {
             SQLiteDatabase db = mDbHelper.getReadableDatabase();
             String[] projection = {EventsContract.EventsEntry.EVENT_ID};
             String selection = EventsContract.EventsEntry.QUERY_ID + " = ?"
                     + " AND " + EventsContract.EventsEntry.SERVICE_NAME + " = ?";
-            String[] selectionArgs = {String.valueOf(queryId), packageName};
+            String[] selectionArgs = {String.valueOf(queryId), DbUtils.toTableValue(service)};
             String orderBy = EventsContract.EventsEntry.EVENT_ID;
             try (Cursor cursor = db.query(
                     EventsContract.EventsEntry.TABLE_NAME,
@@ -551,12 +554,12 @@
      *
      * @return Query object for the single row requested
      */
-    public Query readSingleQueryRow(long queryId, String packageName) {
+    public Query readSingleQueryRow(long queryId, ComponentName service) {
         try {
             SQLiteDatabase db = mDbHelper.getReadableDatabase();
             String selection = QueriesContract.QueriesEntry.QUERY_ID + " = ?"
                     + " AND " + QueriesContract.QueriesEntry.SERVICE_NAME + " = ?";
-            String[] selectionArgs = {String.valueOf(queryId), packageName};
+            String[] selectionArgs = {String.valueOf(queryId), DbUtils.toTableValue(service)};
             try (Cursor cursor = db.query(
                     QueriesContract.QueriesEntry.TABLE_NAME,
                     /* projection= */ null,
@@ -584,7 +587,7 @@
                         .setQueryId(id)
                         .setQueryData(queryData)
                         .setTimeMillis(timeMillis)
-                        .setServiceName(serviceName)
+                        .setService(service)
                         .build();
             }
         } catch (SQLiteException e) {
@@ -598,11 +601,11 @@
      *
      * @return JoinedEvent representing the event joined with its query
      */
-    public JoinedEvent readSingleJoinedTableRow(long eventId, String packageName) {
+    public JoinedEvent readSingleJoinedTableRow(long eventId, ComponentName service) {
         String selection = EventsContract.EventsEntry.EVENT_ID + " = ?"
                 + " AND " + EventsContract.EventsEntry.TABLE_NAME + "."
                 + EventsContract.EventsEntry.SERVICE_NAME + " = ?";
-        String[] selectionArgs = {String.valueOf(eventId), packageName};
+        String[] selectionArgs = {String.valueOf(eventId), DbUtils.toTableValue(service)};
         List<JoinedEvent> joinedEventList = readJoinedTableRows(selection, selectionArgs);
         if (joinedEventList.size() < 1) {
             sLogger.d(TAG + ": Failed to find requested id: " + eventId);
@@ -618,13 +621,13 @@
      * @return List of JoinedEvents representing the event joined with its query
      */
     public List<JoinedEvent> readJoinedTableRows(long startTimeMillis, long endTimeMillis,
-            String packageName) {
+            ComponentName service) {
         String selection = JOINED_EVENT_TIME_MILLIS + " > ?"
                 + " AND " + JOINED_EVENT_TIME_MILLIS + " < ?"
                 + " AND " + EventsContract.EventsEntry.TABLE_NAME + "."
                 + EventsContract.EventsEntry.SERVICE_NAME + " = ?";
         String[] selectionArgs = {String.valueOf(startTimeMillis), String.valueOf(
-                endTimeMillis), packageName};
+                endTimeMillis), DbUtils.toTableValue(service)};
         return readJoinedTableRows(selection, selectionArgs);
     }
 }
diff --git a/src/com/android/ondevicepersonalization/services/data/events/JoinedEvent.java b/src/com/android/ondevicepersonalization/services/data/events/JoinedEvent.java
index e5d74e5..843f865 100644
--- a/src/com/android/ondevicepersonalization/services/data/events/JoinedEvent.java
+++ b/src/com/android/ondevicepersonalization/services/data/events/JoinedEvent.java
@@ -18,9 +18,11 @@
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.content.ComponentName;
 
 import com.android.ondevicepersonalization.internal.util.AnnotationValidations;
 import com.android.ondevicepersonalization.internal.util.DataClass;
+import com.android.ondevicepersonalization.services.data.DbUtils;
 
 /**
  * JoinedRow object representing a single row in the joined Events and queries table
@@ -41,7 +43,7 @@
 
     /** Name of the service that owns this event */
     @NonNull
-    private final String mServiceName;
+    private final ComponentName mService;
 
     /** The service assigned type of the event. */
     private final int mType;
@@ -60,6 +62,11 @@
     @Nullable
     private final byte[] mQueryData;
 
+    @NonNull
+    public String getServiceName() {
+        return DbUtils.toTableValue(mService);
+    }
+
 
 
     // Code below generated by codegen v1.0.23.
@@ -80,7 +87,7 @@
             long eventId,
             long queryId,
             int rowIndex,
-            @NonNull String serviceName,
+            @NonNull ComponentName service,
             int type,
             long eventTimeMillis,
             @Nullable byte[] eventData,
@@ -89,9 +96,9 @@
         this.mEventId = eventId;
         this.mQueryId = queryId;
         this.mRowIndex = rowIndex;
-        this.mServiceName = serviceName;
+        this.mService = service;
         AnnotationValidations.validate(
-                NonNull.class, null, mServiceName);
+                NonNull.class, null, mService);
         this.mType = type;
         this.mEventTimeMillis = eventTimeMillis;
         this.mEventData = eventData;
@@ -129,8 +136,8 @@
      * Name of the service that owns this event
      */
     @DataClass.Generated.Member
-    public @NonNull String getServiceName() {
-        return mServiceName;
+    public @NonNull ComponentName getService() {
+        return mService;
     }
 
     /**
@@ -189,7 +196,7 @@
                 && mEventId == that.mEventId
                 && mQueryId == that.mQueryId
                 && mRowIndex == that.mRowIndex
-                && java.util.Objects.equals(mServiceName, that.mServiceName)
+                && java.util.Objects.equals(mService, that.mService)
                 && mType == that.mType
                 && mEventTimeMillis == that.mEventTimeMillis
                 && java.util.Arrays.equals(mEventData, that.mEventData)
@@ -207,7 +214,7 @@
         _hash = 31 * _hash + Long.hashCode(mEventId);
         _hash = 31 * _hash + Long.hashCode(mQueryId);
         _hash = 31 * _hash + mRowIndex;
-        _hash = 31 * _hash + java.util.Objects.hashCode(mServiceName);
+        _hash = 31 * _hash + java.util.Objects.hashCode(mService);
         _hash = 31 * _hash + mType;
         _hash = 31 * _hash + Long.hashCode(mEventTimeMillis);
         _hash = 31 * _hash + java.util.Arrays.hashCode(mEventData);
@@ -226,7 +233,7 @@
         private long mEventId;
         private long mQueryId;
         private int mRowIndex;
-        private @NonNull String mServiceName;
+        private @NonNull ComponentName mService;
         private int mType;
         private long mEventTimeMillis;
         private @Nullable byte[] mEventData;
@@ -247,7 +254,7 @@
          *   The id of the query.
          * @param rowIndex
          *   Index of the associated entry in the request log for this event.
-         * @param serviceName
+         * @param service
          *   Name of the service that owns this event
          * @param type
          *   The service assigned type of the event.
@@ -264,7 +271,7 @@
                 long eventId,
                 long queryId,
                 int rowIndex,
-                @NonNull String serviceName,
+                @NonNull ComponentName service,
                 int type,
                 long eventTimeMillis,
                 @Nullable byte[] eventData,
@@ -273,9 +280,9 @@
             mEventId = eventId;
             mQueryId = queryId;
             mRowIndex = rowIndex;
-            mServiceName = serviceName;
+            mService = service;
             AnnotationValidations.validate(
-                    NonNull.class, null, mServiceName);
+                    NonNull.class, null, mService);
             mType = type;
             mEventTimeMillis = eventTimeMillis;
             mEventData = eventData;
@@ -320,10 +327,10 @@
          * Name of the service that owns this event
          */
         @DataClass.Generated.Member
-        public @NonNull Builder setServiceName(@NonNull String value) {
+        public @NonNull Builder setService(@NonNull ComponentName value) {
             checkNotUsed();
             mBuilderFieldsSet |= 0x8;
-            mServiceName = value;
+            mService = value;
             return this;
         }
 
@@ -391,7 +398,7 @@
                     mEventId,
                     mQueryId,
                     mRowIndex,
-                    mServiceName,
+                    mService,
                     mType,
                     mEventTimeMillis,
                     mEventData,
@@ -409,10 +416,10 @@
     }
 
     @DataClass.Generated(
-            time = 1706637252089L,
+            time = 1708722682206L,
             codegenVersion = "1.0.23",
             sourceFile = "packages/modules/OnDevicePersonalization/src/com/android/ondevicepersonalization/services/data/events/JoinedEvent.java",
-            inputSignatures = "private final  long mEventId\nprivate final  long mQueryId\nprivate final  int mRowIndex\nprivate final @android.annotation.NonNull java.lang.String mServiceName\nprivate final  int mType\nprivate final  long mEventTimeMillis\nprivate final @android.annotation.Nullable byte[] mEventData\nprivate final  long mQueryTimeMillis\nprivate final @android.annotation.Nullable byte[] mQueryData\nclass JoinedEvent extends java.lang.Object implements []\n@com.android.ondevicepersonalization.internal.util.DataClass(genBuilder=true, genEqualsHashCode=true)")
+            inputSignatures = "private final  long mEventId\nprivate final  long mQueryId\nprivate final  int mRowIndex\nprivate final @android.annotation.NonNull android.content.ComponentName mService\nprivate final  int mType\nprivate final  long mEventTimeMillis\nprivate final @android.annotation.Nullable byte[] mEventData\nprivate final  long mQueryTimeMillis\nprivate final @android.annotation.Nullable byte[] mQueryData\npublic @android.annotation.NonNull java.lang.String getServiceName()\nclass JoinedEvent extends java.lang.Object implements []\n@com.android.ondevicepersonalization.internal.util.DataClass(genBuilder=true, genEqualsHashCode=true)")
     @Deprecated
     private void __metadata() {}
 
diff --git a/src/com/android/ondevicepersonalization/services/data/events/Query.java b/src/com/android/ondevicepersonalization/services/data/events/Query.java
index 5d19286..c58e16c 100644
--- a/src/com/android/ondevicepersonalization/services/data/events/Query.java
+++ b/src/com/android/ondevicepersonalization/services/data/events/Query.java
@@ -18,9 +18,11 @@
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.content.ComponentName;
 
 import com.android.ondevicepersonalization.internal.util.AnnotationValidations;
 import com.android.ondevicepersonalization.internal.util.DataClass;
+import com.android.ondevicepersonalization.services.data.DbUtils;
 
 /**
  * Query object for the Query table
@@ -38,12 +40,17 @@
 
     /** Name of the service that handled the request */
     @NonNull
-    private final String mServiceName;
+    private final ComponentName mService;
 
     /** Blob representing the query. */
     @NonNull
     private final byte[] mQueryData;
 
+    /** The name of the service */
+    public String getServiceName() {
+        return DbUtils.toTableValue(mService);
+    }
+
 
 
     // Code below generated by codegen v1.0.23.
@@ -63,13 +70,13 @@
     /* package-private */ Query(
             long queryId,
             long timeMillis,
-            @NonNull String serviceName,
+            @NonNull ComponentName service,
             @NonNull byte[] queryData) {
         this.mQueryId = queryId;
         this.mTimeMillis = timeMillis;
-        this.mServiceName = serviceName;
+        this.mService = service;
         AnnotationValidations.validate(
-                NonNull.class, null, mServiceName);
+                NonNull.class, null, mService);
         this.mQueryData = queryData;
         AnnotationValidations.validate(
                 NonNull.class, null, mQueryData);
@@ -97,8 +104,8 @@
      * Name of the service that handled the request
      */
     @DataClass.Generated.Member
-    public @NonNull String getServiceName() {
-        return mServiceName;
+    public @NonNull ComponentName getService() {
+        return mService;
     }
 
     /**
@@ -124,7 +131,7 @@
         return true
                 && mQueryId == that.mQueryId
                 && mTimeMillis == that.mTimeMillis
-                && java.util.Objects.equals(mServiceName, that.mServiceName)
+                && java.util.Objects.equals(mService, that.mService)
                 && java.util.Arrays.equals(mQueryData, that.mQueryData);
     }
 
@@ -137,7 +144,7 @@
         int _hash = 1;
         _hash = 31 * _hash + Long.hashCode(mQueryId);
         _hash = 31 * _hash + Long.hashCode(mTimeMillis);
-        _hash = 31 * _hash + java.util.Objects.hashCode(mServiceName);
+        _hash = 31 * _hash + java.util.Objects.hashCode(mService);
         _hash = 31 * _hash + java.util.Arrays.hashCode(mQueryData);
         return _hash;
     }
@@ -151,7 +158,7 @@
 
         private long mQueryId;
         private long mTimeMillis;
-        private @NonNull String mServiceName;
+        private @NonNull ComponentName mService;
         private @NonNull byte[] mQueryData;
 
         private long mBuilderFieldsSet = 0L;
@@ -166,7 +173,7 @@
          *   The id of the query.
          * @param timeMillis
          *   Time of the query in milliseconds.
-         * @param serviceName
+         * @param service
          *   Name of the service that handled the request
          * @param queryData
          *   Blob representing the query.
@@ -174,13 +181,13 @@
         public Builder(
                 long queryId,
                 long timeMillis,
-                @NonNull String serviceName,
+                @NonNull ComponentName service,
                 @NonNull byte[] queryData) {
             mQueryId = queryId;
             mTimeMillis = timeMillis;
-            mServiceName = serviceName;
+            mService = service;
             AnnotationValidations.validate(
-                    NonNull.class, null, mServiceName);
+                    NonNull.class, null, mService);
             mQueryData = queryData;
             AnnotationValidations.validate(
                     NonNull.class, null, mQueryData);
@@ -212,10 +219,10 @@
          * Name of the service that handled the request
          */
         @DataClass.Generated.Member
-        public @NonNull Builder setServiceName(@NonNull String value) {
+        public @NonNull Builder setService(@NonNull ComponentName value) {
             checkNotUsed();
             mBuilderFieldsSet |= 0x4;
-            mServiceName = value;
+            mService = value;
             return this;
         }
 
@@ -238,7 +245,7 @@
             Query o = new Query(
                     mQueryId,
                     mTimeMillis,
-                    mServiceName,
+                    mService,
                     mQueryData);
             return o;
         }
@@ -252,10 +259,10 @@
     }
 
     @DataClass.Generated(
-            time = 1706637243750L,
+            time = 1708721575103L,
             codegenVersion = "1.0.23",
             sourceFile = "packages/modules/OnDevicePersonalization/src/com/android/ondevicepersonalization/services/data/events/Query.java",
-            inputSignatures = "private final  long mQueryId\nprivate final  long mTimeMillis\nprivate final @android.annotation.NonNull java.lang.String mServiceName\nprivate final @android.annotation.NonNull byte[] mQueryData\nclass Query extends java.lang.Object implements []\n@com.android.ondevicepersonalization.internal.util.DataClass(genBuilder=true, genEqualsHashCode=true)")
+            inputSignatures = "private final  long mQueryId\nprivate final  long mTimeMillis\nprivate final @android.annotation.NonNull android.content.ComponentName mService\nprivate final @android.annotation.NonNull byte[] mQueryData\npublic  java.lang.String getServiceName()\nclass Query extends java.lang.Object implements []\n@com.android.ondevicepersonalization.internal.util.DataClass(genBuilder=true, genEqualsHashCode=true)")
     @Deprecated
     private void __metadata() {}
 
diff --git a/src/com/android/ondevicepersonalization/services/data/vendor/OnDevicePersonalizationLocalDataDao.java b/src/com/android/ondevicepersonalization/services/data/vendor/OnDevicePersonalizationLocalDataDao.java
index 1a26e0a..ad80adc 100644
--- a/src/com/android/ondevicepersonalization/services/data/vendor/OnDevicePersonalizationLocalDataDao.java
+++ b/src/com/android/ondevicepersonalization/services/data/vendor/OnDevicePersonalizationLocalDataDao.java
@@ -28,6 +28,7 @@
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.ondevicepersonalization.internal.util.LoggerFactory;
+import com.android.ondevicepersonalization.services.data.DbUtils;
 import com.android.ondevicepersonalization.services.data.OnDevicePersonalizationDbHelper;
 
 import java.io.File;
diff --git a/src/com/android/ondevicepersonalization/services/data/vendor/OnDevicePersonalizationVendorDataDao.java b/src/com/android/ondevicepersonalization/services/data/vendor/OnDevicePersonalizationVendorDataDao.java
index b76a224..918cdf0 100644
--- a/src/com/android/ondevicepersonalization/services/data/vendor/OnDevicePersonalizationVendorDataDao.java
+++ b/src/com/android/ondevicepersonalization/services/data/vendor/OnDevicePersonalizationVendorDataDao.java
@@ -26,6 +26,7 @@
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.ondevicepersonalization.internal.util.LoggerFactory;
+import com.android.ondevicepersonalization.services.data.DbUtils;
 import com.android.ondevicepersonalization.services.data.OnDevicePersonalizationDbHelper;
 
 import java.io.File;
diff --git a/src/com/android/ondevicepersonalization/services/display/WebViewFlow.java b/src/com/android/ondevicepersonalization/services/display/WebViewFlow.java
index 790106c..13e06e1 100644
--- a/src/com/android/ondevicepersonalization/services/display/WebViewFlow.java
+++ b/src/com/android/ondevicepersonalization/services/display/WebViewFlow.java
@@ -242,7 +242,7 @@
             Event event = new Event.Builder()
                     .setType(eventData.getType())
                     .setQueryId(mQueryId)
-                    .setServiceName(mService.getPackageName())
+                    .setService(mService)
                     .setTimeMillis(mInjector.getClock().currentTimeMillis())
                     .setRowIndex(eventData.getRowIndex())
                     .setEventData(data)
diff --git a/src/com/android/ondevicepersonalization/services/federatedcompute/ContextData.java b/src/com/android/ondevicepersonalization/services/federatedcompute/ContextData.java
index 2ef4895..7b97128 100644
--- a/src/com/android/ondevicepersonalization/services/federatedcompute/ContextData.java
+++ b/src/com/android/ondevicepersonalization/services/federatedcompute/ContextData.java
@@ -17,7 +17,6 @@
 package com.android.ondevicepersonalization.services.federatedcompute;
 
 import android.annotation.NonNull;
-import android.annotation.Nullable;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
@@ -34,13 +33,9 @@
     @NonNull
     String mPackageName;
 
-    @Nullable
+    @NonNull
     String mClassName;
 
-    public ContextData(@NonNull String packageName) {
-        mPackageName = packageName;
-    }
-
     public ContextData(@NonNull String packageName, @NonNull String className) {
         this.mPackageName = packageName;
         this.mClassName = className;
@@ -73,7 +68,7 @@
         return mPackageName;
     }
 
-    @Nullable
+    @NonNull
     public String getClassName() {
         return mClassName;
     }
diff --git a/src/com/android/ondevicepersonalization/services/federatedcompute/FederatedComputeServiceImpl.java b/src/com/android/ondevicepersonalization/services/federatedcompute/FederatedComputeServiceImpl.java
index 773fb56..2e77396 100644
--- a/src/com/android/ondevicepersonalization/services/federatedcompute/FederatedComputeServiceImpl.java
+++ b/src/com/android/ondevicepersonalization/services/federatedcompute/FederatedComputeServiceImpl.java
@@ -154,7 +154,7 @@
                         public void onResult(Object result) {
                             mInjector.getEventsDao(mApplicationContext).updateOrInsertEventState(
                                     new EventState.Builder()
-                                            .setServiceName(mCallingService.getPackageName())
+                                            .setService(mCallingService)
                                             .setTaskIdentifier(trainingOptions.getPopulationName())
                                             .setToken(new byte[]{})
                                             .build());
@@ -177,7 +177,7 @@
     public void cancel(String populationName,
             IFederatedComputeCallback callback) {
         EventState eventState = mInjector.getEventsDao(mApplicationContext).getEventState(
-                populationName, mCallingService.getPackageName());
+                populationName, mCallingService);
         if (eventState == null) {
             sLogger.d("No population registered for package: " + mCallingService.getPackageName());
             sendSuccess(callback);
diff --git a/src/com/android/ondevicepersonalization/services/federatedcompute/OdpExampleStoreService.java b/src/com/android/ondevicepersonalization/services/federatedcompute/OdpExampleStoreService.java
index 72ff488..dc4b913 100644
--- a/src/com/android/ondevicepersonalization/services/federatedcompute/OdpExampleStoreService.java
+++ b/src/com/android/ondevicepersonalization/services/federatedcompute/OdpExampleStoreService.java
@@ -111,7 +111,8 @@
             // Cancel job if on longer valid. This is written to the table during scheduling
             // via {@link FederatedComputeServiceImpl} and deleted either during cancel or
             // during maintenance for uninstalled packages.
-            EventState eventStatePopulation = eventDao.getEventState(populationName, packageName);
+            ComponentName owner = ComponentName.createRelative(packageName, ownerClassName);
+            EventState eventStatePopulation = eventDao.getEventState(populationName, owner);
             if (eventStatePopulation == null) {
                 sLogger.w("Job was either cancelled or package was uninstalled");
                 // Cancel job.
@@ -123,7 +124,7 @@
                     return;
                 }
                 FCManager.cancel(
-                        ComponentName.createRelative(packageName, ownerClassName),
+                        owner,
                         populationName,
                         OnDevicePersonalizationExecutors.getBackgroundExecutor(),
                         new OutcomeReceiver<Object, Exception>() {
@@ -146,7 +147,7 @@
             // Get resumptionToken
             EventState eventState =
                     eventDao.getEventState(
-                            getTaskIdentifier(populationName, taskName), packageName);
+                            getTaskIdentifier(populationName, taskName), owner);
             byte[] resumptionToken = null;
             if (eventState != null) {
                 resumptionToken = eventState.getToken();
diff --git a/src/com/android/ondevicepersonalization/services/federatedcompute/OdpResultHandlingService.java b/src/com/android/ondevicepersonalization/services/federatedcompute/OdpResultHandlingService.java
index af4a072..df59d8c 100644
--- a/src/com/android/ondevicepersonalization/services/federatedcompute/OdpResultHandlingService.java
+++ b/src/com/android/ondevicepersonalization/services/federatedcompute/OdpResultHandlingService.java
@@ -18,6 +18,7 @@
 
 import static android.federatedcompute.common.ClientConstants.STATUS_SUCCESS;
 
+import android.content.ComponentName;
 import android.federatedcompute.ResultHandlingService;
 import android.federatedcompute.common.ClientConstants;
 import android.federatedcompute.common.ExampleConsumption;
@@ -49,7 +50,8 @@
                     ContextData.fromByteArray(
                             Objects.requireNonNull(
                                     params.getByteArray(ClientConstants.EXTRA_CONTEXT_DATA)));
-            String packageName = contextData.getPackageName();
+            ComponentName service = ComponentName.createRelative(
+                    contextData.getPackageName(), contextData.getClassName());
             String populationName =
                     Objects.requireNonNull(params.getString(ClientConstants.EXTRA_POPULATION_NAME));
             String taskName =
@@ -71,7 +73,7 @@
                     Futures.submit(
                             () ->
                                     processExampleConsumptions(
-                                            consumptionList, populationName, taskName, packageName),
+                                            consumptionList, populationName, taskName, service),
                             OnDevicePersonalizationExecutors.getBackgroundExecutor());
             Futures.addCallback(
                     result,
@@ -103,7 +105,7 @@
             List<ExampleConsumption> exampleConsumptions,
             String populationName,
             String taskName,
-            String packageName) {
+            ComponentName service) {
         List<EventState> eventStates = new ArrayList<>();
         for (ExampleConsumption consumption : exampleConsumptions) {
             String taskIdentifier =
@@ -112,7 +114,7 @@
             if (resumptionToken != null) {
                 eventStates.add(
                         new EventState.Builder()
-                                .setServiceName(packageName)
+                                .setService(service)
                                 .setTaskIdentifier(taskIdentifier)
                                 .setToken(resumptionToken)
                                 .build());
diff --git a/src/com/android/ondevicepersonalization/services/maintenance/OnDevicePersonalizationMaintenanceJobService.java b/src/com/android/ondevicepersonalization/services/maintenance/OnDevicePersonalizationMaintenanceJobService.java
index ec44927..3b34fa4 100644
--- a/src/com/android/ondevicepersonalization/services/maintenance/OnDevicePersonalizationMaintenanceJobService.java
+++ b/src/com/android/ondevicepersonalization/services/maintenance/OnDevicePersonalizationMaintenanceJobService.java
@@ -36,9 +36,9 @@
 import com.android.ondevicepersonalization.internal.util.LoggerFactory;
 import com.android.ondevicepersonalization.services.FlagsFactory;
 import com.android.ondevicepersonalization.services.OnDevicePersonalizationExecutors;
+import com.android.ondevicepersonalization.services.data.DbUtils;
 import com.android.ondevicepersonalization.services.data.events.EventsDao;
 import com.android.ondevicepersonalization.services.data.user.UserPrivacyStatus;
-import com.android.ondevicepersonalization.services.data.vendor.DbUtils;
 import com.android.ondevicepersonalization.services.data.vendor.FileUtils;
 import com.android.ondevicepersonalization.services.data.vendor.OnDevicePersonalizationLocalDataDao;
 import com.android.ondevicepersonalization.services.data.vendor.OnDevicePersonalizationVendorDataDao;
@@ -151,7 +151,7 @@
             ComponentName service = DbUtils.fromTableValue(serviceNameStr);
             String certDigest = entry.getValue();
             OnDevicePersonalizationVendorDataDao.deleteVendorData(context, service, certDigest);
-            eventsDao.deleteEventState(service.getPackageName());
+            eventsDao.deleteEventState(service);
         }
 
         // Cleanup event and queries table.
diff --git a/src/com/android/ondevicepersonalization/services/request/AppRequestFlow.java b/src/com/android/ondevicepersonalization/services/request/AppRequestFlow.java
index 0e0e3a9..29aff7a 100644
--- a/src/com/android/ondevicepersonalization/services/request/AppRequestFlow.java
+++ b/src/com/android/ondevicepersonalization/services/request/AppRequestFlow.java
@@ -334,7 +334,7 @@
         sLogger.d(TAG + ": logQuery() started.");
         return LogUtils.writeLogRecords(
                 mContext,
-                mService.getPackageName(),
+                mService,
                 result.getRequestLogRecord(),
                 result.getEventLogRecords());
     }
diff --git a/src/com/android/ondevicepersonalization/services/util/LogUtils.java b/src/com/android/ondevicepersonalization/services/util/LogUtils.java
index 8ef1c80..1d473f1 100644
--- a/src/com/android/ondevicepersonalization/services/util/LogUtils.java
+++ b/src/com/android/ondevicepersonalization/services/util/LogUtils.java
@@ -20,10 +20,12 @@
 import android.adservices.ondevicepersonalization.RequestLogRecord;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.content.ComponentName;
 import android.content.ContentValues;
 import android.content.Context;
 
 import com.android.ondevicepersonalization.internal.util.LoggerFactory;
+import com.android.ondevicepersonalization.services.data.DbUtils;
 import com.android.ondevicepersonalization.services.data.events.Event;
 import com.android.ondevicepersonalization.services.data.events.EventsDao;
 import com.android.ondevicepersonalization.services.data.events.Query;
@@ -42,10 +44,11 @@
     /** Writes the provided records to the REQUESTS and EVENTS tables. */
     public static ListenableFuture<Long> writeLogRecords(
             @NonNull Context context,
-            @NonNull String serviceName,
+            @NonNull ComponentName service,
             @Nullable RequestLogRecord requestLogRecord,
             @NonNull List<EventLogRecord> eventLogRecords) {
         sLogger.d(TAG + ": writeLogRecords() started.");
+        String serviceName = DbUtils.toTableValue(service);
         EventsDao eventsDao = EventsDao.getInstance(context);
         // Insert query
         long queryId = -1;
@@ -54,7 +57,7 @@
             byte[] queryData = OnDevicePersonalizationFlatbufferUtils.createQueryData(
                     serviceName, null, rows);
             Query query = new Query.Builder()
-                    .setServiceName(serviceName)
+                    .setService(service)
                     .setQueryData(queryData)
                     .setTimeMillis(System.currentTimeMillis())
                     .build();
@@ -74,8 +77,7 @@
                 continue;
             }
             // Make sure query exists for package in QUERY table
-            Query queryRow = eventsDao.readSingleQueryRow(parent.getRequestId(),
-                    serviceName);
+            Query queryRow = eventsDao.readSingleQueryRow(parent.getRequestId(), service);
             if (queryRow == null || eventLogRecord.getRowIndex()
                     >= OnDevicePersonalizationFlatbufferUtils.getContentValuesLengthFromQueryData(
                     queryRow.getQueryData())) {
@@ -86,7 +88,7 @@
                             eventLogRecord.getData()))
                     .setQueryId(parent.getRequestId())
                     .setRowIndex(eventLogRecord.getRowIndex())
-                    .setServiceName(serviceName)
+                    .setService(service)
                     .setTimeMillis(System.currentTimeMillis())
                     .setType(eventLogRecord.getType())
                     .build();
diff --git a/src/com/android/ondevicepersonalization/services/webtrigger/WebTriggerFlow.java b/src/com/android/ondevicepersonalization/services/webtrigger/WebTriggerFlow.java
index aaac7be..88f24ed 100644
--- a/src/com/android/ondevicepersonalization/services/webtrigger/WebTriggerFlow.java
+++ b/src/com/android/ondevicepersonalization/services/webtrigger/WebTriggerFlow.java
@@ -262,7 +262,7 @@
         var unused = FluentFuture.from(
                         LogUtils.writeLogRecords(
                                 mContext,
-                                wtparams.getIsolatedService().getPackageName(),
+                                wtparams.getIsolatedService(),
                                 result.getRequestLogRecord(),
                                 result.getEventLogRecords()))
                 .transform(v -> null, MoreExecutors.newDirectExecutorService());
diff --git a/tests/servicetests/src/com/android/ondevicepersonalization/services/data/DataAccessServiceImplTest.java b/tests/servicetests/src/com/android/ondevicepersonalization/services/data/DataAccessServiceImplTest.java
index 521fa5d..4fdf18c 100644
--- a/tests/servicetests/src/com/android/ondevicepersonalization/services/data/DataAccessServiceImplTest.java
+++ b/tests/servicetests/src/com/android/ondevicepersonalization/services/data/DataAccessServiceImplTest.java
@@ -79,6 +79,7 @@
     private static final double DELTA = 0.001;
     private static final byte[] RESPONSE_BYTES = {'A', 'B'};
     private static final int EVENT_TYPE_B2D = 1;
+    private static final String SERVICE_CLASS = "TestClass";
     private final Context mApplicationContext = ApplicationProvider.getApplicationContext();
     private long mTimeMillis = 1000;
     private EventUrlPayload mEventUrlPayload;
@@ -559,25 +560,25 @@
 
         Query query1 = new Query.Builder()
                 .setTimeMillis(1L)
-                .setServiceName(mApplicationContext.getPackageName())
+                .setService(mService)
                 .setQueryData(queryDataBytes)
                 .build();
         long queryId1 = mEventsDao.insertQuery(query1);
         Query query2 = new Query.Builder()
                 .setTimeMillis(10L)
-                .setServiceName(mApplicationContext.getPackageName())
+                .setService(mService)
                 .setQueryData(queryDataBytes)
                 .build();
         long queryId2 = mEventsDao.insertQuery(query2);
         Query query3 = new Query.Builder()
                 .setTimeMillis(100L)
-                .setServiceName(mApplicationContext.getPackageName())
+                .setService(mService)
                 .setQueryData(queryDataBytes)
                 .build();
         long queryId3 = mEventsDao.insertQuery(query3);
         Query query4 = new Query.Builder()
                 .setTimeMillis(100L)
-                .setServiceName("packageA")
+                .setService(new ComponentName("packageA", "classA"))
                 .setQueryData(queryDataBytes)
                 .build();
         mEventsDao.insertQuery(query4);
@@ -589,7 +590,7 @@
         Event event1 = new Event.Builder()
                 .setType(EVENT_TYPE_B2D)
                 .setEventData(eventData)
-                .setServiceName(mApplicationContext.getPackageName())
+                .setService(mService)
                 .setQueryId(queryId1)
                 .setTimeMillis(2L)
                 .setRowIndex(0)
@@ -598,7 +599,7 @@
         Event event2 = new Event.Builder()
                 .setType(EVENT_TYPE_B2D)
                 .setEventData(eventData)
-                .setServiceName(mApplicationContext.getPackageName())
+                .setService(mService)
                 .setQueryId(queryId2)
                 .setTimeMillis(11L)
                 .setRowIndex(0)
@@ -607,7 +608,7 @@
         Event event3 = new Event.Builder()
                 .setType(EVENT_TYPE_B2D)
                 .setEventData(eventData)
-                .setServiceName(mApplicationContext.getPackageName())
+                .setService(mService)
                 .setQueryId(queryId3)
                 .setTimeMillis(101L)
                 .setRowIndex(0)
diff --git a/tests/servicetests/src/com/android/ondevicepersonalization/services/data/events/EventStateTest.java b/tests/servicetests/src/com/android/ondevicepersonalization/services/data/events/EventStateTest.java
index 2c97780..6194051 100644
--- a/tests/servicetests/src/com/android/ondevicepersonalization/services/data/events/EventStateTest.java
+++ b/tests/servicetests/src/com/android/ondevicepersonalization/services/data/events/EventStateTest.java
@@ -20,6 +20,8 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThrows;
 
+import android.content.ComponentName;
+
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -28,22 +30,22 @@
 public class EventStateTest {
     @Test
     public void testBuilderAndEquals() {
-        String servicePackageName = "servicePackageName";
+        ComponentName service = new ComponentName("servicePkg", "cls");
         String taskIdentifier = "taskIdentifier";
         byte[] token = new byte[] {1};
 
         EventState eventState1 = new EventState.Builder()
                 .setTaskIdentifier(taskIdentifier)
-                .setServiceName(servicePackageName)
+                .setService(service)
                 .setToken(token)
                 .build();
 
         assertEquals(eventState1.getTaskIdentifier(), taskIdentifier);
-        assertEquals(eventState1.getServiceName(), servicePackageName);
+        assertEquals(eventState1.getService(), service);
         assertArrayEquals(eventState1.getToken(), token);
 
         EventState eventState2 = new EventState.Builder(
-                token, servicePackageName, taskIdentifier)
+                token, service, taskIdentifier)
                 .build();
         assertEquals(eventState1, eventState2);
         assertEquals(eventState1.hashCode(), eventState2.hashCode());
@@ -51,12 +53,12 @@
 
     @Test
     public void testBuildTwiceThrows() {
-        String servicePackageName = "servicePackageName";
+        ComponentName service = new ComponentName("servicePkg", "cls");
         String taskIdentifier = "taskIdentifier";
         byte[] token = new byte[] {1};
         EventState.Builder builder = new EventState.Builder()
                 .setTaskIdentifier(taskIdentifier)
-                .setServiceName(servicePackageName)
+                .setService(service)
                 .setToken(token);
 
         builder.build();
diff --git a/tests/servicetests/src/com/android/ondevicepersonalization/services/data/events/EventTest.java b/tests/servicetests/src/com/android/ondevicepersonalization/services/data/events/EventTest.java
index d42f5e2..2c3bda6 100644
--- a/tests/servicetests/src/com/android/ondevicepersonalization/services/data/events/EventTest.java
+++ b/tests/servicetests/src/com/android/ondevicepersonalization/services/data/events/EventTest.java
@@ -20,6 +20,8 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThrows;
 
+import android.content.ComponentName;
+
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -31,7 +33,7 @@
     @Test
     public void testBuilderAndEquals() {
         byte[] eventData = "data".getBytes();
-        String servicePackageName = "servicePackageName";
+        ComponentName service = new ComponentName("servicePkg", "cls");
         long queryId = 1;
         long timeMillis = 1;
         long eventId = 1;
@@ -39,7 +41,7 @@
         Event event1 = new Event.Builder()
                 .setType(EVENT_TYPE)
                 .setEventData(eventData)
-                .setServiceName(servicePackageName)
+                .setService(service)
                 .setQueryId(queryId)
                 .setTimeMillis(timeMillis)
                 .setRowIndex(rowIndex)
@@ -48,14 +50,14 @@
 
         assertEquals(event1.getType(), EVENT_TYPE);
         assertArrayEquals(event1.getEventData(), eventData);
-        assertEquals(event1.getServiceName(), servicePackageName);
+        assertEquals(event1.getService(), service);
         assertEquals(event1.getQueryId(), queryId);
         assertEquals(event1.getTimeMillis(), timeMillis);
         assertEquals(event1.getRowIndex(), rowIndex);
         assertEquals(event1.getEventId(), eventId);
 
         Event event2 = new Event.Builder(
-                eventId, queryId, rowIndex, servicePackageName, EVENT_TYPE, timeMillis, eventData)
+                eventId, queryId, rowIndex, service, EVENT_TYPE, timeMillis, eventData)
                 .build();
         assertEquals(event1, event2);
         assertEquals(event1.hashCode(), event2.hashCode());
@@ -64,7 +66,7 @@
     @Test
     public void testBuildTwiceThrows() {
         byte[] eventData = "data".getBytes();
-        String servicePackageName = "servicePackageName";
+        ComponentName service = new ComponentName("servicePkg", "cls");
         long queryId = 1;
         long timeMillis = 1;
         long eventId = 1;
@@ -72,7 +74,7 @@
         Event.Builder builder = new Event.Builder()
                 .setType(EVENT_TYPE)
                 .setEventData(eventData)
-                .setServiceName(servicePackageName)
+                .setService(service)
                 .setQueryId(queryId)
                 .setTimeMillis(timeMillis)
                 .setRowIndex(rowIndex)
diff --git a/tests/servicetests/src/com/android/ondevicepersonalization/services/data/events/EventsDaoTest.java b/tests/servicetests/src/com/android/ondevicepersonalization/services/data/events/EventsDaoTest.java
index 0d99fc3..c606375 100644
--- a/tests/servicetests/src/com/android/ondevicepersonalization/services/data/events/EventsDaoTest.java
+++ b/tests/servicetests/src/com/android/ondevicepersonalization/services/data/events/EventsDaoTest.java
@@ -21,6 +21,7 @@
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
+import android.content.ComponentName;
 import android.content.Context;
 
 import androidx.test.core.app.ApplicationProvider;
@@ -42,23 +43,26 @@
     private static final int EVENT_TYPE_B2D = 1;
     private static final int EVENT_TYPE_CLICK = 2;
     private static final String TASK_IDENTIFIER = "taskIdentifier";
+    private static final String SERVICE_CLASS = "TestClass";
     private final Context mContext = ApplicationProvider.getApplicationContext();
+    private final ComponentName mService =
+            new ComponentName(mContext.getPackageName(), SERVICE_CLASS);
     private final Event mTestEvent = new Event.Builder()
             .setType(EVENT_TYPE_B2D)
             .setEventData("event".getBytes(StandardCharsets.UTF_8))
-            .setServiceName(mContext.getPackageName())
+            .setService(mService)
             .setQueryId(1L)
             .setTimeMillis(1L)
             .setRowIndex(0)
             .build();
     private final Query mTestQuery = new Query.Builder()
             .setTimeMillis(1L)
-            .setServiceName(mContext.getPackageName())
+            .setService(mService)
             .setQueryData("query".getBytes(StandardCharsets.UTF_8))
             .build();
     private final EventState mEventState = new EventState.Builder()
             .setTaskIdentifier(TASK_IDENTIFIER)
-            .setServiceName(mContext.getPackageName())
+            .setService(mService)
             .setToken(new byte[]{1})
             .build();
     private EventsDao mDao;
@@ -84,7 +88,7 @@
         Event testEvent = new Event.Builder()
                 .setType(EVENT_TYPE_CLICK)
                 .setEventData("event".getBytes(StandardCharsets.UTF_8))
-                .setServiceName(mContext.getPackageName())
+                .setService(mService)
                 .setQueryId(1L)
                 .setTimeMillis(1L)
                 .setRowIndex(0)
@@ -98,7 +102,7 @@
         Event testEvent = new Event.Builder()
                 .setType(EVENT_TYPE_CLICK)
                 .setEventData("event".getBytes(StandardCharsets.UTF_8))
-                .setServiceName(mContext.getPackageName())
+                .setService(mService)
                 .setQueryId(1L)
                 .setTimeMillis(1L)
                 .setRowIndex(0)
@@ -119,15 +123,15 @@
     @Test
     public void testInsertAndReadEventState() {
         assertTrue(mDao.updateOrInsertEventState(mEventState));
-        assertEquals(mEventState, mDao.getEventState(TASK_IDENTIFIER, mContext.getPackageName()));
+        assertEquals(mEventState, mDao.getEventState(TASK_IDENTIFIER, mService));
         EventState testEventState = new EventState.Builder()
                 .setTaskIdentifier(TASK_IDENTIFIER)
-                .setServiceName(mContext.getPackageName())
+                .setService(mService)
                 .setToken(new byte[]{100})
                 .build();
         assertTrue(mDao.updateOrInsertEventState(testEventState));
         assertEquals(testEventState,
-                mDao.getEventState(TASK_IDENTIFIER, mContext.getPackageName()));
+                mDao.getEventState(TASK_IDENTIFIER, mService));
     }
 
 
@@ -135,7 +139,7 @@
     public void testInsertAndReadEventStatesTransaction() {
         EventState testEventState = new EventState.Builder()
                 .setTaskIdentifier(TASK_IDENTIFIER)
-                .setServiceName(mContext.getPackageName())
+                .setService(mService)
                 .setToken(new byte[]{100})
                 .build();
         List<EventState> eventStates = new ArrayList<>();
@@ -143,24 +147,25 @@
         eventStates.add(testEventState);
         assertTrue(mDao.updateOrInsertEventStatesTransaction(eventStates));
         assertEquals(testEventState,
-                mDao.getEventState(TASK_IDENTIFIER, mContext.getPackageName()));
+                mDao.getEventState(TASK_IDENTIFIER, mService));
     }
     @Test
     public void testDeleteEventState() {
+        ComponentName serviceA = new ComponentName("packageA", "clsA");
         mDao.updateOrInsertEventState(mEventState);
         EventState testEventState = new EventState.Builder()
                 .setTaskIdentifier(TASK_IDENTIFIER)
-                .setServiceName("packageA")
+                .setService(serviceA)
                 .setToken(new byte[]{100})
                 .build();
         mDao.updateOrInsertEventState(testEventState);
-        mDao.deleteEventState(mContext.getPackageName());
+        mDao.deleteEventState(mService);
         assertEquals(testEventState,
-                mDao.getEventState(TASK_IDENTIFIER, "packageA"));
-        assertNull(mDao.getEventState(TASK_IDENTIFIER, mContext.getPackageName()));
+                mDao.getEventState(TASK_IDENTIFIER, serviceA));
+        assertNull(mDao.getEventState(TASK_IDENTIFIER, mService));
 
-        mDao.deleteEventState("packageA");
-        assertNull(mDao.getEventState(TASK_IDENTIFIER, "packageA"));
+        mDao.deleteEventState(serviceA);
+        assertNull(mDao.getEventState(TASK_IDENTIFIER, serviceA));
     }
 
     @Test
@@ -171,7 +176,7 @@
         Event testEvent = new Event.Builder()
                 .setType(EVENT_TYPE_B2D)
                 .setEventData("event".getBytes(StandardCharsets.UTF_8))
-                .setServiceName(mContext.getPackageName())
+                .setService(mService)
                 .setQueryId(queryId2)
                 .setTimeMillis(3L)
                 .setRowIndex(0)
@@ -180,7 +185,7 @@
 
         Query testQuery = new Query.Builder()
                 .setTimeMillis(5L)
-                .setServiceName(mContext.getPackageName())
+                .setService(mService)
                 .setQueryData("query".getBytes(StandardCharsets.UTF_8))
                 .build();
         long queryId3 = mDao.insertQuery(testQuery);
@@ -213,7 +218,7 @@
 
     @Test
     public void testReadAllNewRowsForPackageEmptyTable() {
-        List<JoinedEvent> joinedEventList = mDao.readAllNewRowsForPackage(mContext.getPackageName(),
+        List<JoinedEvent> joinedEventList = mDao.readAllNewRowsForPackage(mService,
                 0, 0);
         assertTrue(joinedEventList.isEmpty());
     }
@@ -223,10 +228,11 @@
         long queryId1 = mDao.insertQuery(mTestQuery);
         long eventId1 = mDao.insertEvent(mTestEvent);
         long queryId2 = mDao.insertQuery(mTestQuery);
+        ComponentName serviceA = new ComponentName("packageA", "clsA");
 
         Query packageAQuery = new Query.Builder()
                 .setTimeMillis(1L)
-                .setServiceName("packageA")
+                .setService(serviceA)
                 .setQueryData("query".getBytes(StandardCharsets.UTF_8))
                 .build();
         long queryId3 = mDao.insertQuery(packageAQuery);
@@ -234,14 +240,14 @@
         Event packageAEvent = new Event.Builder()
                 .setType(EVENT_TYPE_B2D)
                 .setEventData("event".getBytes(StandardCharsets.UTF_8))
-                .setServiceName("packageA")
+                .setService(serviceA)
                 .setQueryId(queryId3)
                 .setTimeMillis(1L)
                 .setRowIndex(0)
                 .build();
         long eventId2 = mDao.insertEvent(packageAEvent);
 
-        List<JoinedEvent> joinedEventList = mDao.readAllNewRowsForPackage(mContext.getPackageName(),
+        List<JoinedEvent> joinedEventList = mDao.readAllNewRowsForPackage(mService,
                 0, 0);
         assertEquals(3, joinedEventList.size());
         assertEquals(createExpectedJoinedEvent(mTestEvent, mTestQuery, eventId1, queryId1),
@@ -251,11 +257,11 @@
         assertEquals(createExpectedJoinedEvent(null, mTestQuery, 0, queryId2),
                 joinedEventList.get(2));
 
-        joinedEventList = mDao.readAllNewRowsForPackage(mContext.getPackageName(), eventId1,
+        joinedEventList = mDao.readAllNewRowsForPackage(mService, eventId1,
                 queryId2);
         assertTrue(joinedEventList.isEmpty());
 
-        joinedEventList = mDao.readAllNewRowsForPackage(mContext.getPackageName(), eventId1,
+        joinedEventList = mDao.readAllNewRowsForPackage(mService, eventId1,
                 queryId1);
         assertEquals(1, joinedEventList.size());
         assertEquals(createExpectedJoinedEvent(null, mTestQuery, 0, queryId2),
@@ -267,10 +273,11 @@
         long queryId1 = mDao.insertQuery(mTestQuery);
         long eventId1 = mDao.insertEvent(mTestEvent);
         long queryId2 = mDao.insertQuery(mTestQuery);
+        ComponentName serviceA = new ComponentName("packageA", "clsA");
 
         Query packageAQuery = new Query.Builder()
                 .setTimeMillis(1L)
-                .setServiceName("packageA")
+                .setService(serviceA)
                 .setQueryData("query".getBytes(StandardCharsets.UTF_8))
                 .build();
         long queryId3 = mDao.insertQuery(packageAQuery);
@@ -278,7 +285,7 @@
         Event packageAEvent = new Event.Builder()
                 .setType(EVENT_TYPE_B2D)
                 .setEventData("event".getBytes(StandardCharsets.UTF_8))
-                .setServiceName("packageA")
+                .setService(serviceA)
                 .setQueryId(queryId3)
                 .setTimeMillis(1L)
                 .setRowIndex(0)
@@ -309,45 +316,46 @@
 
     @Test
     public void testReadAllQueries() {
+        ComponentName otherService = new ComponentName("package", "cls");
         Query query1 = new Query.Builder()
                 .setTimeMillis(1L)
-                .setServiceName(mContext.getPackageName())
+                .setService(mService)
                 .setQueryData("query".getBytes(StandardCharsets.UTF_8))
                 .build();
         long queryId1 = mDao.insertQuery(query1);
         Query query2 = new Query.Builder()
                 .setTimeMillis(10L)
-                .setServiceName(mContext.getPackageName())
+                .setService(mService)
                 .setQueryData("query".getBytes(StandardCharsets.UTF_8))
                 .build();
         long queryId2 = mDao.insertQuery(query2);
         Query query3 = new Query.Builder()
                 .setTimeMillis(100L)
-                .setServiceName(mContext.getPackageName())
+                .setService(mService)
                 .setQueryData("query".getBytes(StandardCharsets.UTF_8))
                 .build();
         long queryId3 = mDao.insertQuery(query3);
         Query query4 = new Query.Builder()
                 .setTimeMillis(100L)
-                .setServiceName("package")
+                .setService(otherService)
                 .setQueryData("query".getBytes(StandardCharsets.UTF_8))
                 .build();
         long queryId4 = mDao.insertQuery(query4);
 
-        List<Query> result = mDao.readAllQueries(0, 1000, mContext.getPackageName());
+        List<Query> result = mDao.readAllQueries(0, 1000, mService);
         assertEquals(3, result.size());
         assertEquals(queryId1, (long) result.get(0).getQueryId());
         assertEquals(queryId2, (long) result.get(1).getQueryId());
         assertEquals(queryId3, (long) result.get(2).getQueryId());
 
-        result = mDao.readAllQueries(0, 1000, "package");
+        result = mDao.readAllQueries(0, 1000, otherService);
         assertEquals(1, result.size());
         assertEquals(queryId4, (long) result.get(0).getQueryId());
 
-        result = mDao.readAllQueries(500, 1000, mContext.getPackageName());
+        result = mDao.readAllQueries(500, 1000, mService);
         assertEquals(0, result.size());
 
-        result = mDao.readAllQueries(5, 1000, mContext.getPackageName());
+        result = mDao.readAllQueries(5, 1000, mService);
         assertEquals(2, result.size());
         assertEquals(queryId2, (long) result.get(0).getQueryId());
         assertEquals(queryId3, (long) result.get(1).getQueryId());
@@ -357,19 +365,19 @@
     public void testReadAllEventIds() {
         Query query1 = new Query.Builder()
                 .setTimeMillis(1L)
-                .setServiceName(mContext.getPackageName())
+                .setService(mService)
                 .setQueryData("query".getBytes(StandardCharsets.UTF_8))
                 .build();
         long queryId1 = mDao.insertQuery(query1);
         Query query2 = new Query.Builder()
                 .setTimeMillis(10L)
-                .setServiceName(mContext.getPackageName())
+                .setService(mService)
                 .setQueryData("query".getBytes(StandardCharsets.UTF_8))
                 .build();
         long queryId2 = mDao.insertQuery(query2);
         Query query3 = new Query.Builder()
                 .setTimeMillis(100L)
-                .setServiceName(mContext.getPackageName())
+                .setService(mService)
                 .setQueryData("query".getBytes(StandardCharsets.UTF_8))
                 .build();
         long queryId3 = mDao.insertQuery(query3);
@@ -377,7 +385,7 @@
         Event event1 = new Event.Builder()
                 .setType(EVENT_TYPE_B2D)
                 .setEventData("event".getBytes(StandardCharsets.UTF_8))
-                .setServiceName(mContext.getPackageName())
+                .setService(mService)
                 .setQueryId(queryId1)
                 .setTimeMillis(2L)
                 .setRowIndex(0)
@@ -386,7 +394,7 @@
         Event event2 = new Event.Builder()
                 .setType(EVENT_TYPE_B2D)
                 .setEventData("event".getBytes(StandardCharsets.UTF_8))
-                .setServiceName(mContext.getPackageName())
+                .setService(mService)
                 .setQueryId(queryId2)
                 .setTimeMillis(11L)
                 .setRowIndex(0)
@@ -395,26 +403,26 @@
         Event event3 = new Event.Builder()
                 .setType(EVENT_TYPE_B2D)
                 .setEventData("event".getBytes(StandardCharsets.UTF_8))
-                .setServiceName(mContext.getPackageName())
+                .setService(mService)
                 .setQueryId(queryId3)
                 .setTimeMillis(101L)
                 .setRowIndex(0)
                 .build();
         long eventId3 = mDao.insertEvent(event3);
 
-        List<Long> result = mDao.readAllEventIds(0, 1000, mContext.getPackageName());
+        List<Long> result = mDao.readAllEventIds(0, 1000, mService);
         assertEquals(3, result.size());
         assertEquals(eventId1, (long) result.get(0));
         assertEquals(eventId2, (long) result.get(1));
         assertEquals(eventId3, (long) result.get(2));
 
-        result = mDao.readAllEventIds(0, 1000, "package");
+        result = mDao.readAllEventIds(0, 1000, new ComponentName("pkg", "cls"));
         assertEquals(0, result.size());
 
-        result = mDao.readAllEventIds(500, 1000, mContext.getPackageName());
+        result = mDao.readAllEventIds(500, 1000, mService);
         assertEquals(0, result.size());
 
-        result = mDao.readAllEventIds(5, 1000, mContext.getPackageName());
+        result = mDao.readAllEventIds(5, 1000, mService);
         assertEquals(2, result.size());
         assertEquals(eventId2, (long) result.get(0));
         assertEquals(eventId3, (long) result.get(1));
@@ -424,13 +432,13 @@
     public void testReadEventIdsForRequest() {
         Query query1 = new Query.Builder()
                 .setTimeMillis(1L)
-                .setServiceName(mContext.getPackageName())
+                .setService(mService)
                 .setQueryData("query".getBytes(StandardCharsets.UTF_8))
                 .build();
         long queryId1 = mDao.insertQuery(query1);
         Query query2 = new Query.Builder()
                 .setTimeMillis(10L)
-                .setServiceName(mContext.getPackageName())
+                .setService(mService)
                 .setQueryData("query".getBytes(StandardCharsets.UTF_8))
                 .build();
         long queryId2 = mDao.insertQuery(query2);
@@ -438,7 +446,7 @@
         Event event1 = new Event.Builder()
                 .setType(EVENT_TYPE_B2D)
                 .setEventData("event".getBytes(StandardCharsets.UTF_8))
-                .setServiceName(mContext.getPackageName())
+                .setService(mService)
                 .setQueryId(queryId1)
                 .setTimeMillis(2L)
                 .setRowIndex(0)
@@ -447,7 +455,7 @@
         Event event2 = new Event.Builder()
                 .setType(EVENT_TYPE_B2D)
                 .setEventData("event".getBytes(StandardCharsets.UTF_8))
-                .setServiceName(mContext.getPackageName())
+                .setService(mService)
                 .setQueryId(queryId2)
                 .setTimeMillis(11L)
                 .setRowIndex(0)
@@ -456,26 +464,26 @@
         Event event3 = new Event.Builder()
                 .setType(EVENT_TYPE_CLICK)
                 .setEventData("event".getBytes(StandardCharsets.UTF_8))
-                .setServiceName(mContext.getPackageName())
+                .setService(mService)
                 .setQueryId(queryId2)
                 .setTimeMillis(101L)
                 .setRowIndex(0)
                 .build();
         long eventId3 = mDao.insertEvent(event3);
 
-        List<Long> result = mDao.readAllEventIdsForQuery(queryId1, mContext.getPackageName());
+        List<Long> result = mDao.readAllEventIdsForQuery(queryId1, mService);
         assertEquals(1, result.size());
         assertEquals(eventId1, (long) result.get(0));
 
-        result = mDao.readAllEventIdsForQuery(queryId2, mContext.getPackageName());
+        result = mDao.readAllEventIdsForQuery(queryId2, mService);
         assertEquals(2, result.size());
         assertEquals(eventId2, (long) result.get(0));
         assertEquals(eventId3, (long) result.get(1));
 
-        result = mDao.readAllEventIdsForQuery(1000, mContext.getPackageName());
+        result = mDao.readAllEventIdsForQuery(1000, mService);
         assertEquals(0, result.size());
 
-        result = mDao.readAllEventIdsForQuery(queryId1, "package");
+        result = mDao.readAllEventIdsForQuery(queryId1, new ComponentName("pkg", "cls"));
         assertEquals(0, result.size());
     }
 
@@ -483,19 +491,19 @@
     public void testReadJoinedEvents() {
         Query query1 = new Query.Builder()
                 .setTimeMillis(1L)
-                .setServiceName(mContext.getPackageName())
+                .setService(mService)
                 .setQueryData("query".getBytes(StandardCharsets.UTF_8))
                 .build();
         long queryId1 = mDao.insertQuery(query1);
         Query query2 = new Query.Builder()
                 .setTimeMillis(10L)
-                .setServiceName(mContext.getPackageName())
+                .setService(mService)
                 .setQueryData("query".getBytes(StandardCharsets.UTF_8))
                 .build();
         long queryId2 = mDao.insertQuery(query2);
         Query query3 = new Query.Builder()
                 .setTimeMillis(100L)
-                .setServiceName(mContext.getPackageName())
+                .setService(mService)
                 .setQueryData("query".getBytes(StandardCharsets.UTF_8))
                 .build();
         long queryId3 = mDao.insertQuery(query3);
@@ -503,7 +511,7 @@
         Event event1 = new Event.Builder()
                 .setType(EVENT_TYPE_B2D)
                 .setEventData("event".getBytes(StandardCharsets.UTF_8))
-                .setServiceName(mContext.getPackageName())
+                .setService(mService)
                 .setQueryId(queryId1)
                 .setTimeMillis(2L)
                 .setRowIndex(0)
@@ -512,7 +520,7 @@
         Event event2 = new Event.Builder()
                 .setType(EVENT_TYPE_B2D)
                 .setEventData("event".getBytes(StandardCharsets.UTF_8))
-                .setServiceName(mContext.getPackageName())
+                .setService(mService)
                 .setQueryId(queryId2)
                 .setTimeMillis(11L)
                 .setRowIndex(0)
@@ -521,26 +529,26 @@
         Event event3 = new Event.Builder()
                 .setType(EVENT_TYPE_B2D)
                 .setEventData("event".getBytes(StandardCharsets.UTF_8))
-                .setServiceName(mContext.getPackageName())
+                .setService(mService)
                 .setQueryId(queryId3)
                 .setTimeMillis(101L)
                 .setRowIndex(0)
                 .build();
         long eventId3 = mDao.insertEvent(event3);
 
-        List<JoinedEvent> result = mDao.readJoinedTableRows(0, 1000, mContext.getPackageName());
+        List<JoinedEvent> result = mDao.readJoinedTableRows(0, 1000, mService);
         assertEquals(3, result.size());
         assertEquals(createExpectedJoinedEvent(event1, query1, eventId1, queryId1), result.get(0));
         assertEquals(createExpectedJoinedEvent(event2, query2, eventId2, queryId2), result.get(1));
         assertEquals(createExpectedJoinedEvent(event3, query3, eventId3, queryId3), result.get(2));
 
-        result = mDao.readJoinedTableRows(0, 1000, "package");
+        result = mDao.readJoinedTableRows(0, 1000, new ComponentName("pkg", "cls"));
         assertEquals(0, result.size());
 
-        result = mDao.readJoinedTableRows(500, 1000, mContext.getPackageName());
+        result = mDao.readJoinedTableRows(500, 1000, mService);
         assertEquals(0, result.size());
 
-        result = mDao.readJoinedTableRows(5, 1000, mContext.getPackageName());
+        result = mDao.readJoinedTableRows(5, 1000, mService);
         assertEquals(2, result.size());
         assertEquals(createExpectedJoinedEvent(event2, query2, eventId2, queryId2), result.get(0));
         assertEquals(createExpectedJoinedEvent(event3, query3, eventId3, queryId3), result.get(1));
@@ -551,13 +559,13 @@
         Query query1 = new Query.Builder()
                 .setQueryId(1)
                 .setTimeMillis(1L)
-                .setServiceName(mContext.getPackageName())
+                .setService(mService)
                 .setQueryData("query".getBytes(StandardCharsets.UTF_8))
                 .build();
         mDao.insertQuery(query1);
-        assertEquals(query1, mDao.readSingleQueryRow(1, mContext.getPackageName()));
-        assertNull(mDao.readSingleQueryRow(100, mContext.getPackageName()));
-        assertNull(mDao.readSingleQueryRow(1, "package"));
+        assertEquals(query1, mDao.readSingleQueryRow(1, mService));
+        assertNull(mDao.readSingleQueryRow(100, mService));
+        assertNull(mDao.readSingleQueryRow(1, new ComponentName("pkg", "cls")));
     }
 
     @Test
@@ -565,14 +573,14 @@
         mDao.insertQuery(mTestQuery);
         mDao.insertEvent(mTestEvent);
         assertEquals(createExpectedJoinedEvent(mTestEvent, mTestQuery, 1, 1),
-                mDao.readSingleJoinedTableRow(1, mContext.getPackageName()));
-        assertNull(mDao.readSingleJoinedTableRow(100, mContext.getPackageName()));
-        assertNull(mDao.readSingleJoinedTableRow(1, "package"));
+                mDao.readSingleJoinedTableRow(1, mService));
+        assertNull(mDao.readSingleJoinedTableRow(100, mService));
+        assertNull(mDao.readSingleJoinedTableRow(1, new ComponentName("pkg", "cls")));
     }
 
     @Test
     public void testReadEventStateNoEventState() {
-        assertNull(mDao.getEventState(TASK_IDENTIFIER, mContext.getPackageName()));
+        assertNull(mDao.getEventState(TASK_IDENTIFIER, mService));
     }
 
 
@@ -599,14 +607,14 @@
             long queryId) {
         if (event == null) {
             return new JoinedEvent.Builder()
-                    .setServiceName(query.getServiceName())
+                    .setService(query.getService())
                     .setQueryData(query.getQueryData())
                     .setQueryId(queryId)
                     .setQueryTimeMillis(query.getTimeMillis())
                     .build();
         }
         return new JoinedEvent.Builder()
-                .setServiceName(event.getServiceName())
+                .setService(event.getService())
                 .setQueryId(queryId)
                 .setEventId(eventId)
                 .setRowIndex(event.getRowIndex())
diff --git a/tests/servicetests/src/com/android/ondevicepersonalization/services/data/events/JoinedEventTest.java b/tests/servicetests/src/com/android/ondevicepersonalization/services/data/events/JoinedEventTest.java
index 332287b..967a9eb 100644
--- a/tests/servicetests/src/com/android/ondevicepersonalization/services/data/events/JoinedEventTest.java
+++ b/tests/servicetests/src/com/android/ondevicepersonalization/services/data/events/JoinedEventTest.java
@@ -20,6 +20,8 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThrows;
 
+import android.content.ComponentName;
+
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -28,7 +30,7 @@
 public class JoinedEventTest {
     @Test
     public void testBuilderAndEquals() {
-        String servicePackageName = "servicePackageName";
+        ComponentName service = new ComponentName("servicePkg", "cls");
         long queryId = 1;
         long eventId = 1;
         int rowIndex = 1;
@@ -39,7 +41,7 @@
         byte[] queryData = "queryData".getBytes();
 
         JoinedEvent joinedEvent1 = new JoinedEvent.Builder()
-                .setServiceName(servicePackageName)
+                .setService(service)
                 .setQueryId(queryId)
                 .setEventId(eventId)
                 .setRowIndex(rowIndex)
@@ -58,10 +60,10 @@
         assertEquals(joinedEvent1.getQueryTimeMillis(), queryTimeMillis);
         assertArrayEquals(joinedEvent1.getEventData(), eventData);
         assertArrayEquals(joinedEvent1.getQueryData(), queryData);
-        assertEquals(joinedEvent1.getServiceName(), servicePackageName);
+        assertEquals(joinedEvent1.getService(), service);
 
         JoinedEvent joinedEvent2 = new JoinedEvent.Builder(
-                eventId, queryId, rowIndex, servicePackageName, type, eventTimeMillis, eventData,
+                eventId, queryId, rowIndex, service, type, eventTimeMillis, eventData,
                 queryTimeMillis, queryData)
                 .build();
         assertEquals(joinedEvent1, joinedEvent2);
@@ -70,7 +72,7 @@
 
     @Test
     public void testBuildTwiceThrows() {
-        String servicePackageName = "servicePackageName";
+        ComponentName service = new ComponentName("servicePkg", "cls");
         long queryId = 1;
         long eventId = 1;
         int rowIndex = 1;
@@ -81,7 +83,7 @@
         byte[] queryData = "queryData".getBytes();
 
         JoinedEvent.Builder builder = new JoinedEvent.Builder()
-                .setServiceName(servicePackageName)
+                .setService(service)
                 .setQueryId(queryId)
                 .setEventId(eventId)
                 .setRowIndex(rowIndex)
diff --git a/tests/servicetests/src/com/android/ondevicepersonalization/services/data/events/JoinedTableDaoTest.java b/tests/servicetests/src/com/android/ondevicepersonalization/services/data/events/JoinedTableDaoTest.java
index a3c2903..78b6b4b 100644
--- a/tests/servicetests/src/com/android/ondevicepersonalization/services/data/events/JoinedTableDaoTest.java
+++ b/tests/servicetests/src/com/android/ondevicepersonalization/services/data/events/JoinedTableDaoTest.java
@@ -20,12 +20,14 @@
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertThrows;
 
+import android.content.ComponentName;
 import android.content.ContentValues;
 import android.content.Context;
 import android.database.Cursor;
 
 import androidx.test.core.app.ApplicationProvider;
 
+import com.android.ondevicepersonalization.services.data.DbUtils;
 import com.android.ondevicepersonalization.services.data.OnDevicePersonalizationDbHelper;
 import com.android.ondevicepersonalization.services.util.OnDevicePersonalizationFlatbufferUtils;
 
@@ -41,14 +43,17 @@
 @RunWith(JUnit4.class)
 public class JoinedTableDaoTest {
 
+    private static final String SERVICE_CLASS = "TestClass";
     private static final int EVENT_TYPE_B2D = 1;
     private static final int EVENT_TYPE_CLICK = 2;
     private final Context mContext = ApplicationProvider.getApplicationContext();
     private EventsDao mDao;
+    private ComponentName mService;
 
     @Before
     public void setup() {
         mDao = EventsDao.getInstanceForTest(mContext);
+        mService = new ComponentName(mContext.getPackageName(), SERVICE_CLASS);
     }
 
     @After
@@ -110,7 +115,7 @@
             assertEquals(4, cursor.getCount());
             for (int i = 0; i < 4; i++) {
                 cursor.moveToNext();
-                String servicePackageName = cursor.getString(
+                String serviceName = cursor.getString(
                         cursor.getColumnIndexOrThrow(JoinedTableDao.SERVICE_NAME_COL));
                 int type = cursor.getInt(cursor.getColumnIndexOrThrow(JoinedTableDao.TYPE_COL));
                 long eventTimeMillis = cursor.getLong(
@@ -127,8 +132,9 @@
                         () -> cursor.getColumnIndexOrThrow("random"));
                 assertThrows(IllegalArgumentException.class,
                         () -> cursor.getColumnIndexOrThrow("someCol"));
+                String expectedServiceName = DbUtils.toTableValue(mService);
                 if (i == 0) {
-                    assertEquals(mContext.getPackageName(), servicePackageName);
+                    assertEquals(expectedServiceName, serviceName);
                     assertEquals(EVENT_TYPE_B2D, type);
                     assertEquals(1L, eventTimeMillis);
                     assertEquals(1L, queryTimeMillis);
@@ -137,7 +143,7 @@
                     assertEquals(0.0, eventCol4, 0.001);
                     assertEquals(1, queryCol1);
                 } else if (i == 1) {
-                    assertEquals(mContext.getPackageName(), servicePackageName);
+                    assertEquals(expectedServiceName, serviceName);
                     assertEquals(EVENT_TYPE_CLICK, type);
                     assertEquals(2L, eventTimeMillis);
                     assertEquals(1L, queryTimeMillis);
@@ -146,7 +152,7 @@
                     assertEquals(2.0, eventCol4, 0.001);
                     assertEquals(2, queryCol1);
                 } else if (i == 2) {
-                    assertEquals(mContext.getPackageName(), servicePackageName);
+                    assertEquals(expectedServiceName, serviceName);
                     assertEquals(0L, type);
                     assertEquals(0L, eventTimeMillis);
                     assertEquals(1L, queryTimeMillis);
@@ -155,7 +161,7 @@
                     assertEquals(0.0, eventCol4, 0.001);
                     assertEquals(1, queryCol1);
                 } else if (i == 3) {
-                    assertEquals(mContext.getPackageName(), servicePackageName);
+                    assertEquals(expectedServiceName, serviceName);
                     assertEquals(0L, type);
                     assertEquals(0L, eventTimeMillis);
                     assertEquals(1L, queryTimeMillis);
@@ -178,9 +184,9 @@
         rows.add(row);
         Query query = new Query.Builder()
                 .setTimeMillis(1L)
-                .setServiceName(mContext.getPackageName())
+                .setService(mService)
                 .setQueryData(OnDevicePersonalizationFlatbufferUtils.createQueryData(
-                        mContext.getPackageName(), "AABBCCDD", rows))
+                        DbUtils.toTableValue(mService), "AABBCCDD", rows))
                 .build();
         long queryId = mDao.insertQuery(query);
 
@@ -193,7 +199,7 @@
         Event event1 = new Event.Builder()
                 .setType(EVENT_TYPE_B2D)
                 .setEventData(OnDevicePersonalizationFlatbufferUtils.createEventData(eventData))
-                .setServiceName(mContext.getPackageName())
+                .setService(mService)
                 .setQueryId(queryId)
                 .setTimeMillis(1L)
                 .setRowIndex(0)
@@ -209,7 +215,7 @@
         Event event2 = new Event.Builder()
                 .setType(EVENT_TYPE_CLICK)
                 .setEventData(OnDevicePersonalizationFlatbufferUtils.createEventData(eventData2))
-                .setServiceName(mContext.getPackageName())
+                .setService(mService)
                 .setQueryId(queryId)
                 .setTimeMillis(2L)
                 .setRowIndex(1)
diff --git a/tests/servicetests/src/com/android/ondevicepersonalization/services/data/events/QueryTest.java b/tests/servicetests/src/com/android/ondevicepersonalization/services/data/events/QueryTest.java
index fc649d3..e0142ea 100644
--- a/tests/servicetests/src/com/android/ondevicepersonalization/services/data/events/QueryTest.java
+++ b/tests/servicetests/src/com/android/ondevicepersonalization/services/data/events/QueryTest.java
@@ -20,6 +20,8 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThrows;
 
+import android.content.ComponentName;
+
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -30,21 +32,21 @@
     public void testBuilderAndEquals() {
         long queryId = 1;
         byte[] queryData = "data".getBytes();
-        String servicePackageName = "servicePackageName";
+        ComponentName service = new ComponentName("servicePkg", "cls");
         long timeMillis = 1;
         Query query1 = new Query.Builder()
                 .setQueryId(queryId)
                 .setQueryData(queryData)
-                .setServiceName(servicePackageName)
+                .setService(service)
                 .setTimeMillis(timeMillis)
                 .build();
         assertEquals(query1.getQueryId(), queryId);
         assertArrayEquals(query1.getQueryData(), queryData);
-        assertEquals(query1.getServiceName(), servicePackageName);
+        assertEquals(query1.getService(), service);
         assertEquals(query1.getTimeMillis(), timeMillis);
 
         Query query2 = new Query.Builder(
-                queryId, timeMillis, servicePackageName, queryData).build();
+                queryId, timeMillis, service, queryData).build();
         assertEquals(query1, query2);
         assertEquals(query1.hashCode(), query2.hashCode());
     }
@@ -53,12 +55,12 @@
     public void testBuildTwiceThrows() {
         long queryId = 1;
         byte[] queryData = "data".getBytes();
-        String servicePackageName = "servicePackageName";
+        ComponentName service = new ComponentName("servicePkg", "cls");
         long timeMillis = 1;
         Query.Builder builder = new Query.Builder()
                 .setQueryId(queryId)
                 .setQueryData(queryData)
-                .setServiceName(servicePackageName)
+                .setService(service)
                 .setTimeMillis(timeMillis);
         builder.build();
         assertThrows(IllegalStateException.class, () -> builder.build());
diff --git a/tests/servicetests/src/com/android/ondevicepersonalization/services/data/vendor/OnDevicePersonalizationVendorDataDaoTest.java b/tests/servicetests/src/com/android/ondevicepersonalization/services/data/vendor/OnDevicePersonalizationVendorDataDaoTest.java
index d626bd6..c4218ec 100644
--- a/tests/servicetests/src/com/android/ondevicepersonalization/services/data/vendor/OnDevicePersonalizationVendorDataDaoTest.java
+++ b/tests/servicetests/src/com/android/ondevicepersonalization/services/data/vendor/OnDevicePersonalizationVendorDataDaoTest.java
@@ -29,6 +29,7 @@
 
 import androidx.test.core.app.ApplicationProvider;
 
+import com.android.ondevicepersonalization.services.data.DbUtils;
 import com.android.ondevicepersonalization.services.data.OnDevicePersonalizationDbHelper;
 
 import org.junit.After;
diff --git a/tests/servicetests/src/com/android/ondevicepersonalization/services/display/OdpWebViewClientTests.java b/tests/servicetests/src/com/android/ondevicepersonalization/services/display/OdpWebViewClientTests.java
index 4a23c63..431575a 100644
--- a/tests/servicetests/src/com/android/ondevicepersonalization/services/display/OdpWebViewClientTests.java
+++ b/tests/servicetests/src/com/android/ondevicepersonalization/services/display/OdpWebViewClientTests.java
@@ -82,7 +82,7 @@
     private EventUrlPayload mTestEventPayload;
     private final Query mTestQuery = new Query.Builder()
             .setTimeMillis(1L)
-            .setServiceName("servicePackageName")
+            .setService(ComponentName.createRelative(mContext.getPackageName(), SERVICE_CLASS))
             .setQueryData("query".getBytes(StandardCharsets.UTF_8))
             .build();
     private EventsDao mDao;
diff --git a/tests/servicetests/src/com/android/ondevicepersonalization/services/federatedcompute/FederatedComputeServiceImplTest.java b/tests/servicetests/src/com/android/ondevicepersonalization/services/federatedcompute/FederatedComputeServiceImplTest.java
index f0d5ac7..16a1c56 100644
--- a/tests/servicetests/src/com/android/ondevicepersonalization/services/federatedcompute/FederatedComputeServiceImplTest.java
+++ b/tests/servicetests/src/com/android/ondevicepersonalization/services/federatedcompute/FederatedComputeServiceImplTest.java
@@ -63,6 +63,7 @@
 @RunWith(JUnit4.class)
 public class FederatedComputeServiceImplTest {
     private static final String FC_SERVER_URL = "https://google.com";
+    private static final String SERVICE_CLASS = "com.test.TestPersonalizationService";
     private final Context mApplicationContext = ApplicationProvider.getApplicationContext();
     ArgumentCaptor<OutcomeReceiver<Object, Exception>> mCallbackCapture;
     ArgumentCaptor<ScheduleFederatedComputeRequest> mRequestCapture;
@@ -74,12 +75,15 @@
     private FederatedComputeServiceImpl mServiceImpl;
     private IFederatedComputeService mServiceProxy;
     private FederatedComputeManager mMockManager;
+    private ComponentName mIsolatedService;
+
     @Rule
     public final TestableDeviceConfig.TestableDeviceConfigRule mDeviceConfigRule =
             new TestableDeviceConfig.TestableDeviceConfigRule();
 
     @Before
     public void setup() throws Exception {
+        mIsolatedService = new ComponentName(mApplicationContext.getPackageName(), SERVICE_CLASS);
         mInjector = new TestInjector();
         mMockManager = Mockito.mock(FederatedComputeManager.class);
         mCallbackCapture = ArgumentCaptor.forClass(OutcomeReceiver.class);
@@ -205,7 +209,7 @@
         EventsDao.getInstanceForTest(mApplicationContext)
                 .updateOrInsertEventState(
                         new EventState.Builder()
-                                .setServiceName(mApplicationContext.getPackageName())
+                                .setService(mIsolatedService)
                                 .setTaskIdentifier("population")
                                 .setToken(new byte[] {})
                                 .build());
@@ -228,7 +232,7 @@
         EventsDao.getInstanceForTest(mApplicationContext)
                 .updateOrInsertEventState(
                         new EventState.Builder()
-                                .setServiceName(mApplicationContext.getPackageName())
+                                .setService(mIsolatedService)
                                 .setTaskIdentifier("population")
                                 .setToken(new byte[] {})
                                 .build());
diff --git a/tests/servicetests/src/com/android/ondevicepersonalization/services/federatedcompute/OdpExampleStoreServiceTests.java b/tests/servicetests/src/com/android/ondevicepersonalization/services/federatedcompute/OdpExampleStoreServiceTests.java
index 552138b..27bc0ee 100644
--- a/tests/servicetests/src/com/android/ondevicepersonalization/services/federatedcompute/OdpExampleStoreServiceTests.java
+++ b/tests/servicetests/src/com/android/ondevicepersonalization/services/federatedcompute/OdpExampleStoreServiceTests.java
@@ -29,6 +29,7 @@
 import static org.mockito.Mockito.when;
 import static org.mockito.MockitoAnnotations.initMocks;
 
+import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
@@ -64,10 +65,13 @@
 
 @RunWith(Parameterized.class)
 public class OdpExampleStoreServiceTests {
+    private static final String SERVICE_CLASS = "com.test.TestPersonalizationService";
     private final Context mContext = ApplicationProvider.getApplicationContext();
     @Mock Context mMockContext;
     @InjectMocks OdpExampleStoreService mService;
     private CountDownLatch mLatch;
+    private ComponentName mIsolatedService;
+
     private boolean mIteratorCallbackOnSuccessCalled = false;
     private boolean mIteratorCallbackOnFailureCalled = false;
 
@@ -95,7 +99,7 @@
         mQueryCallbackOnSuccessCalled = false;
         mQueryCallbackOnFailureCalled = false;
         mLatch = new CountDownLatch(1);
-
+        mIsolatedService = new ComponentName(mContext.getPackageName(), SERVICE_CLASS);
         PhFlagsTestUtil.setUpDeviceConfigPermissions();
         ShellUtils.runShellCommand("settings put global hidden_api_policy 1");
         ShellUtils.runShellCommand(
@@ -109,7 +113,7 @@
         mEventsDao.updateOrInsertEventState(
                 new EventState.Builder()
                         .setTaskIdentifier("PopulationName")
-                        .setServiceName(mContext.getPackageName())
+                        .setService(mIsolatedService)
                         .setToken()
                         .build());
         mService.onCreate();
@@ -120,7 +124,8 @@
         assertNotNull(binder);
         TestQueryCallback callback = new TestQueryCallback();
         Bundle input = new Bundle();
-        ContextData contextData = new ContextData(mContext.getPackageName());
+        ContextData contextData = new ContextData(
+                mIsolatedService.getPackageName(), mIsolatedService.getClassName());
         input.putByteArray(
                 ClientConstants.EXTRA_CONTEXT_DATA, ContextData.toByteArray(contextData));
         input.putString(ClientConstants.EXTRA_POPULATION_NAME, "PopulationName");
@@ -166,7 +171,8 @@
         assertNotNull(binder);
         TestQueryCallback callback = new TestQueryCallback();
         Bundle input = new Bundle();
-        ContextData contextData = new ContextData(mContext.getPackageName());
+        ContextData contextData = new ContextData(
+                mIsolatedService.getPackageName(), mIsolatedService.getClassName());
         input.putByteArray(
                 ClientConstants.EXTRA_CONTEXT_DATA, ContextData.toByteArray(contextData));
         input.putString(ClientConstants.EXTRA_POPULATION_NAME, "PopulationName");
diff --git a/tests/servicetests/src/com/android/ondevicepersonalization/services/federatedcompute/OdpResultHandlingServiceTests.java b/tests/servicetests/src/com/android/ondevicepersonalization/services/federatedcompute/OdpResultHandlingServiceTests.java
index 2db657e..57f55da 100644
--- a/tests/servicetests/src/com/android/ondevicepersonalization/services/federatedcompute/OdpResultHandlingServiceTests.java
+++ b/tests/servicetests/src/com/android/ondevicepersonalization/services/federatedcompute/OdpResultHandlingServiceTests.java
@@ -25,6 +25,7 @@
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
+import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
 import android.federatedcompute.aidl.IFederatedComputeCallback;
@@ -58,7 +59,7 @@
     @Rule public final ServiceTestRule serviceRule = new ServiceTestRule();
     private final Context mContext = ApplicationProvider.getApplicationContext();
     private final CountDownLatch mLatch = new CountDownLatch(1);
-
+    private static final String SERVICE_CLASS = "com.test.TestPersonalizationService";
     private boolean mCallbackOnSuccessCalled = false;
     private boolean mCallbackOnFailureCalled = false;
 
@@ -86,7 +87,8 @@
         assertNotNull(binder);
 
         Bundle input = new Bundle();
-        ContextData contextData = new ContextData(mContext.getPackageName());
+        ContextData contextData = new ContextData(
+                mContext.getPackageName(), SERVICE_CLASS);
         input.putByteArray(
                 ClientConstants.EXTRA_CONTEXT_DATA, ContextData.toByteArray(contextData));
         input.putString(ClientConstants.EXTRA_POPULATION_NAME, "population");
@@ -111,7 +113,7 @@
         EventState state1 =
                 mEventsDao.getEventState(
                         OdpExampleStoreService.getTaskIdentifier("population", "task_name"),
-                        mContext.getPackageName());
+                        new ComponentName(mContext.getPackageName(), SERVICE_CLASS));
         assertArrayEquals(new byte[] {10, 0, 1}, state1.getToken());
     }
 
@@ -123,7 +125,7 @@
         assertNotNull(binder);
 
         Bundle input = new Bundle();
-        ContextData contextData = new ContextData(mContext.getPackageName());
+        ContextData contextData = new ContextData(mContext.getPackageName(), SERVICE_CLASS);
         input.putByteArray(
                 ClientConstants.EXTRA_CONTEXT_DATA, ContextData.toByteArray(contextData));
         input.putString(ClientConstants.EXTRA_POPULATION_NAME, "population");
diff --git a/tests/servicetests/src/com/android/ondevicepersonalization/services/maintenance/OnDevicePersonalizationMaintenanceJobServiceTest.java b/tests/servicetests/src/com/android/ondevicepersonalization/services/maintenance/OnDevicePersonalizationMaintenanceJobServiceTest.java
index 5251c10..221cd7e 100644
--- a/tests/servicetests/src/com/android/ondevicepersonalization/services/maintenance/OnDevicePersonalizationMaintenanceJobServiceTest.java
+++ b/tests/servicetests/src/com/android/ondevicepersonalization/services/maintenance/OnDevicePersonalizationMaintenanceJobServiceTest.java
@@ -45,13 +45,13 @@
 import com.android.ondevicepersonalization.services.OnDevicePersonalizationConfig;
 import com.android.ondevicepersonalization.services.OnDevicePersonalizationExecutors;
 import com.android.ondevicepersonalization.services.PhFlagsTestUtil;
+import com.android.ondevicepersonalization.services.data.DbUtils;
 import com.android.ondevicepersonalization.services.data.OnDevicePersonalizationDbHelper;
 import com.android.ondevicepersonalization.services.data.events.Event;
 import com.android.ondevicepersonalization.services.data.events.EventState;
 import com.android.ondevicepersonalization.services.data.events.EventsDao;
 import com.android.ondevicepersonalization.services.data.events.Query;
 import com.android.ondevicepersonalization.services.data.user.UserPrivacyStatus;
-import com.android.ondevicepersonalization.services.data.vendor.DbUtils;
 import com.android.ondevicepersonalization.services.data.vendor.FileUtils;
 import com.android.ondevicepersonalization.services.data.vendor.LocalData;
 import com.android.ondevicepersonalization.services.data.vendor.OnDevicePersonalizationLocalDataDao;
@@ -115,10 +115,10 @@
                 timestamp));
     }
 
-    private void addEventData(String packageName, long timestamp) {
+    private void addEventData(ComponentName service, long timestamp) {
         Query query = new Query.Builder()
                 .setTimeMillis(timestamp)
-                .setServiceName(packageName)
+                .setService(service)
                 .setQueryData("query".getBytes(StandardCharsets.UTF_8))
                 .build();
         long queryId = mEventsDao.insertQuery(query);
@@ -126,7 +126,7 @@
         Event event = new Event.Builder()
                 .setType(1)
                 .setEventData("event".getBytes(StandardCharsets.UTF_8))
-                .setServiceName(packageName)
+                .setService(service)
                 .setQueryId(queryId)
                 .setTimeMillis(timestamp)
                 .setRowIndex(0)
@@ -135,7 +135,7 @@
 
         EventState eventState = new EventState.Builder()
                 .setTaskIdentifier(TASK_IDENTIFIER)
-                .setServiceName(packageName)
+                .setService(service)
                 .setToken(new byte[]{1})
                 .build();
         mEventsDao.updateOrInsertEventState(eventState);
@@ -216,9 +216,9 @@
         long timestamp = System.currentTimeMillis();
         addTestData(timestamp, mTestDao);
         addTestData(timestamp, mDao);
-        addEventData(mContext.getPackageName(), timestamp);
-        addEventData(mContext.getPackageName(), 100L);
-        addEventData(TEST_OWNER.getPackageName(), timestamp);
+        addEventData(mService, timestamp);
+        addEventData(mService, 100L);
+        addEventData(TEST_OWNER, timestamp);
 
         var originalIsolatedServiceAllowList =
                 FlagsFactory.getFlags().getIsolatedServiceAllowList();
@@ -261,13 +261,13 @@
         assertTrue(new File(dir, "large_" + (timestamp + 20)).exists());
         assertTrue(new File(dir, "large2_" + (timestamp + 20)).exists());
 
-        assertNull(mEventsDao.getEventState(TASK_IDENTIFIER, TEST_OWNER.getPackageName()));
-        assertNotNull(mEventsDao.getEventState(TASK_IDENTIFIER, mContext.getPackageName()));
+        assertNull(mEventsDao.getEventState(TASK_IDENTIFIER, TEST_OWNER));
+        assertNotNull(mEventsDao.getEventState(TASK_IDENTIFIER, mService));
 
         assertEquals(2,
-                mEventsDao.readAllNewRowsForPackage(TEST_OWNER.getPackageName(), 0, 0).size());
+                mEventsDao.readAllNewRowsForPackage(TEST_OWNER, 0, 0).size());
         assertEquals(2,
-                mEventsDao.readAllNewRowsForPackage(mContext.getPackageName(), 0, 0).size());
+                mEventsDao.readAllNewRowsForPackage(mService, 0, 0).size());
     }
 
     @Test
diff --git a/tests/servicetests/src/com/android/ondevicepersonalization/services/serviceflow/AppRequestFlowTest.java b/tests/servicetests/src/com/android/ondevicepersonalization/services/serviceflow/AppRequestFlowTest.java
index 2834abd..8291826 100644
--- a/tests/servicetests/src/com/android/ondevicepersonalization/services/serviceflow/AppRequestFlowTest.java
+++ b/tests/servicetests/src/com/android/ondevicepersonalization/services/serviceflow/AppRequestFlowTest.java
@@ -41,6 +41,7 @@
 import com.android.ondevicepersonalization.internal.util.ByteArrayParceledSlice;
 import com.android.ondevicepersonalization.internal.util.PersistableBundleUtils;
 import com.android.ondevicepersonalization.services.PhFlagsTestUtil;
+import com.android.ondevicepersonalization.services.data.DbUtils;
 import com.android.ondevicepersonalization.services.data.OnDevicePersonalizationDbHelper;
 import com.android.ondevicepersonalization.services.data.events.EventsContract;
 import com.android.ondevicepersonalization.services.data.events.EventsDao;
@@ -170,10 +171,12 @@
         ContentValues row2 = new ContentValues();
         row2.put("b", 2);
         rows.add(row2);
+        ComponentName service = new ComponentName(
+                mContext.getPackageName(), "com.test.TestPersonalizationService");
         byte[] queryDataBytes = OnDevicePersonalizationFlatbufferUtils.createQueryData(
-                "com.example.test", "AABBCCDD", rows);
+                DbUtils.toTableValue(service), "AABBCCDD", rows);
         EventsDao.getInstanceForTest(mContext).insertQuery(
-                new Query.Builder().setServiceName(mContext.getPackageName()).setQueryData(
+                new Query.Builder().setService(service).setQueryData(
                         queryDataBytes).build());
         EventsDao.getInstanceForTest(mContext);
 
diff --git a/tests/servicetests/src/com/android/ondevicepersonalization/services/serviceflow/RenderFlowTest.java b/tests/servicetests/src/com/android/ondevicepersonalization/services/serviceflow/RenderFlowTest.java
index 034efec..2f3a667 100644
--- a/tests/servicetests/src/com/android/ondevicepersonalization/services/serviceflow/RenderFlowTest.java
+++ b/tests/servicetests/src/com/android/ondevicepersonalization/services/serviceflow/RenderFlowTest.java
@@ -24,6 +24,7 @@
 import android.adservices.ondevicepersonalization.RenderingConfig;
 import android.adservices.ondevicepersonalization.RequestLogRecord;
 import android.adservices.ondevicepersonalization.aidl.IRequestSurfacePackageCallback;
+import android.content.ComponentName;
 import android.content.ContentValues;
 import android.content.Context;
 import android.os.Binder;
@@ -35,6 +36,7 @@
 import com.android.compatibility.common.util.ShellUtils;
 import com.android.dx.mockito.inline.extended.ExtendedMockito;
 import com.android.ondevicepersonalization.services.PhFlagsTestUtil;
+import com.android.ondevicepersonalization.services.data.DbUtils;
 import com.android.ondevicepersonalization.services.data.OnDevicePersonalizationDbHelper;
 import com.android.ondevicepersonalization.services.data.events.EventsDao;
 import com.android.ondevicepersonalization.services.data.events.Query;
@@ -175,10 +177,12 @@
         ContentValues row2 = new ContentValues();
         row2.put("b", 2);
         rows.add(row2);
+        ComponentName service = new ComponentName(
+                mContext.getPackageName(), "com.test.TestPersonalizationService");
         byte[] queryDataBytes = OnDevicePersonalizationFlatbufferUtils.createQueryData(
-                "com.example.test", "AABBCCDD", rows);
+                DbUtils.toTableValue(service), "AABBCCDD", rows);
         EventsDao.getInstanceForTest(mContext).insertQuery(
-                new Query.Builder().setServiceName(mContext.getPackageName()).setQueryData(
+                new Query.Builder().setService(service).setQueryData(
                         queryDataBytes).build());
         EventsDao.getInstanceForTest(mContext);
     }
diff --git a/tests/servicetests/src/com/android/ondevicepersonalization/services/serviceflow/WebTriggerFlowTest.java b/tests/servicetests/src/com/android/ondevicepersonalization/services/serviceflow/WebTriggerFlowTest.java
index 1423022..f98698e 100644
--- a/tests/servicetests/src/com/android/ondevicepersonalization/services/serviceflow/WebTriggerFlowTest.java
+++ b/tests/servicetests/src/com/android/ondevicepersonalization/services/serviceflow/WebTriggerFlowTest.java
@@ -40,6 +40,7 @@
 import com.android.modules.utils.testing.ExtendedMockitoRule;
 import com.android.modules.utils.testing.TestableDeviceConfig;
 import com.android.ondevicepersonalization.services.PhFlagsTestUtil;
+import com.android.ondevicepersonalization.services.data.DbUtils;
 import com.android.ondevicepersonalization.services.data.OnDevicePersonalizationDbHelper;
 import com.android.ondevicepersonalization.services.data.events.EventsDao;
 import com.android.ondevicepersonalization.services.data.events.Query;
@@ -241,10 +242,12 @@
         ContentValues row2 = new ContentValues();
         row2.put("b", 2);
         rows.add(row2);
+        ComponentName service = new ComponentName("com.example.test", "cls");
         byte[] queryDataBytes = OnDevicePersonalizationFlatbufferUtils.createQueryData(
-                "com.example.test", "AABBCCDD", rows);
+                DbUtils.toTableValue(service),
+                "AABBCCDD", rows);
         EventsDao.getInstanceForTest(mContext).insertQuery(
-                new Query.Builder().setServiceName(mContext.getPackageName()).setQueryData(
+                new Query.Builder().setService(service).setQueryData(
                         queryDataBytes).build());
         EventsDao.getInstanceForTest(mContext);
     }
diff --git a/tests/servicetests/src/com/android/ondevicepersonalization/services/serviceflow/WebViewFlowTest.java b/tests/servicetests/src/com/android/ondevicepersonalization/services/serviceflow/WebViewFlowTest.java
index d37e8ea..d56653f 100644
--- a/tests/servicetests/src/com/android/ondevicepersonalization/services/serviceflow/WebViewFlowTest.java
+++ b/tests/servicetests/src/com/android/ondevicepersonalization/services/serviceflow/WebViewFlowTest.java
@@ -77,7 +77,7 @@
         mDao = EventsDao.getInstanceForTest(mContext);
         Query mTestQuery = new Query.Builder()
                 .setTimeMillis(1L)
-                .setServiceName("servicePackageName")
+                .setService(new ComponentName("pkg", "cls"))
                 .setQueryData("query".getBytes(StandardCharsets.UTF_8))
                 .build();
         // Insert query for FK constraint