blob: 3bf57a3d2ff21924a8356ced3b7f8d2998e0f1d0 [file] [log] [blame]
// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ash/arc/session/arc_service_launcher.h"
#include <string>
#include <utility>
#include "ash/components/arc/appfuse/arc_appfuse_bridge.h"
#include "ash/components/arc/arc_features.h"
#include "ash/components/arc/arc_util.h"
#include "ash/components/arc/audio/arc_audio_bridge.h"
#include "ash/components/arc/camera/arc_camera_bridge.h"
#include "ash/components/arc/clipboard/arc_clipboard_bridge.h"
#include "ash/components/arc/compat_mode/arc_resize_lock_manager.h"
#include "ash/components/arc/crash_collector/arc_crash_collector_bridge.h"
#include "ash/components/arc/disk_quota/arc_disk_quota_bridge.h"
#include "ash/components/arc/ime/arc_ime_service.h"
#include "ash/components/arc/keyboard_shortcut/arc_keyboard_shortcut_bridge.h"
#include "ash/components/arc/lock_screen/arc_lock_screen_bridge.h"
#include "ash/components/arc/media_session/arc_media_session_bridge.h"
#include "ash/components/arc/memory/arc_memory_bridge.h"
#include "ash/components/arc/memory_pressure/arc_memory_pressure_bridge.h"
#include "ash/components/arc/metrics/arc_metrics_service.h"
#include "ash/components/arc/midis/arc_midis_bridge.h"
#include "ash/components/arc/net/arc_net_host_impl.h"
#include "ash/components/arc/obb_mounter/arc_obb_mounter_bridge.h"
#include "ash/components/arc/pay/arc_digital_goods_bridge.h"
#include "ash/components/arc/pay/arc_payment_app_bridge.h"
#include "ash/components/arc/power/arc_power_bridge.h"
#include "ash/components/arc/property/arc_property_bridge.h"
#include "ash/components/arc/rotation_lock/arc_rotation_lock_bridge.h"
#include "ash/components/arc/sensor/arc_iio_sensor_bridge.h"
#include "ash/components/arc/session/arc_service_manager.h"
#include "ash/components/arc/session/arc_session.h"
#include "ash/components/arc/session/arc_session_runner.h"
#include "ash/components/arc/storage_manager/arc_storage_manager.h"
#include "ash/components/arc/system_ui/arc_system_ui_bridge.h"
#include "ash/components/arc/timer/arc_timer_bridge.h"
#include "ash/components/arc/usb/usb_host_bridge.h"
#include "ash/components/arc/volume_mounter/arc_volume_mounter_bridge.h"
#include "ash/components/arc/wake_lock/arc_wake_lock_bridge.h"
#include "ash/constants/ash_features.h"
#include "base/check_op.h"
#include "base/files/file_util.h"
#include "base/functional/bind.h"
#include "base/task/sequenced_task_runner.h"
#include "chrome/browser/apps/app_service/publishers/arc_apps_factory.h"
#include "chrome/browser/ash/app_list/arc/arc_package_syncable_service_factory.h"
#include "chrome/browser/ash/app_list/arc/arc_usb_host_permission_manager.h"
#include "chrome/browser/ash/app_list/arc/arc_usb_host_permission_manager_factory.h"
#include "chrome/browser/ash/app_restore/app_restore_arc_task_handler.h"
#include "chrome/browser/ash/apps/apk_web_app_service.h"
#include "chrome/browser/ash/arc/accessibility/arc_accessibility_helper_bridge.h"
#include "chrome/browser/ash/arc/adbd/arc_adbd_monitor_bridge.h"
#include "chrome/browser/ash/arc/arc_util.h"
#include "chrome/browser/ash/arc/auth/arc_auth_service.h"
#include "chrome/browser/ash/arc/bluetooth/arc_bluetooth_bridge.h"
#include "chrome/browser/ash/arc/boot_phase_monitor/arc_boot_phase_monitor_bridge.h"
#include "chrome/browser/ash/arc/enterprise/arc_enterprise_reporting_service.h"
#include "chrome/browser/ash/arc/enterprise/cert_store/cert_store_service.h"
#include "chrome/browser/ash/arc/file_system_watcher/arc_file_system_watcher_service.h"
#include "chrome/browser/ash/arc/fileapi/arc_documents_provider_root_map_factory.h"
#include "chrome/browser/ash/arc/fileapi/arc_file_system_bridge.h"
#include "chrome/browser/ash/arc/fileapi/arc_file_system_mounter.h"
#include "chrome/browser/ash/arc/fileapi/arc_file_system_operation_runner.h"
#include "chrome/browser/ash/arc/idle_manager/arc_idle_manager.h"
#include "chrome/browser/ash/arc/input_method_manager/arc_input_method_manager_service.h"
#include "chrome/browser/ash/arc/input_overlay/arc_input_overlay_manager.h"
#include "chrome/browser/ash/arc/instance_throttle/arc_instance_throttle.h"
#include "chrome/browser/ash/arc/intent_helper/arc_settings_service.h"
#include "chrome/browser/ash/arc/intent_helper/factory_reset_delegate.h"
#include "chrome/browser/ash/arc/keymaster/arc_keymaster_bridge.h"
#include "chrome/browser/ash/arc/kiosk/arc_kiosk_bridge.h"
#include "chrome/browser/ash/arc/metrics/arc_metrics_service_proxy.h"
#include "chrome/browser/ash/arc/nearby_share/arc_nearby_share_bridge.h"
#include "chrome/browser/ash/arc/net/browser_url_opener_impl.h"
#include "chrome/browser/ash/arc/net/cert_manager_impl.h"
#include "chrome/browser/ash/arc/notification/arc_boot_error_notification.h"
#include "chrome/browser/ash/arc/notification/arc_provision_notification_service.h"
#include "chrome/browser/ash/arc/notification/arc_vm_data_migration_notifier.h"
#include "chrome/browser/ash/arc/oemcrypto/arc_oemcrypto_bridge.h"
#include "chrome/browser/ash/arc/pip/arc_pip_bridge.h"
#include "chrome/browser/ash/arc/policy/arc_policy_bridge.h"
#include "chrome/browser/ash/arc/print_spooler/arc_print_spooler_bridge.h"
#include "chrome/browser/ash/arc/privacy_items/arc_privacy_items_bridge.h"
#include "chrome/browser/ash/arc/process/arc_process_service.h"
#include "chrome/browser/ash/arc/screen_capture/arc_screen_capture_bridge.h"
#include "chrome/browser/ash/arc/session/arc_disk_space_monitor.h"
#include "chrome/browser/ash/arc/session/arc_initial_optin_notifier.h"
#include "chrome/browser/ash/arc/session/arc_play_store_enabled_preference_handler.h"
#include "chrome/browser/ash/arc/session/arc_session_manager.h"
#include "chrome/browser/ash/arc/sharesheet/arc_sharesheet_bridge.h"
#include "chrome/browser/ash/arc/survey/arc_survey_service.h"
#include "chrome/browser/ash/arc/tracing/arc_app_performance_tracing.h"
#include "chrome/browser/ash/arc/tracing/arc_tracing_bridge.h"
#include "chrome/browser/ash/arc/tts/arc_tts_service.h"
#include "chrome/browser/ash/arc/user_session/arc_user_session_service.h"
#include "chrome/browser/ash/arc/video/gpu_arc_video_service_host.h"
#include "chrome/browser/ash/arc/vmm/arc_system_state_bridge.h"
#include "chrome/browser/ash/arc/vmm/arc_vmm_manager.h"
#include "chrome/browser/ash/arc/wallpaper/arc_wallpaper_service.h"
#include "chrome/browser/ash/login/startup_utils.h"
#include "chrome/browser/ash/profiles/profile_helper.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/ash/multi_user/multi_user_util.h"
#include "chrome/common/channel_info.h"
#include "components/arc/common/intent_helper/arc_icon_cache_delegate.h"
#include "components/arc/intent_helper/arc_intent_helper_bridge.h"
#include "components/prefs/pref_member.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#if BUILDFLAG(USE_ARC_PROTECTED_MEDIA)
#include "base/task/sequenced_task_runner.h"
#include "base/time/time.h"
#include "chromeos/ash/components/dbus/cdm_factory_daemon/cdm_factory_daemon_client.h"
#include "chromeos/dbus/tpm_manager/tpm_manager_client.h"
// Delay for repeatedly checking if the TPM is owned or not.
constexpr base::TimeDelta kTpmOwnershipCheckDelay = base::Seconds(5);
// Timeout for waiting for the daemon to become available after we have owned
// the TPM.
constexpr base::TimeDelta kDaemonWaitTimeoutSec = base::Seconds(30);
#endif // BUILDFLAG(USE_ARC_PROTECTED_MEDIA)
namespace arc {
namespace {
// `ChromeBrowserMainPartsAsh` owns.
ArcServiceLauncher* g_arc_service_launcher = nullptr;
std::unique_ptr<ArcSessionManager> CreateArcSessionManager(
ArcBridgeService* arc_bridge_service,
version_info::Channel channel,
ash::SchedulerConfigurationManagerBase* scheduler_configuration_manager) {
auto delegate = std::make_unique<AdbSideloadingAvailabilityDelegateImpl>();
auto runner = std::make_unique<ArcSessionRunner>(
base::BindRepeating(ArcSession::Create, arc_bridge_service, channel,
scheduler_configuration_manager, delegate.get()));
return std::make_unique<ArcSessionManager>(std::move(runner),
std::move(delegate));
}
} // namespace
ArcServiceLauncher::ArcServiceLauncher(
ash::SchedulerConfigurationManagerBase* scheduler_configuration_manager)
: arc_service_manager_(std::make_unique<ArcServiceManager>()),
arc_session_manager_(
CreateArcSessionManager(arc_service_manager_->arc_bridge_service(),
chrome::GetChannel(),
scheduler_configuration_manager)),
scheduler_configuration_manager_(scheduler_configuration_manager) {
DCHECK(g_arc_service_launcher == nullptr);
g_arc_service_launcher = this;
if (base::FeatureList::IsEnabled(kEnableVirtioBlkForData) ||
base::FeatureList::IsEnabled(kEnableArcVmDataMigration)) {
arc_disk_space_monitor_ = std::make_unique<ArcDiskSpaceMonitor>();
}
}
ArcServiceLauncher::~ArcServiceLauncher() {
DCHECK_EQ(g_arc_service_launcher, this);
g_arc_service_launcher = nullptr;
}
// static
ArcServiceLauncher* ArcServiceLauncher::Get() {
return g_arc_service_launcher;
}
void ArcServiceLauncher::Initialize() {
#if BUILDFLAG(USE_ARC_PROTECTED_MEDIA)
// If we have ARC HWDRM then we need to wait for the CdmFactoryDaemon service
// to advertise avalability so that arc-prepare-host-generated-dir can query
// it via D-Bus for the CDM client information.
ash::CdmFactoryDaemonClient::Get()->WaitForServiceToBeAvailable(
base::BindOnce(&ArcServiceLauncher::OnCdmFactoryDaemonAvailable,
weak_factory_.GetWeakPtr(), /*from_timeout=*/false));
base::SequencedTaskRunner::GetCurrentDefault()->PostDelayedTask(
FROM_HERE,
base::BindOnce(&ArcServiceLauncher::OnCheckTpmStatus,
weak_factory_.GetWeakPtr()),
kTpmOwnershipCheckDelay);
#else
arc_session_manager_->ExpandPropertyFilesAndReadSalt();
#endif // BUILDFLAG(USE_ARC_PROTECTED_MEDIA)
}
void ArcServiceLauncher::MaybeSetProfile(Profile* profile) {
if (!IsArcAllowedForProfile(profile))
return;
// Do not expect it in real use case, but it is used for testing.
// Because the ArcService instances tied to the old profile is kept,
// and ones tied to the new profile are added, which is unexpected situation.
// For compatibility, call Shutdown() here in case |profile| is not
// allowed for ARC.
// TODO(hidehiko): DCHECK(!arc_session_manager_->IsAllowed()) here, and
// get rid of Shutdown().
if (arc_session_manager_->profile())
arc_session_manager_->Shutdown();
arc_session_manager_->SetProfile(profile);
arc_service_manager_->set_browser_context(profile);
arc_service_manager_->set_account_id(
multi_user_util::GetAccountIdFromProfile(profile));
}
void ArcServiceLauncher::OnPrimaryUserProfilePrepared(Profile* profile) {
DCHECK(arc_service_manager_);
DCHECK(arc_session_manager_);
if (arc_session_manager_->profile() != profile) {
// Profile is not matched, so the given |profile| is not allowed to use
// ARC.
return;
}
std::string user_id_hash =
ash::ProfileHelper::GetUserIdHashFromProfile(profile);
// Instantiate ARC related BrowserContextKeyedService classes which need
// to be running at the beginning of the container run.
// Note that, to keep this list as small as possible, services which don't
// need to be initialized at the beginning should not be listed here.
// Those services will be initialized lazily.
// List in lexicographical order.
ArcAccessibilityHelperBridge::GetForBrowserContext(profile);
ArcAdbdMonitorBridge::GetForBrowserContext(profile);
ArcAppPerformanceTracing::GetForBrowserContext(profile);
ArcAudioBridge::GetForBrowserContext(profile);
ArcAuthService::GetForBrowserContext(profile);
ArcBluetoothBridge::GetForBrowserContext(profile);
ArcBootErrorNotification::GetForBrowserContext(profile);
ArcBootPhaseMonitorBridge::GetForBrowserContext(profile);
ArcCameraBridge::GetForBrowserContext(profile);
ArcClipboardBridge::GetForBrowserContext(profile);
ArcCrashCollectorBridge::GetForBrowserContext(profile);
ArcDigitalGoodsBridge::GetForBrowserContext(profile);
ArcDiskQuotaBridge::GetForBrowserContext(profile)->SetAccountId(
multi_user_util::GetAccountIdFromProfile(profile));
ArcEnterpriseReportingService::GetForBrowserContext(profile);
ArcFileSystemBridge::GetForBrowserContext(profile);
ArcFileSystemMounter::GetForBrowserContext(profile);
ArcFileSystemWatcherService::GetForBrowserContext(profile);
ArcIioSensorBridge::GetForBrowserContext(profile);
ArcImeService::GetForBrowserContext(profile);
ArcInputMethodManagerService::GetForBrowserContext(profile);
input_overlay::ArcInputOverlayManager::GetForBrowserContext(profile);
ArcInstanceThrottle::GetForBrowserContext(profile);
{
auto* intent_helper = ArcIntentHelperBridge::GetForBrowserContext(profile);
intent_helper->SetDelegate(std::make_unique<FactoryResetDelegate>());
arc_icon_cache_delegate_provider_ =
std::make_unique<ArcIconCacheDelegateProvider>(intent_helper);
}
ArcIntentHelperBridge::GetForBrowserContext(profile)->SetDelegate(
std::make_unique<FactoryResetDelegate>());
ArcKeyboardShortcutBridge::GetForBrowserContext(profile);
ArcKeymasterBridge::GetForBrowserContext(profile);
ArcKioskBridge::GetForBrowserContext(profile);
ArcLockScreenBridge::GetForBrowserContext(profile);
ArcMediaSessionBridge::GetForBrowserContext(profile);
{
auto* metrics_service = ArcMetricsService::GetForBrowserContext(profile);
metrics_service->SetHistogramNamerCallback(
base::BindRepeating([](const std::string& base_name) {
return GetHistogramNameByUserTypeForPrimaryProfile(base_name);
}));
metrics_service->set_user_id_hash(user_id_hash);
}
ArcMetricsServiceProxy::GetForBrowserContext(profile);
ArcMidisBridge::GetForBrowserContext(profile);
ArcNearbyShareBridge::GetForBrowserContext(profile);
{
auto* arc_net_host_impl = ArcNetHostImpl::GetForBrowserContext(profile);
arc_net_host_impl->SetPrefService(profile->GetPrefs());
arc_net_host_impl->SetCertManager(
std::make_unique<CertManagerImpl>(profile));
if (ash::features::IsPasspointARCSupportEnabled()) {
arc_net_url_opener_ = std::make_unique<BrowserUrlOpenerImpl>();
}
}
ArcOemCryptoBridge::GetForBrowserContext(profile);
ArcPaymentAppBridge::GetForBrowserContext(profile);
ArcPipBridge::GetForBrowserContext(profile);
ArcPolicyBridge::GetForBrowserContext(profile);
ArcPowerBridge::GetForBrowserContext(profile)->SetUserIdHash(user_id_hash);
ArcPrintSpoolerBridge::GetForBrowserContext(profile);
ArcPrivacyItemsBridge::GetForBrowserContext(profile);
ArcProcessService::GetForBrowserContext(profile);
ArcPropertyBridge::GetForBrowserContext(profile);
ArcProvisionNotificationService::GetForBrowserContext(profile);
ArcResizeLockManager::GetForBrowserContext(profile);
ArcRotationLockBridge::GetForBrowserContext(profile);
ArcScreenCaptureBridge::GetForBrowserContext(profile);
ArcSettingsService::GetForBrowserContext(profile);
ArcSharesheetBridge::GetForBrowserContext(profile);
ArcSurveyService::GetForBrowserContext(profile);
ArcSystemUIBridge::GetForBrowserContext(profile);
ArcTimerBridge::GetForBrowserContext(profile);
ArcTracingBridge::GetForBrowserContext(profile);
ArcTtsService::GetForBrowserContext(profile);
ArcUsbHostBridge::GetForBrowserContext(profile);
ArcUsbHostPermissionManager::GetForBrowserContext(profile);
ArcUserSessionService::GetForBrowserContext(profile);
ArcVolumeMounterBridge::GetForBrowserContext(profile);
ArcWakeLockBridge::GetForBrowserContext(profile);
ArcWallpaperService::GetForBrowserContext(profile);
GpuArcVideoKeyedService::GetForBrowserContext(profile);
CertStoreService::GetForBrowserContext(profile);
apps::ArcAppsFactory::GetForProfile(profile);
ash::ApkWebAppService::Get(profile);
ash::app_restore::AppRestoreArcTaskHandler::GetForProfile(profile);
ArcInitialOptInNotifier::GetForProfile(profile);
if (arc::IsArcVmEnabled()) {
// ARCVM-only services.
ArcMemoryPressureBridge::GetForBrowserContext(profile);
ArcVmmManager::GetForBrowserContext(profile)->set_user_id_hash(
user_id_hash);
ArcSystemStateBridge::GetForBrowserContext(profile);
if (base::FeatureList::IsEnabled(kEnableArcVmDataMigration)) {
arc_vm_data_migration_notifier_ =
std::make_unique<ArcVmDataMigrationNotifier>(profile);
}
if (base::FeatureList::IsEnabled(kEnableArcIdleManager))
ArcIdleManager::GetForBrowserContext(profile);
} else {
// ARC Container-only services.
ArcAppfuseBridge::GetForBrowserContext(profile);
ArcObbMounterBridge::GetForBrowserContext(profile);
}
arc_session_manager_->Initialize();
arc_play_store_enabled_preference_handler_ =
std::make_unique<ArcPlayStoreEnabledPreferenceHandler>(
profile, arc_session_manager_.get());
arc_play_store_enabled_preference_handler_->Start();
}
void ArcServiceLauncher::Shutdown() {
arc_play_store_enabled_preference_handler_.reset();
arc_session_manager_->Shutdown();
arc_icon_cache_delegate_provider_.reset();
arc_net_url_opener_.reset();
}
void ArcServiceLauncher::ResetForTesting() {
// First destroy the internal states, then re-initialize them.
// These are for workaround of singletonness DCHECK in their ctors/dtors.
Shutdown();
arc_session_manager_.reset();
// No recreation of arc_service_manager. Pointers to its ArcBridgeService
// may be referred from existing KeyedService, so destoying it would cause
// unexpected behavior, specifically on test teardown.
arc_session_manager_ = CreateArcSessionManager(
arc_service_manager_->arc_bridge_service(), chrome::GetChannel(),
scheduler_configuration_manager_);
}
#if BUILDFLAG(USE_ARC_PROTECTED_MEDIA)
void ArcServiceLauncher::OnCdmFactoryDaemonAvailable(
bool from_timeout,
bool is_service_available) {
if (is_service_available && !expanded_property_files_) {
if (from_timeout) {
LOG(ERROR)
<< "Timed out waiting for CdmFactoryDaemon service in ARC startup";
}
expanded_property_files_ = true;
arc_session_manager_->ExpandPropertyFilesAndReadSalt();
weak_factory_.InvalidateWeakPtrs();
}
}
void ArcServiceLauncher::OnCheckTpmStatus() {
chromeos::TpmManagerClient::Get()->GetTpmNonsensitiveStatus(
::tpm_manager::GetTpmNonsensitiveStatusRequest(),
base::BindOnce(&ArcServiceLauncher::OnGetTpmStatus,
weak_factory_.GetWeakPtr()));
}
void ArcServiceLauncher::OnGetTpmStatus(
const ::tpm_manager::GetTpmNonsensitiveStatusReply& reply) {
if (expanded_property_files_)
return;
if (reply.status() == ::tpm_manager::TpmManagerStatus::STATUS_SUCCESS &&
reply.is_owned()) {
// The TPM is owned, so we should invoke OnCdmFactoryDaemonAvailable() after
// our timeout so that the property files get expanded even if the daemon
// doesn't come online.
base::SequencedTaskRunner::GetCurrentDefault()->PostDelayedTask(
FROM_HERE,
base::BindOnce(&ArcServiceLauncher::OnCdmFactoryDaemonAvailable,
weak_factory_.GetWeakPtr(),
/*from_timeout=*/true,
/*is_service_available=*/true),
kDaemonWaitTimeoutSec);
return;
}
base::SequencedTaskRunner::GetCurrentDefault()->PostDelayedTask(
FROM_HERE,
base::BindOnce(&ArcServiceLauncher::OnCheckTpmStatus,
weak_factory_.GetWeakPtr()),
kTpmOwnershipCheckDelay);
}
#endif // BUILDFLAG(USE_ARC_PROTECTED_MEDIA)
// static
void ArcServiceLauncher::EnsureFactoriesBuilt() {
ArcAccessibilityHelperBridge::EnsureFactoryBuilt();
ArcAdbdMonitorBridge::EnsureFactoryBuilt();
ArcAppPerformanceTracing::EnsureFactoryBuilt();
ArcAppfuseBridge::EnsureFactoryBuilt();
ArcAudioBridge::EnsureFactoryBuilt();
ArcAuthService::EnsureFactoryBuilt();
ArcBluetoothBridge::EnsureFactoryBuilt();
ArcBootErrorNotification::EnsureFactoryBuilt();
ArcBootPhaseMonitorBridgeFactory::GetInstance();
ArcCameraBridge::EnsureFactoryBuilt();
ArcClipboardBridge::EnsureFactoryBuilt();
ArcCrashCollectorBridge::EnsureFactoryBuilt();
ArcDigitalGoodsBridge::EnsureFactoryBuilt();
ArcDiskQuotaBridge::EnsureFactoryBuilt();
ArcDocumentsProviderRootMapFactory::GetInstance();
ArcEnterpriseReportingService::EnsureFactoryBuilt();
ArcFileSystemMounter::EnsureFactoryBuilt();
ArcFileSystemOperationRunner::EnsureFactoryBuilt();
ArcFileSystemWatcherService::EnsureFactoryBuilt();
ArcIioSensorBridge::EnsureFactoryBuilt();
ArcImeService::EnsureFactoryBuilt();
ArcInitialOptInNotifier::EnsureFactoryBuilt();
ArcInstanceThrottle::EnsureFactoryBuilt();
ArcKeyboardShortcutBridge::EnsureFactoryBuilt();
ArcKeymasterBridge::EnsureFactoryBuilt();
ArcKioskBridge::EnsureFactoryBuilt();
ArcLockScreenBridge::EnsureFactoryBuilt();
ArcMediaSessionBridge::EnsureFactoryBuilt();
ArcMemoryBridge::EnsureFactoryBuilt();
ArcMemoryPressureBridge::EnsureFactoryBuilt();
ArcMetricsServiceFactory::GetInstance();
ArcMetricsServiceProxy::EnsureFactoryBuilt();
ArcMidisBridge::EnsureFactoryBuilt();
ArcNearbyShareBridge::EnsureFactoryBuilt();
ArcNetHostImpl::EnsureFactoryBuilt();
ArcObbMounterBridge::EnsureFactoryBuilt();
ArcOemCryptoBridge::EnsureFactoryBuilt();
ArcPackageSyncableServiceFactory::GetInstance();
ArcPaymentAppBridge::EnsureFactoryBuilt();
ArcPipBridge::EnsureFactoryBuilt();
ArcPolicyBridge::EnsureFactoryBuilt();
ArcPowerBridge::EnsureFactoryBuilt();
ArcPrintSpoolerBridge::EnsureFactoryBuilt();
ArcPrivacyItemsBridge::EnsureFactoryBuilt();
ArcProcessService::EnsureFactoryBuilt();
ArcPropertyBridge::EnsureFactoryBuilt();
ArcProvisionNotificationService::EnsureFactoryBuilt();
ArcResizeLockManager::EnsureFactoryBuilt();
ArcRotationLockBridge::EnsureFactoryBuilt();
ArcScreenCaptureBridge::EnsureFactoryBuilt();
ArcSettingsService::EnsureFactoryBuilt();
ArcStorageManager::EnsureFactoryBuilt();
ArcSharesheetBridge::EnsureFactoryBuilt();
ArcSurveyService::EnsureFactoryBuilt();
ArcSystemUIBridge::EnsureFactoryBuilt();
ArcSystemStateBridge::EnsureFactoryBuilt();
ArcTimerBridge::EnsureFactoryBuilt();
ArcTracingBridge::EnsureFactoryBuilt();
ArcTtsService::EnsureFactoryBuilt();
ArcUsbHostBridge::EnsureFactoryBuilt();
ArcUsbHostPermissionManagerFactory::GetInstance();
ArcUserSessionService::EnsureFactoryBuilt();
ArcVmmManager::EnsureFactoryBuilt();
ArcVolumeMounterBridge::EnsureFactoryBuilt();
ArcWakeLockBridge::EnsureFactoryBuilt();
ArcWallpaperService::EnsureFactoryBuilt();
CertStoreService::EnsureFactoryBuilt();
GpuArcVideoKeyedService::EnsureFactoryBuilt();
input_overlay::ArcInputOverlayManager::EnsureFactoryBuilt();
}
} // namespace arc