diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2023-12-07 00:20:49 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2023-12-07 00:20:49 +0000 |
commit | ce96420e8931020b9d3427a67936d73101b73016 (patch) | |
tree | 953ae0ee56e13a1da4d04710dea76ae2095b7813 | |
parent | be33810679ecaf256a3a7b4bc193a814fb52726f (diff) | |
parent | b32adcf26553d158a3fddfaccb22c3a3de4dcb2c (diff) | |
download | OnDevicePersonalization-ce96420e8931020b9d3427a67936d73101b73016.tar.gz |
Snap for 11186783 from b32adcf26553d158a3fddfaccb22c3a3de4dcb2c to 24Q1-release
Change-Id: If3985171a4cfd6b49a57691d5cbbe4bb88a3d0d9
8 files changed, 132 insertions, 11 deletions
diff --git a/federatedcompute/src/com/android/federatedcompute/services/http/HttpFederatedProtocol.java b/federatedcompute/src/com/android/federatedcompute/services/http/HttpFederatedProtocol.java index 1bae7ebd..00fdf1fb 100644 --- a/federatedcompute/src/com/android/federatedcompute/services/http/HttpFederatedProtocol.java +++ b/federatedcompute/src/com/android/federatedcompute/services/http/HttpFederatedProtocol.java @@ -358,7 +358,7 @@ public final class HttpFederatedProtocol { if (!HTTP_OK_STATUS.contains(httpResponse.getStatusCode())) { throw new IllegalStateException(stage + " failed: " + httpResponse.getStatusCode()); } else { - LogUtil.d(TAG, stage + " success."); + LogUtil.i(TAG, stage + " success."); } } diff --git a/framework/java/com/android/federatedcompute/internal/util/AbstractServiceBinder.java b/framework/java/com/android/federatedcompute/internal/util/AbstractServiceBinder.java index 9d01a15e..99084702 100644 --- a/framework/java/com/android/federatedcompute/internal/util/AbstractServiceBinder.java +++ b/framework/java/com/android/federatedcompute/internal/util/AbstractServiceBinder.java @@ -70,6 +70,21 @@ public abstract class AbstractServiceBinder<T> { context, serviceIntentAction, servicePackages, bindFlags, converter); } + /** Get the {@link AbstractServiceBinder} suitable for an isolated service by name. */ + public static <T2> AbstractServiceBinder<T2> getIsolatedServiceBinderByServiceName( + Context context, + String serviceName, + String servicePackage, + String isolatedProcessName, + int bindFlags, + Function<IBinder, T2> converter) { + return new AndroidServiceBinder<>( + context, serviceName, servicePackage, isolatedProcessName, + /* enableLookupByName= */ true, + bindFlags, + converter); + } + /** Get the binder service. */ public abstract T getService(Executor executor); diff --git a/framework/java/com/android/federatedcompute/internal/util/AndroidServiceBinder.java b/framework/java/com/android/federatedcompute/internal/util/AndroidServiceBinder.java index 1340de82..5898abe8 100644 --- a/framework/java/com/android/federatedcompute/internal/util/AndroidServiceBinder.java +++ b/framework/java/com/android/federatedcompute/internal/util/AndroidServiceBinder.java @@ -44,6 +44,7 @@ class AndroidServiceBinder<T> extends AbstractServiceBinder<T> { private final Function<IBinder, T> mBinderConverter; private final Context mContext; private final boolean mEnableLookupByServiceName; + private final String mIsolatedProcessName; private final int mBindFlags; // Concurrency mLock. private final Object mLock = new Object(); @@ -85,6 +86,7 @@ class AndroidServiceBinder<T> extends AbstractServiceBinder<T> { this.mServicePackages = servicePackages; this.mEnableLookupByServiceName = false; this.mBindFlags = bindFlags; + this.mIsolatedProcessName = null; } AndroidServiceBinder( @@ -99,6 +101,24 @@ class AndroidServiceBinder<T> extends AbstractServiceBinder<T> { this.mServicePackages = List.of(servicePackage); this.mEnableLookupByServiceName = enableLookupByName; this.mBindFlags = 0; + this.mIsolatedProcessName = null; + } + + AndroidServiceBinder( + @NonNull Context context, + @NonNull String serviceIntentActionOrName, + @NonNull String servicePackage, + @NonNull String isolatedProcessName, + boolean enableLookupByName, + int bindFlags, + @NonNull Function<IBinder, T> converter) { + this.mServiceIntentActionOrName = serviceIntentActionOrName; + this.mContext = context; + this.mBinderConverter = converter; + this.mServicePackages = List.of(servicePackage); + this.mEnableLookupByServiceName = enableLookupByName; + this.mBindFlags = bindFlags; + this.mIsolatedProcessName = isolatedProcessName; } @Override @@ -115,12 +135,21 @@ class AndroidServiceBinder<T> extends AbstractServiceBinder<T> { // This latch will open when the connection is established or any error occurs. mConnectionCountDownLatch = new CountDownLatch(1); mServiceConnection = new GenericServiceConnection(); + boolean result = - mContext.bindService( + (mIsolatedProcessName != null) + ? + mContext.bindIsolatedService( bindIntent, Context.BIND_AUTO_CREATE | mBindFlags, - executor, - mServiceConnection); + mIsolatedProcessName, + executor, mServiceConnection) + : + mContext.bindService( + bindIntent, + Context.BIND_AUTO_CREATE | mBindFlags, executor, + mServiceConnection); + if (!result) { mServiceConnection = null; throw new IllegalStateException( diff --git a/src/com/android/ondevicepersonalization/services/Flags.java b/src/com/android/ondevicepersonalization/services/Flags.java index 86615ac3..49104270 100644 --- a/src/com/android/ondevicepersonalization/services/Flags.java +++ b/src/com/android/ondevicepersonalization/services/Flags.java @@ -55,6 +55,11 @@ public interface Flags { */ int ISOLATED_SERVICE_DEADLINE_SECONDS = 30; + /** + * Default value for the list of trusted partner app names. + */ + String DEFAULT_TRUSTED_PARTNER_APPS_LIST = ""; + default boolean getGlobalKillSwitch() { return GLOBAL_KILL_SWITCH; } @@ -74,4 +79,8 @@ public interface Flags { default int getIsolatedServiceDeadlineSeconds() { return ISOLATED_SERVICE_DEADLINE_SECONDS; } + + default String getTrustedPartnerAppsList() { + return DEFAULT_TRUSTED_PARTNER_APPS_LIST; + } } diff --git a/src/com/android/ondevicepersonalization/services/PhFlags.java b/src/com/android/ondevicepersonalization/services/PhFlags.java index b253e044..b144116d 100644 --- a/src/com/android/ondevicepersonalization/services/PhFlags.java +++ b/src/com/android/ondevicepersonalization/services/PhFlags.java @@ -40,6 +40,8 @@ public final class PhFlags implements Flags { static final String KEY_ISOLATED_SERVICE_DEADLINE_SECONDS = "isolated_service_deadline_seconds"; + static final String KEY_TRUSTED_PARTNER_APPS_LIST = "trusted_partner_apps_list"; + // OnDevicePersonalization Namespace String from DeviceConfig class static final String NAMESPACE_ON_DEVICE_PERSONALIZATION = "on_device_personalization"; private static final PhFlags sSingleton = new PhFlags(); @@ -55,9 +57,9 @@ public final class PhFlags implements Flags { public boolean getGlobalKillSwitch() { // The priority of applying the flag values: PH (DeviceConfig), then hard-coded value. return DeviceConfig.getBoolean( - /* namespace= */ NAMESPACE_ON_DEVICE_PERSONALIZATION, - /* name= */ KEY_GLOBAL_KILL_SWITCH, - /* defaultValue= */ GLOBAL_KILL_SWITCH); + /* namespace= */ NAMESPACE_ON_DEVICE_PERSONALIZATION, + /* name= */ KEY_GLOBAL_KILL_SWITCH, + /* defaultValue= */ GLOBAL_KILL_SWITCH); } @Override @@ -67,9 +69,9 @@ public final class PhFlags implements Flags { } // The priority of applying the flag values: PH (DeviceConfig), then user hard-coded value. return DeviceConfig.getBoolean( - /* namespace= */ NAMESPACE_ON_DEVICE_PERSONALIZATION, - /* name= */ KEY_ENABLE_ONDEVICEPERSONALIZATION_APIS, - /* defaultValue= */ ENABLE_ONDEVICEPERSONALIZATION_APIS); + /* namespace= */ NAMESPACE_ON_DEVICE_PERSONALIZATION, + /* name= */ KEY_ENABLE_ONDEVICEPERSONALIZATION_APIS, + /* defaultValue= */ ENABLE_ONDEVICEPERSONALIZATION_APIS); } @Override @@ -104,4 +106,12 @@ public final class PhFlags implements Flags { /* name= */ KEY_ISOLATED_SERVICE_DEADLINE_SECONDS, /* defaultValue= */ ISOLATED_SERVICE_DEADLINE_SECONDS); } + + @Override + public String getTrustedPartnerAppsList() { + return DeviceConfig.getString( + /* namespace= */ NAMESPACE_ON_DEVICE_PERSONALIZATION, + /* name= */ KEY_TRUSTED_PARTNER_APPS_LIST, + /* defaultValue */ DEFAULT_TRUSTED_PARTNER_APPS_LIST); + } } diff --git a/tests/federatedcomputetests/AndroidManifest.xml b/tests/federatedcomputetests/AndroidManifest.xml index 09591632..ea63f529 100644 --- a/tests/federatedcomputetests/AndroidManifest.xml +++ b/tests/federatedcomputetests/AndroidManifest.xml @@ -37,7 +37,7 @@ android:permission="android.permission.BIND_JOB_SERVICE"> </service> <service android:name="com.android.federatedcompute.services.training.IsolatedTrainingService" - android:isolatedProcess="true" android:exported="false" > + android:isolatedProcess="true" android:allowSharedIsolatedProcess="true" android:exported="false" > </service> <service android:name="com.android.federatedcompute.services.examplestore.SampleExampleStoreService" diff --git a/tests/federatedcomputetests/src/com/android/federatedcompute/services/IsolatedServiceBinderTest.java b/tests/federatedcomputetests/src/com/android/federatedcompute/services/IsolatedServiceBinderTest.java index 12896c54..f15cdf2e 100644 --- a/tests/federatedcomputetests/src/com/android/federatedcompute/services/IsolatedServiceBinderTest.java +++ b/tests/federatedcomputetests/src/com/android/federatedcompute/services/IsolatedServiceBinderTest.java @@ -45,4 +45,42 @@ public class IsolatedServiceBinderTest { final IIsolatedTrainingService service = serviceBinder.getService(Runnable::run); assertNotNull(service); } + + /** + * Test the isolated service binding implementation, specifically, we bind to services through + * the bindIsolatedService() API but with the shared isolated process flag omitted. + */ + @Test + public void testIsolatedProcessBinding() { + AbstractServiceBinder<IIsolatedTrainingService> serviceBinder = + AbstractServiceBinder.getIsolatedServiceBinderByServiceName( + mContext, + ISOLATED_TRAINING_SERVICE_NAME, + mContext.getPackageName(), + "testSharedIsolatedProcessBinding", + 0, + IIsolatedTrainingService.Stub::asInterface); + + final IIsolatedTrainingService service = serviceBinder.getService(Runnable::run); + assertNotNull(service); + } + + /** + * Test the isolated service binding implementation, specifically, we bind to services through + * the bindIsolatedService() API but with the shared isolated process flag included. + */ + @Test + public void testSharedIsolatedProcessBinding() { + AbstractServiceBinder<IIsolatedTrainingService> serviceBinder = + AbstractServiceBinder.getIsolatedServiceBinderByServiceName( + mContext, + ISOLATED_TRAINING_SERVICE_NAME, + mContext.getPackageName(), + "testSharedIsolatedProcessBinding", + Context.BIND_SHARED_ISOLATED_PROCESS, + IIsolatedTrainingService.Stub::asInterface); + + final IIsolatedTrainingService service = serviceBinder.getService(Runnable::run); + assertNotNull(service); + } } diff --git a/tests/servicetests/src/com/android/ondevicepersonalization/services/PhFlagsTest.java b/tests/servicetests/src/com/android/ondevicepersonalization/services/PhFlagsTest.java index 4cada534..30d6a9a2 100644 --- a/tests/servicetests/src/com/android/ondevicepersonalization/services/PhFlagsTest.java +++ b/tests/servicetests/src/com/android/ondevicepersonalization/services/PhFlagsTest.java @@ -16,6 +16,7 @@ package com.android.ondevicepersonalization.services; +import static com.android.ondevicepersonalization.services.Flags.DEFAULT_TRUSTED_PARTNER_APPS_LIST; import static com.android.ondevicepersonalization.services.Flags.ENABLE_ONDEVICEPERSONALIZATION_APIS; import static com.android.ondevicepersonalization.services.Flags.ENABLE_PERSONALIZATION_STATUS_OVERRIDE; import static com.android.ondevicepersonalization.services.Flags.GLOBAL_KILL_SWITCH; @@ -24,6 +25,7 @@ import static com.android.ondevicepersonalization.services.PhFlags.KEY_ENABLE_ON import static com.android.ondevicepersonalization.services.PhFlags.KEY_ENABLE_PERSONALIZATION_STATUS_OVERRIDE; import static com.android.ondevicepersonalization.services.PhFlags.KEY_GLOBAL_KILL_SWITCH; import static com.android.ondevicepersonalization.services.PhFlags.KEY_PERSONALIZATION_STATUS_OVERRIDE_VALUE; +import static com.android.ondevicepersonalization.services.PhFlags.KEY_TRUSTED_PARTNER_APPS_LIST; import static com.google.common.truth.Truth.assertThat; @@ -133,4 +135,22 @@ public class PhFlagsTest { Flags phFlags = FlagsFactory.getFlags(); assertThat(phFlags.getPersonalizationStatusOverrideValue()).isEqualTo(phOverridingValue); } + + @Test + public void testGetTrustedPartnerAppsList() { + assertThat(FlagsFactory.getFlags().getTrustedPartnerAppsList()) + .isEqualTo(DEFAULT_TRUSTED_PARTNER_APPS_LIST); + + final String testTrustedPartnerAppsList = + "trusted_test_app_1, trusted_test_app_2, trusted_test_app_3"; + + DeviceConfig.setProperty( + DeviceConfig.NAMESPACE_ON_DEVICE_PERSONALIZATION, + KEY_TRUSTED_PARTNER_APPS_LIST, + testTrustedPartnerAppsList, + /* makeDefault */ false); + + assertThat(FlagsFactory.getFlags().getTrustedPartnerAppsList()) + .isEqualTo(testTrustedPartnerAppsList); + } } |