173 lines
7.6 KiB
Java
173 lines
7.6 KiB
Java
/*
|
|
* Copyright (C) 2022 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
package com.android.adservices;
|
|
|
|
import android.adservices.adid.AdIdProviderService;
|
|
import android.adservices.appsetid.AppSetIdProviderService;
|
|
import android.adservices.cobalt.AdServicesCobaltUploadService;
|
|
import android.adservices.extdata.AdServicesExtDataStorageService;
|
|
import android.annotation.Nullable;
|
|
import android.content.pm.ResolveInfo;
|
|
import android.content.pm.ServiceInfo;
|
|
|
|
import java.util.List;
|
|
import java.util.stream.Collectors;
|
|
|
|
// TODO(b/295321663): need to split constants into AdServicesCommonConstants so they can be used by
|
|
// host-side test artifacts.
|
|
|
|
/**
|
|
* Common constants for AdServices
|
|
*
|
|
* @hide
|
|
*/
|
|
public final class AdServicesCommon {
|
|
private AdServicesCommon() {}
|
|
|
|
/** Intent action to discover the Topics service in the APK. */
|
|
public static final String ACTION_TOPICS_SERVICE = "android.adservices.TOPICS_SERVICE";
|
|
|
|
/** Intent action to discover the Custom Audience service in the APK. */
|
|
public static final String ACTION_CUSTOM_AUDIENCE_SERVICE =
|
|
"android.adservices.customaudience.CUSTOM_AUDIENCE_SERVICE";
|
|
|
|
/** Intent action to discover the AdSelection service in the APK. */
|
|
public static final String ACTION_AD_SELECTION_SERVICE =
|
|
"android.adservices.adselection.AD_SELECTION_SERVICE";
|
|
|
|
/** Intent action to discover the protected signals service in the APK. */
|
|
public static final String ACTION_PROTECTED_SIGNALS_SERVICE =
|
|
"android.adservices.signals.PROTECTED_SIGNALS_SERVICE";
|
|
|
|
/** Intent action to discover the Measurement service in the APK. */
|
|
public static final String ACTION_MEASUREMENT_SERVICE =
|
|
"android.adservices.MEASUREMENT_SERVICE";
|
|
|
|
/** Intent action to discover the AdId service in the APK. */
|
|
public static final String ACTION_ADID_SERVICE = "android.adservices.ADID_SERVICE";
|
|
|
|
/** Intent action to discover the AdId Provider service. */
|
|
public static final String ACTION_ADID_PROVIDER_SERVICE = AdIdProviderService.SERVICE_INTERFACE;
|
|
|
|
/** Intent action to discover the AppSetId service in the APK. */
|
|
public static final String ACTION_APPSETID_SERVICE = "android.adservices.APPSETID_SERVICE";
|
|
|
|
/** Intent action to discover the AppSetId Provider service. */
|
|
public static final String ACTION_APPSETID_PROVIDER_SERVICE =
|
|
AppSetIdProviderService.SERVICE_INTERFACE;
|
|
|
|
/** Intent action to discover the AdServicesExtDataStorageService. */
|
|
public static final String ACTION_AD_EXT_DATA_STORAGE_SERVICE =
|
|
AdServicesExtDataStorageService.SERVICE_INTERFACE;
|
|
|
|
/** Intent action to discover the AdServicesCommon service in the APK. */
|
|
public static final String ACTION_AD_SERVICES_COMMON_SERVICE =
|
|
"android.adservices.AD_SERVICES_COMMON_SERVICE";
|
|
|
|
/** Intent action to discover the AdServices Cobalt upload service. */
|
|
public static final String ACTION_AD_SERVICES_COBALT_UPLOAD_SERVICE =
|
|
AdServicesCobaltUploadService.SERVICE_INTERFACE;
|
|
|
|
/** Intent action to discover the Shell Command service in the APK. */
|
|
public static final String ACTION_SHELL_COMMAND_SERVICE =
|
|
"android.adservices.SHELL_COMMAND_SERVICE";
|
|
|
|
// Used to differentiate between AdServices APK package name and AdExtServices APK package name.
|
|
// The AdExtServices APK package name suffix is android.ext.services.
|
|
public static final String ADSERVICES_APK_PACKAGE_NAME_SUFFIX = "android.adservices.api";
|
|
|
|
/** The package name suffix of the ExtServices APK on R/S */
|
|
public static final String ADEXTSERVICES_PACKAGE_NAME_SUFFIX = "android.ext.services";
|
|
|
|
/** Suffix for the AdServices APEX package name. */
|
|
public static final String ADSERVICES_APEX_NAME_SUFFIX = "android.adservices";
|
|
|
|
/**
|
|
* Suffix for the ExtServices APEX Package name. Used to figure out the installed apex version.
|
|
*/
|
|
public static final String EXTSERVICES_APEX_NAME_SUFFIX = "android.extservices";
|
|
|
|
/**
|
|
* Prefix for system properties used for debugging purposes (like simulating unsupported devices
|
|
* or change some behavior without changing a flag).
|
|
*/
|
|
public static final String SYSTEM_PROPERTY_FOR_DEBUGGING_PREFIX = "debug.adservices.";
|
|
|
|
/** System property used to simulate AdServices behavior on devices with low memory. */
|
|
public static final String SYSTEM_PROPERTY_FOR_DEBUGGING_FEATURE_RAM_LOW =
|
|
SYSTEM_PROPERTY_FOR_DEBUGGING_PREFIX + "low_ram_device";
|
|
|
|
/** The name of System Property for the binder timeout */
|
|
public static final String BINDER_TIMEOUT_SYSTEM_PROPERTY_NAME = "binder_timeout";
|
|
|
|
/** System property used to allow test to override the binder's timeout. */
|
|
public static final String SYSTEM_PROPERTY_FOR_DEBUGGING_BINDER_TIMEOUT =
|
|
SYSTEM_PROPERTY_FOR_DEBUGGING_PREFIX + BINDER_TIMEOUT_SYSTEM_PROPERTY_NAME;
|
|
|
|
/** Path name for Adservice class names */
|
|
public static final String ADSERVICES_CLASS_PATH_PREFIX = "com.android.adservices.";
|
|
|
|
/** The package name of the active AdServices APK on this device. */
|
|
public static ServiceInfo resolveAdServicesService(
|
|
@Nullable List<ResolveInfo> intentResolveInfos, String intentAction) {
|
|
int size = intentResolveInfos == null ? 0 : intentResolveInfos.size();
|
|
switch (size) {
|
|
case 0:
|
|
LogUtil.e(
|
|
"Failed to find resolveInfo for adServices service. Intent action: %s",
|
|
intentAction);
|
|
return null;
|
|
|
|
case 1:
|
|
return intentResolveInfos.get(0).serviceInfo;
|
|
|
|
case 2:
|
|
// On T+ devices, we may have two versions of the services present due to
|
|
// b/263904312. Only use the service that comes from AdServices APK. The package
|
|
// name of AdService is com.[google.]android.adservices.api while the package name
|
|
// of ExtServices APK is com.[google.]android.ext.services.
|
|
ServiceInfo serviceInfo = getServiceInfoIfAdServices(intentResolveInfos.get(0));
|
|
return serviceInfo == null
|
|
? getServiceInfoIfAdServices(intentResolveInfos.get(1))
|
|
: serviceInfo;
|
|
|
|
default:
|
|
List<String> intents =
|
|
intentResolveInfos.stream()
|
|
.filter(s -> s != null && s.serviceInfo != null)
|
|
.map(s -> s.serviceInfo.packageName)
|
|
.collect(Collectors.toList());
|
|
LogUtil.e("Found multiple services %s for %s", intents, intentAction);
|
|
return null;
|
|
}
|
|
}
|
|
|
|
private static ServiceInfo getServiceInfoIfAdServices(@Nullable ResolveInfo resolveInfo) {
|
|
if (resolveInfo == null) {
|
|
return null;
|
|
}
|
|
|
|
ServiceInfo serviceInfo = resolveInfo.serviceInfo;
|
|
if (serviceInfo == null || serviceInfo.packageName == null) {
|
|
return null;
|
|
}
|
|
|
|
return serviceInfo.packageName.endsWith(ADSERVICES_APK_PACKAGE_NAME_SUFFIX)
|
|
? serviceInfo
|
|
: null;
|
|
}
|
|
}
|