DO NOT MERGE - Merge qt-dev-plus-aosp-without-vendor (5699924) into

stage-aosp-master

Bug: 134405016
Change-Id: I0d1fc0e5f5f7fbd56d9f1032b806bfe82a5dd08b
This commit is contained in:
Xin Li
2019-07-02 02:56:03 +00:00
12022 changed files with 1089300 additions and 415410 deletions

1
.gitignore vendored
View File

@@ -1,2 +1,3 @@
/.idea
*.iml
*.sw*

View File

@@ -59,6 +59,7 @@ java_defaults {
"core/java/android/app/IActivityController.aidl",
"core/java/android/app/IActivityManager.aidl",
"core/java/android/app/IActivityPendingResult.aidl",
"core/java/android/app/IActivityTaskManager.aidl",
"core/java/android/app/IAlarmCompleteListener.aidl",
"core/java/android/app/IAlarmListener.aidl",
"core/java/android/app/IAlarmManager.aidl",
@@ -68,11 +69,11 @@ java_defaults {
"core/java/android/app/ITaskStackListener.aidl",
"core/java/android/app/IBackupAgent.aidl",
"core/java/android/app/IEphemeralResolver.aidl",
"core/java/android/app/IInputForwarder.aidl",
"core/java/android/app/IInstantAppResolver.aidl",
"core/java/android/app/IInstrumentationWatcher.aidl",
"core/java/android/app/INotificationManager.aidl",
"core/java/android/app/IProcessObserver.aidl",
"core/java/android/app/IRequestFinishCallback.aidl",
"core/java/android/app/ISearchManager.aidl",
"core/java/android/app/ISearchManagerCallback.aidl",
"core/java/android/app/IServiceConnection.aidl",
@@ -84,14 +85,17 @@ java_defaults {
"core/java/android/app/IUidObserver.aidl",
"core/java/android/app/IUiAutomationConnection.aidl",
"core/java/android/app/IUiModeManager.aidl",
"core/java/android/app/IUriGrantsManager.aidl",
"core/java/android/app/IUserSwitchObserver.aidl",
"core/java/android/app/IWallpaperManager.aidl",
"core/java/android/app/IWallpaperManagerCallback.aidl",
"core/java/android/app/admin/IDeviceAdminService.aidl",
"core/java/android/app/admin/IDevicePolicyManager.aidl",
"core/java/android/app/admin/StartInstallingUpdateCallback.aidl",
"core/java/android/app/trust/IStrongAuthTracker.aidl",
"core/java/android/app/trust/ITrustManager.aidl",
"core/java/android/app/trust/ITrustListener.aidl",
"core/java/android/app/backup/IBackupCallback.aidl",
"core/java/android/app/backup/IBackupManager.aidl",
"core/java/android/app/backup/IBackupObserver.aidl",
"core/java/android/app/backup/IBackupManagerMonitor.aidl",
@@ -99,6 +103,14 @@ java_defaults {
"core/java/android/app/backup/IRestoreObserver.aidl",
"core/java/android/app/backup/IRestoreSession.aidl",
"core/java/android/app/backup/ISelectBackupTransportCallback.aidl",
"core/java/android/app/contentsuggestions/IClassificationsCallback.aidl",
"core/java/android/app/contentsuggestions/IContentSuggestionsManager.aidl",
"core/java/android/app/contentsuggestions/ISelectionsCallback.aidl",
"core/java/android/app/prediction/IPredictionCallback.aidl",
"core/java/android/app/prediction/IPredictionManager.aidl",
"core/java/android/app/role/IOnRoleHoldersChangedListener.aidl",
"core/java/android/app/role/IRoleController.aidl",
"core/java/android/app/role/IRoleManager.aidl",
"core/java/android/app/slice/ISliceManager.aidl",
"core/java/android/app/slice/ISliceListener.aidl",
"core/java/android/app/timedetector/ITimeDetectorService.aidl",
@@ -142,18 +154,28 @@ java_defaults {
"core/java/android/content/pm/dex/IArtManager.aidl",
"core/java/android/content/pm/dex/ISnapshotRuntimeProfileCallback.aidl",
"core/java/android/content/pm/permission/IRuntimePermissionPresenter.aidl",
"core/java/android/content/rollback/IRollbackManager.aidl",
"core/java/android/database/IContentObserver.aidl",
"core/java/android/debug/IAdbManager.aidl",
"core/java/android/debug/IAdbTransport.aidl",
":libcamera_client_aidl",
":libcamera_client_framework_aidl",
"core/java/android/hardware/IConsumerIrService.aidl",
"core/java/android/hardware/ISerialManager.aidl",
"core/java/android/hardware/biometrics/IBiometricPromptReceiver.aidl",
"core/java/android/hardware/biometrics/IBiometricConfirmDeviceCredentialCallback.aidl",
"core/java/android/hardware/biometrics/IBiometricEnabledOnKeyguardCallback.aidl",
"core/java/android/hardware/biometrics/IBiometricService.aidl",
"core/java/android/hardware/biometrics/IBiometricServiceReceiver.aidl",
"core/java/android/hardware/biometrics/IBiometricServiceReceiverInternal.aidl",
"core/java/android/hardware/biometrics/IBiometricServiceLockoutResetCallback.aidl",
"core/java/android/hardware/display/IColorDisplayManager.aidl",
"core/java/android/hardware/display/IDisplayManager.aidl",
"core/java/android/hardware/display/IDisplayManagerCallback.aidl",
"core/java/android/hardware/display/IVirtualDisplayCallback.aidl",
"core/java/android/hardware/fingerprint/IFingerprintClientActiveCallback.aidl",
"core/java/android/hardware/face/IFaceService.aidl",
"core/java/android/hardware/face/IFaceServiceReceiver.aidl",
"core/java/android/hardware/fingerprint/IFingerprintService.aidl",
"core/java/android/hardware/fingerprint/IFingerprintServiceLockoutResetCallback.aidl",
"core/java/android/hardware/fingerprint/IFingerprintServiceReceiver.aidl",
"core/java/android/hardware/hdmi/IHdmiControlCallback.aidl",
"core/java/android/hardware/hdmi/IHdmiControlService.aidl",
@@ -167,6 +189,7 @@ java_defaults {
"core/java/android/hardware/input/IInputManager.aidl",
"core/java/android/hardware/input/IInputDevicesChangedListener.aidl",
"core/java/android/hardware/input/ITabletModeChangedListener.aidl",
"core/java/android/hardware/iris/IIrisService.aidl",
"core/java/android/hardware/location/IActivityRecognitionHardware.aidl",
"core/java/android/hardware/location/IActivityRecognitionHardwareClient.aidl",
"core/java/android/hardware/location/IActivityRecognitionHardwareSink.aidl",
@@ -186,8 +209,11 @@ java_defaults {
"core/java/android/hardware/radio/ITunerCallback.aidl",
"core/java/android/hardware/soundtrigger/IRecognitionStatusCallback.aidl",
"core/java/android/hardware/usb/IUsbManager.aidl",
"core/java/android/hardware/usb/IUsbSerialReader.aidl",
"core/java/android/net/ICaptivePortal.aidl",
"core/java/android/net/IConnectivityManager.aidl",
"core/java/android/hardware/ISensorPrivacyListener.aidl",
"core/java/android/hardware/ISensorPrivacyManager.aidl",
"core/java/android/net/IIpConnectivityMetrics.aidl",
"core/java/android/net/IEthernetManager.aidl",
"core/java/android/net/IEthernetServiceListener.aidl",
@@ -224,7 +250,6 @@ java_defaults {
"core/java/android/os/ICancellationSignal.aidl",
"core/java/android/os/IDeviceIdentifiersPolicyService.aidl",
"core/java/android/os/IDeviceIdleController.aidl",
"core/java/android/os/IDynamicAndroidService.aidl",
"core/java/android/os/IHardwarePropertiesManager.aidl",
":libincident_aidl",
"core/java/android/os/IMaintenanceActivityListener.aidl",
@@ -242,16 +267,23 @@ java_defaults {
":statsd_aidl",
"core/java/android/os/ISystemUpdateManager.aidl",
"core/java/android/os/IThermalEventListener.aidl",
"core/java/android/os/IThermalStatusListener.aidl",
"core/java/android/os/IThermalService.aidl",
"core/java/android/os/IUpdateLock.aidl",
"core/java/android/os/IUserManager.aidl",
":libvibrator_aidl",
"core/java/android/os/IVibratorService.aidl",
"core/java/android/os/image/IDynamicSystemService.aidl",
"core/java/android/os/storage/IStorageManager.aidl",
"core/java/android/os/storage/IStorageEventListener.aidl",
"core/java/android/os/storage/IStorageShutdownObserver.aidl",
"core/java/android/os/storage/IObbActionListener.aidl",
"core/java/android/permission/IPermissionController.aidl",
":keystore_aidl",
"core/java/android/security/keymaster/IKeyAttestationApplicationIdProvider.aidl",
"core/java/android/service/appprediction/IPredictionService.aidl",
"core/java/android/service/autofill/augmented/IAugmentedAutofillService.aidl",
"core/java/android/service/autofill/augmented/IFillCallback.aidl",
"core/java/android/service/autofill/IAutoFillService.aidl",
"core/java/android/service/autofill/IAutofillFieldClassificationService.aidl",
"core/java/android/service/autofill/IFillCallback.aidl",
@@ -259,6 +291,8 @@ java_defaults {
"core/java/android/service/carrier/ICarrierService.aidl",
"core/java/android/service/carrier/ICarrierMessagingCallback.aidl",
"core/java/android/service/carrier/ICarrierMessagingService.aidl",
"core/java/android/service/carrier/ICarrierMessagingClientService.aidl",
"core/java/android/service/contentsuggestions/IContentSuggestionsService.aidl",
"core/java/android/service/euicc/IDeleteSubscriptionCallback.aidl",
"core/java/android/service/euicc/IDownloadSubscriptionCallback.aidl",
"core/java/android/service/euicc/IEraseSubscriptionsCallback.aidl",
@@ -274,15 +308,20 @@ java_defaults {
"core/java/android/service/euicc/ISwitchToSubscriptionCallback.aidl",
"core/java/android/service/euicc/IUpdateSubscriptionNicknameCallback.aidl",
":gatekeeper_aidl",
"core/java/android/service/contentcapture/IContentCaptureService.aidl",
"core/java/android/service/contentcapture/IContentCaptureServiceCallback.aidl",
"core/java/android/service/notification/INotificationListener.aidl",
"core/java/android/service/notification/IStatusBarNotificationHolder.aidl",
"core/java/android/service/notification/IConditionListener.aidl",
"core/java/android/service/notification/IConditionProvider.aidl",
"core/java/android/service/settings/suggestions/ISuggestionService.aidl",
"core/java/android/service/sms/IFinancialSmsService.aidl",
"core/java/android/service/vr/IPersistentVrStateCallbacks.aidl",
"core/java/android/service/vr/IVrListener.aidl",
"core/java/android/service/vr/IVrManager.aidl",
"core/java/android/service/vr/IVrStateCallbacks.aidl",
"core/java/android/service/watchdog/IExplicitHealthCheckService.aidl",
"core/java/android/service/watchdog/PackageConfig.aidl",
"core/java/android/print/ILayoutResultCallback.aidl",
"core/java/android/print/IPrinterDiscoveryObserver.aidl",
"core/java/android/print/IPrintDocumentAdapter.aidl",
@@ -319,22 +358,27 @@ java_defaults {
"core/java/android/service/chooser/IChooserTargetResult.aidl",
"core/java/android/service/resolver/IResolverRankerService.aidl",
"core/java/android/service/resolver/IResolverRankerResult.aidl",
"core/java/android/service/textclassifier/ITextClassificationCallback.aidl",
"core/java/android/service/textclassifier/ITextClassifierCallback.aidl",
"core/java/android/service/textclassifier/ITextClassifierService.aidl",
"core/java/android/service/textclassifier/ITextLinksCallback.aidl",
"core/java/android/service/textclassifier/ITextSelectionCallback.aidl",
"core/java/android/service/attention/IAttentionService.aidl",
"core/java/android/service/attention/IAttentionCallback.aidl",
"core/java/android/view/accessibility/IAccessibilityInteractionConnection.aidl",
"core/java/android/view/accessibility/IAccessibilityInteractionConnectionCallback.aidl",
"core/java/android/view/accessibility/IAccessibilityManager.aidl",
"core/java/android/view/accessibility/IAccessibilityManagerClient.aidl",
"core/java/android/view/autofill/IAutoFillManager.aidl",
"core/java/android/view/autofill/IAutoFillManagerClient.aidl",
"core/java/android/view/autofill/IAugmentedAutofillManagerClient.aidl",
"core/java/android/view/autofill/IAutofillWindowPresenter.aidl",
"core/java/android/view/contentcapture/IContentCaptureDirectManager.aidl",
"core/java/android/view/contentcapture/IContentCaptureManager.aidl",
"core/java/android/view/IApplicationToken.aidl",
"core/java/android/view/IAppTransitionAnimationSpecsFuture.aidl",
"core/java/android/view/IDockedStackListener.aidl",
"core/java/android/view/IDisplayFoldListener.aidl",
"core/java/android/view/IGraphicsStats.aidl",
"core/java/android/view/IGraphicsStatsCallback.aidl",
"core/java/android/view/IInputMonitorHost.aidl",
"core/java/android/view/IInputFilter.aidl",
"core/java/android/view/IInputFilterHost.aidl",
"core/java/android/view/IOnKeyguardExitResult.aidl",
@@ -345,6 +389,7 @@ java_defaults {
"core/java/android/view/IRecentsAnimationRunner.aidl",
"core/java/android/view/IRemoteAnimationFinishedCallback.aidl",
"core/java/android/view/IRotationWatcher.aidl",
"core/java/android/view/ISystemGestureExclusionListener.aidl",
"core/java/android/view/IWallpaperVisibilityListener.aidl",
"core/java/android/view/IWindow.aidl",
"core/java/android/view/IWindowFocusObserver.aidl",
@@ -359,9 +404,11 @@ java_defaults {
"core/java/android/speech/tts/ITextToSpeechService.aidl",
"core/java/com/android/internal/app/IAppOpsActiveCallback.aidl",
"core/java/com/android/internal/app/IAppOpsCallback.aidl",
"core/java/com/android/internal/app/IAppOpsNotedCallback.aidl",
"core/java/com/android/internal/app/IAppOpsService.aidl",
"core/java/com/android/internal/app/IBatteryStats.aidl",
"core/java/com/android/internal/app/ISoundTriggerService.aidl",
"core/java/com/android/internal/app/IVoiceActionCheckCallback.aidl",
"core/java/com/android/internal/app/IVoiceInteractionManagerService.aidl",
"core/java/com/android/internal/app/IVoiceInteractionSessionListener.aidl",
"core/java/com/android/internal/app/IVoiceInteractionSessionShowCallback.aidl",
@@ -375,6 +422,10 @@ java_defaults {
"core/java/com/android/internal/backup/IBackupTransport.aidl",
"core/java/com/android/internal/backup/IObbBackupService.aidl",
"core/java/com/android/internal/inputmethod/IInputContentUriToken.aidl",
"core/java/com/android/internal/inputmethod/IInputMethodPrivilegedOperations.aidl",
"core/java/com/android/internal/inputmethod/IMultiClientInputMethod.aidl",
"core/java/com/android/internal/inputmethod/IMultiClientInputMethodPrivilegedOperations.aidl",
"core/java/com/android/internal/inputmethod/IMultiClientInputMethodSession.aidl",
"core/java/com/android/internal/net/INetworkWatchlistManager.aidl",
"core/java/com/android/internal/policy/IKeyguardDrawnCallback.aidl",
"core/java/com/android/internal/policy/IKeyguardDismissCallback.aidl",
@@ -388,6 +439,7 @@ java_defaults {
"core/java/com/android/internal/os/IShellCallback.aidl",
"core/java/com/android/internal/statusbar/IStatusBar.aidl",
"core/java/com/android/internal/statusbar/IStatusBarService.aidl",
"core/java/com/android/internal/statusbar/RegisterStatusBarResult.aidl",
"core/java/com/android/internal/textservice/ISpellCheckerService.aidl",
"core/java/com/android/internal/textservice/ISpellCheckerServiceCallback.aidl",
"core/java/com/android/internal/textservice/ISpellCheckerSession.aidl",
@@ -413,7 +465,6 @@ java_defaults {
"location/java/android/location/IGeocodeProvider.aidl",
"location/java/android/location/IGeofenceProvider.aidl",
"location/java/android/location/IGnssStatusListener.aidl",
"location/java/android/location/IGnssStatusProvider.aidl",
"location/java/android/location/IGnssMeasurementsListener.aidl",
"location/java/android/location/IGnssNavigationMessageListener.aidl",
"location/java/android/location/ILocationListener.aidl",
@@ -422,6 +473,7 @@ java_defaults {
"location/java/android/location/IGpsGeofenceHardware.aidl",
"location/java/android/location/INetInitiatedListener.aidl",
"location/java/com/android/internal/location/ILocationProvider.aidl",
"location/java/com/android/internal/location/ILocationProviderManager.aidl",
"media/java/android/media/IAudioFocusDispatcher.aidl",
"media/java/android/media/IAudioRoutesObserver.aidl",
"media/java/android/media/IAudioService.aidl",
@@ -434,7 +486,6 @@ java_defaults {
"media/java/android/media/IMediaScannerListener.aidl",
"media/java/android/media/IMediaScannerService.aidl",
"media/java/android/media/IPlaybackConfigDispatcher.aidl",
"media/java/android/media/ISessionTokensListener.aidl",
":libaudioclient_aidl",
"media/java/android/media/IRecordingConfigDispatcher.aidl",
"media/java/android/media/IRemoteDisplayCallback.aidl",
@@ -458,6 +509,7 @@ java_defaults {
"media/java/android/media/session/IOnMediaKeyListener.aidl",
"media/java/android/media/session/IOnVolumeKeyLongPressListener.aidl",
"media/java/android/media/session/ISession.aidl",
"media/java/android/media/session/ISession2TokensListener.aidl",
"media/java/android/media/session/ISessionCallback.aidl",
"media/java/android/media/session/ISessionController.aidl",
"media/java/android/media/session/ISessionControllerCallback.aidl",
@@ -519,6 +571,7 @@ java_defaults {
"telephony/java/android/telephony/mbms/vendor/IMbmsStreamingService.aidl",
"telephony/java/android/telephony/mbms/vendor/IMbmsGroupCallService.aidl",
"telephony/java/android/telephony/ICellInfoCallback.aidl",
"telephony/java/android/telephony/IFinancialSmsCallback.aidl",
"telephony/java/android/telephony/INetworkService.aidl",
"telephony/java/android/telephony/INetworkServiceCallback.aidl",
"telephony/java/com/android/ims/internal/IImsCallSession.aidl",
@@ -587,8 +640,12 @@ java_defaults {
"telephony/java/com/android/internal/telephony/euicc/ISetDefaultSmdpAddressCallback.aidl",
"telephony/java/com/android/internal/telephony/euicc/ISetNicknameCallback.aidl",
"telephony/java/com/android/internal/telephony/euicc/ISwitchToProfileCallback.aidl",
"wifi/java/android/net/wifi/INetworkRequestMatchCallback.aidl",
"wifi/java/android/net/wifi/INetworkRequestUserSelectionCallback.aidl",
"wifi/java/android/net/wifi/ISoftApCallback.aidl",
"wifi/java/android/net/wifi/ITrafficStateCallback.aidl",
"wifi/java/android/net/wifi/IWifiManager.aidl",
"wifi/java/android/net/wifi/IOnWifiUsabilityStatsListener.aidl",
"wifi/java/android/net/wifi/aware/IWifiAwareDiscoverySessionCallback.aidl",
"wifi/java/android/net/wifi/aware/IWifiAwareEventCallback.aidl",
"wifi/java/android/net/wifi/aware/IWifiAwareMacAddressProvider.aidl",
@@ -597,6 +654,7 @@ java_defaults {
"wifi/java/android/net/wifi/rtt/IRttCallback.aidl",
"wifi/java/android/net/wifi/rtt/IWifiRttManager.aidl",
"wifi/java/android/net/wifi/hotspot2/IProvisioningCallback.aidl",
"wifi/java/android/net/wifi/IDppCallback.aidl",
"wifi/java/android/net/wifi/IWifiScanner.aidl",
"packages/services/PacProcessor/com/android/net/IProxyService.aidl",
"packages/services/Proxy/com/android/net/IProxyCallback.aidl",
@@ -611,6 +669,7 @@ java_defaults {
":gsiservice_aidl",
":installd_aidl",
":dumpstate_aidl",
":incidentcompanion_aidl",
"lowpan/java/android/net/lowpan/ILowpanEnergyScanCallback.aidl",
"lowpan/java/android/net/lowpan/ILowpanNetScanCallback.aidl",
@@ -630,6 +689,7 @@ java_defaults {
"core/java/com/android/server/DropboxLogTags.logtags",
"core/java/org/chromium/arc/EventLogTags.logtags",
":apex-properties",
":platform-properties",
":framework-statslog-gen",
@@ -643,6 +703,7 @@ java_defaults {
"location/java",
"lowpan/java",
"media/java",
"media/apex/java",
"media/mca/effect/java",
"media/mca/filterfw/java",
"media/mca/filterpacks/java",
@@ -660,9 +721,11 @@ java_defaults {
"system/update_engine/binder_bindings",
"frameworks/native/aidl/binder",
"frameworks/native/cmds/dumpstate/binder",
"frameworks/native/libs/incidentcompanion/binder",
"frameworks/av/camera/aidl",
"frameworks/av/media/libaudioclient/aidl",
"frameworks/native/aidl/gui",
"frameworks/native/libs/incidentcompanion/binder",
"system/core/gatekeeperd/binder",
"system/core/storaged/binder",
"system/vold/binder",
@@ -682,6 +745,7 @@ java_defaults {
sdk_version: "core_platform",
libs: [
"ext",
"updatable_media_stubs",
],
jarjar_rules: ":framework-jarjar-rules",
@@ -692,6 +756,7 @@ java_defaults {
"framework-protos",
"game-driver-protos",
"android.hidl.base-V1.0-java",
"android.hardware.cas-V1.1-java",
"android.hardware.cas-V1.0-java",
"android.hardware.contexthub-V1.0-java",
"android.hardware.health-V1.0-java-constants",
@@ -701,21 +766,25 @@ java_defaults {
"android.hardware.radio-V1.3-java",
"android.hardware.radio-V1.4-java",
"android.hardware.thermal-V1.0-java-constants",
"android.hardware.thermal-V1.0-java",
"android.hardware.thermal-V1.1-java",
"android.hardware.thermal-V2.0-java",
"android.hardware.tv.input-V1.0-java-constants",
"android.hardware.usb-V1.0-java-constants",
"android.hardware.usb-V1.1-java-constants",
"android.hardware.usb-V1.2-java-constants",
"android.hardware.usb.gadget-V1.0-java",
"android.hardware.vibrator-V1.0-java",
"android.hardware.vibrator-V1.1-java",
"android.hardware.vibrator-V1.2-java",
"android.hardware.vibrator-V1.3-java",
"android.hardware.wifi-V1.0-java-constants",
"devicepolicyprotosnano",
],
required: [
// TODO: remove gps_debug when the build system propagates "required" properly.
"gps_debug.conf",
// Loaded with System.loadLibrary by android.view.textclassifier
"libmedia2_jni",
],
dxflags: [
@@ -723,6 +792,7 @@ java_defaults {
"--multi-dex",
],
plugins: ["view-inspector-annotation-processor"],
}
filegroup {
@@ -744,6 +814,16 @@ filegroup {
srcs: [
"core/java/android/os/IStatsCompanionService.aidl",
"core/java/android/os/IStatsManager.aidl",
"core/java/android/os/IStatsPullerCallback.aidl",
],
path: "core/java",
}
filegroup {
name: "libvibrator_aidl",
srcs: [
"core/java/android/os/IExternalVibrationController.aidl",
"core/java/android/os/IExternalVibratorService.aidl",
],
path: "core/java",
}
@@ -887,9 +967,9 @@ java_library_host {
name: "platformprotos",
srcs: [
"cmds/am/proto/instrumentation_data.proto",
"cmds/statsd/src/**/*.proto",
"core/proto/**/*.proto",
"libs/incident/proto/**/*.proto",
"cmds/statsd/src/**/*.proto",
],
proto: {
include_dirs: ["external/protobuf/src"],
@@ -908,7 +988,10 @@ java_library {
output_params: ["store_unknown_fields=true"],
include_dirs: ["external/protobuf/src"],
},
exclude_srcs: [
"core/proto/android/privacy.proto",
"core/proto/android/section.proto",
],
sdk_version: "current",
srcs: [
"core/proto/**/*.proto",
@@ -928,6 +1011,10 @@ java_library {
"core/proto/**/*.proto",
"libs/incident/proto/android/os/**/*.proto",
],
exclude_srcs: [
"core/proto/android/privacy.proto",
"core/proto/android/section.proto",
],
// Protos have lots of MissingOverride and similar.
errorprone: {
javacflags: ["-XepDisableAllChecks"],
@@ -935,9 +1022,9 @@ java_library {
}
// ==== c++ proto device library ==============================
cc_library {
name: "libplatformprotos",
host_supported: true,
cc_defaults {
name: "libplatformprotos-defaults",
proto: {
export_proto_headers: true,
include_dirs: ["external/protobuf/src"],
@@ -951,8 +1038,13 @@ cc_library {
srcs: [
"core/proto/**/*.proto",
"libs/incident/**/*.proto",
],
}
cc_library {
name: "libplatformprotos",
defaults: ["libplatformprotos-defaults"],
host_supported: true,
target: {
host: {
@@ -964,6 +1056,9 @@ cc_library {
proto: {
type: "lite",
},
shared_libs: [
"libprotobuf-cpp-lite",
],
shared: {
enabled: false,
},
@@ -971,6 +1066,55 @@ cc_library {
},
}
// This library is meant for vendor code that needs to output protobuf. It links
// against the static version of libprotobuf-cpp-lite, for which we can not guarantee
// binary compatibility.
cc_library {
name: "libplatformprotos-static",
defaults: ["libplatformprotos-defaults"],
host_supported: false,
// This is okay because this library is only built as a static library. The C++
// API is not guaranteed. The proto API is guaranteed to be stable via Metrics Council,
// but is not authorized to be used outside of debugging.
vendor_available: true,
target: {
android: {
proto: {
type: "lite",
},
static_libs: [
"libprotobuf-cpp-lite",
],
shared: {
enabled: false,
},
},
},
}
// This is the full proto version of libplatformprotos. It may only
// be used by test code that is not shipped on the device.
cc_library {
name: "libplatformprotos-test",
defaults: ["libplatformprotos-defaults"],
host_supported: false,
target: {
android: {
proto: {
type: "full",
},
shared: {
enabled: false,
},
},
},
}
gensrcs {
name: "gen-platform-proto-constants",
depfile: true,
@@ -1008,6 +1152,7 @@ gensrcs {
output_extension: "proto.h",
}
subdirs = [
"cmds/*",
"core/*",
@@ -1210,6 +1355,7 @@ stubs_defaults {
":opt-telephony-srcs",
":opt-net-voip-srcs",
":core_public_api_files",
":updatable-media-srcs-without-aidls",
"test-mock/src/**/*.java",
"test-runner/src/**/*.java",
],
@@ -1268,6 +1414,7 @@ stubs_defaults {
":opt-telephony-srcs",
":opt-net-voip-srcs",
":core_public_api_files",
":updatable-media-srcs-without-aidls",
],
srcs_lib: "framework",
srcs_lib_whitelist_dirs: frameworks_base_subdirs,
@@ -1450,7 +1597,7 @@ droiddoc {
],
proofread_file: "ds-docs-proofrerad.txt",
args: framework_docs_only_args +
" -toroot / -samplegroup Admin " +
" -toroot / -yamlV2 -metalavaApiSince -samplegroup Admin " +
" -samplegroup Background " +
" -samplegroup Connectivity " +
" -samplegroup Content " +
@@ -1710,6 +1857,26 @@ filegroup {
],
}
filegroup {
name: "framework-media-annotation-srcs",
srcs: [
"core/java/android/annotation/CallbackExecutor.java",
"core/java/android/annotation/CallSuper.java",
"core/java/android/annotation/DrawableRes.java",
"core/java/android/annotation/IntDef.java",
"core/java/android/annotation/LongDef.java",
"core/java/android/annotation/NonNull.java",
"core/java/android/annotation/Nullable.java",
"core/java/android/annotation/RequiresPermission.java",
"core/java/android/annotation/SdkConstant.java",
"core/java/android/annotation/StringDef.java",
"core/java/android/annotation/SystemApi.java",
"core/java/android/annotation/TestApi.java",
"core/java/android/annotation/UnsupportedAppUsage.java",
"core/java/com/android/internal/annotations/GuardedBy.java",
],
}
// Creates an index of AIDL methods; used for adding UnsupportedAppUsage
// annotations to private apis
aidl_mapping {

View File

@@ -248,8 +248,11 @@ $(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/framework/com.android.mediad
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/framework/com.android.location.provider.jar)
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/framework/com.android.future.usb.accessory.jar)
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/framework/com.android.media.remotedisplay.jar)
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/media/audio)
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/priv-app/SystemUI)
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/media/audio)
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/priv-app/DynamicAndroidInstallationService)
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/priv-app/DefaultContainerService)
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/app/CaptivePortalLogin)
# ******************************************************************
# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST ABOVE THIS BANNER
# ******************************************************************

View File

@@ -9,6 +9,8 @@ hidden_api_txt_checksorted_hook = ${REPO_ROOT}/frameworks/base/tools/hiddenapi/c
hidden_api_txt_exclude_hook = ${REPO_ROOT}/frameworks/base/tools/hiddenapi/exclude.sh ${PREUPLOAD_COMMIT} ${REPO_ROOT}
ktlint_hook = ${REPO_ROOT}/prebuilts/ktlint/ktlint.py -f ${PREUPLOAD_FILES}
owners_hook = ${REPO_ROOT}/frameworks/base/tools/aosp/aosp_sha.sh ${PREUPLOAD_COMMIT} "OWNERS$"
shell_hook = ${REPO_ROOT}/frameworks/base/tools/aosp/aosp_sha.sh ${PREUPLOAD_COMMIT} "^packages/Shell/"

View File

@@ -0,0 +1,26 @@
// Copyright (C) 2018 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.
android_test {
name: "AutofillPerfTests",
srcs: ["src/**/*.java"],
resource_dirs: ["res"],
static_libs: [
"androidx.test.rules",
"androidx.annotation_annotation",
"apct-perftests-utils",
],
platform_apis: true,
test_suites: ["device-tests"],
}

View File

@@ -0,0 +1,40 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2018 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.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.perftests.autofill">
<application>
<uses-library android:name="android.test.runner" />
<activity android:name="android.perftests.utils.StubActivity">
<intent-filter>
<action android:name="com.android.perftests.core.PERFTEST" />
</intent-filter>
</activity>
<service
android:name="android.view.autofill.MyAutofillService"
android:label="PERF AutofillService"
android:permission="android.permission.BIND_AUTOFILL_SERVICE" >
<intent-filter>
<action android:name="android.service.autofill.AutofillService" />
</intent-filter>
</service>
</application>
<instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
android:targetPackage="com.android.perftests.autofill"/>
</manifest>

View File

@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2018 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.
-->
<configuration description="Runs AutofillPerfTests metric instrumentation.">
<option name="test-suite-tag" value="apct" />
<option name="test-suite-tag" value="apct-metric-instrumentation" />
<target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
<option name="cleanup-apks" value="true" />
<option name="test-file-name" value="AutofillPerfTests.apk" />
</target_preparer>
<test class="com.android.tradefed.testtype.AndroidJUnitTest" >
<option name="package" value="com.android.perftests.autofill" />
<option name="hidden-api-checks" value="false"/>
</test>
</configuration>

View File

@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?><!--
* Copyright (C) 2018 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.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>

View File

@@ -0,0 +1,94 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
* Copyright (C) 2018 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.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:focusable="true"
android:focusableInTouchMode="true"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/username_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:id="@+id/username_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Username" />
<EditText
android:id="@+id/username"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:imeOptions="flagNoFullscreen" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:id="@+id/password_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Password" />
<EditText
android:id="@+id/password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPassword"
android:imeOptions="flagNoFullscreen" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<Button
android:id="@+id/login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Login" />
<Button
android:id="@+id/cancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Cancel" />
</LinearLayout>
<TextView
android:id="@+id/output"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>

View File

@@ -0,0 +1,114 @@
/*
* Copyright (C) 2018 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 android.view.autofill;
import static org.junit.Assert.assertTrue;
import android.os.Looper;
import android.perftests.utils.PerfStatusReporter;
import android.perftests.utils.SettingsHelper;
import android.perftests.utils.SettingsStateKeeperRule;
import android.perftests.utils.StubActivity;
import android.provider.Settings;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.LargeTest;
import androidx.test.rule.ActivityTestRule;
import org.junit.After;
import org.junit.Before;
import org.junit.ClassRule;
import org.junit.Rule;
/**
* Base class for all autofill tests.
*/
@LargeTest
public abstract class AbstractAutofillPerfTestCase {
@ClassRule
public static final SettingsStateKeeperRule mServiceSettingsKeeper =
new SettingsStateKeeperRule(InstrumentationRegistry.getTargetContext(),
Settings.Secure.AUTOFILL_SERVICE);
@Rule
public ActivityTestRule<StubActivity> mActivityRule =
new ActivityTestRule<StubActivity>(StubActivity.class);
@Rule
public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter();
private final int mLayoutId;
protected AbstractAutofillPerfTestCase(int layoutId) {
mLayoutId = layoutId;
}
/**
* Prepares the activity so that by the time the test is run it has reference to its fields.
*/
@Before
public void prepareActivity() throws Throwable {
mActivityRule.runOnUiThread(() -> {
assertTrue("We should be running on the main thread",
Looper.getMainLooper().getThread() == Thread.currentThread());
assertTrue("We should be running on the main thread",
Looper.myLooper() == Looper.getMainLooper());
StubActivity activity = mActivityRule.getActivity();
activity.setContentView(mLayoutId);
onCreate(activity);
});
}
@Before
public void enableService() {
MyAutofillService.resetStaticState();
MyAutofillService.setEnabled(true);
}
@After
public void disableService() {
// Must disable service so calls are ignored in case of errors during the test case;
// otherwise, other tests will fail because these calls are made in the UI thread (as both
// the service, the tests, and the app run in the same process).
MyAutofillService.setEnabled(false);
}
/**
* Initializes the {@link StubActivity} after it was launched.
*/
protected abstract void onCreate(StubActivity activity);
/**
* Uses the {@code settings} binary to set the autofill service.
*/
protected void setService() {
SettingsHelper.syncSet(InstrumentationRegistry.getTargetContext(),
SettingsHelper.NAMESPACE_SECURE,
Settings.Secure.AUTOFILL_SERVICE,
MyAutofillService.COMPONENT_NAME);
}
/**
* Uses the {@code settings} binary to reset the autofill service.
*/
protected void resetService() {
SettingsHelper.syncDelete(InstrumentationRegistry.getTargetContext(),
SettingsHelper.NAMESPACE_SECURE,
Settings.Secure.AUTOFILL_SERVICE);
}
}

View File

@@ -0,0 +1,302 @@
/*
* Copyright (C) 2018 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 android.view.autofill;
import static android.view.autofill.AutofillManager.AutofillCallback.EVENT_INPUT_HIDDEN;
import static android.view.autofill.AutofillManager.AutofillCallback.EVENT_INPUT_SHOWN;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.StubActivity;
import android.view.View;
import android.widget.EditText;
import com.android.perftests.autofill.R;
import org.junit.Test;
public class LoginTest extends AbstractAutofillPerfTestCase {
private EditText mUsername;
private EditText mPassword;
private AutofillManager mAfm;
public LoginTest() {
super(R.layout.test_autofill_login);
}
@Override
protected void onCreate(StubActivity activity) {
View root = activity.getWindow().getDecorView();
mUsername = root.findViewById(R.id.username);
mPassword = root.findViewById(R.id.password);
mAfm = activity.getSystemService(AutofillManager.class);
}
/**
* This is the baseline test for focusing the 2 views when autofill is disabled.
*/
@Test
public void testFocus_noService() throws Throwable {
resetService();
mActivityRule.runOnUiThread(() -> {
BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
while (state.keepRunning()) {
mUsername.requestFocus();
mPassword.requestFocus();
}
});
}
/**
* This time the service is called, but it returns a {@code null} response so the UI behaves
* as if autofill was disabled.
*/
@Test
public void testFocus_serviceDoesNotAutofill() throws Throwable {
MyAutofillService.newCannedResponse().reply();
setService();
// Must first focus in a field to trigger autofill and wait for service response
// outside the loop
mActivityRule.runOnUiThread(() -> mUsername.requestFocus());
MyAutofillService.getLastFillRequest();
// Then focus on password so loop start with focus away from username
mActivityRule.runOnUiThread(() -> mPassword.requestFocus());
mActivityRule.runOnUiThread(() -> {
BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
while (state.keepRunning()) {
mUsername.requestFocus();
mPassword.requestFocus();
}
});
}
/**
* Now the service returns autofill data, for both username and password.
*/
@Test
public void testFocus_autofillBothFields() throws Throwable {
MyAutofillService.newCannedResponse()
.setUsername(mUsername.getAutofillId(), "user")
.setPassword(mPassword.getAutofillId(), "pass")
.reply();
setService();
// Callback is used to slow down the calls made to the autofill server so the
// app is not crashed due to binder exhaustion. But the time spent waiting for the callbacks
// is not measured here...
MyAutofillCallback callback = new MyAutofillCallback();
mAfm.registerCallback(callback);
// Must first trigger autofill and wait for service response outside the loop
mActivityRule.runOnUiThread(() -> mUsername.requestFocus());
MyAutofillService.getLastFillRequest();
callback.expectEvent(mUsername, EVENT_INPUT_SHOWN);
// Then focus on password so loop start with focus away from username
mActivityRule.runOnUiThread(() -> mPassword.requestFocus());
callback.expectEvent(mUsername, EVENT_INPUT_HIDDEN);
callback.expectEvent(mPassword, EVENT_INPUT_SHOWN);
// NOTE: we cannot run the whole loop inside the UI thread, because the autofill callback
// is called on it, which would cause a deadlock on expectEvent().
try {
BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
while (state.keepRunning()) {
mActivityRule.runOnUiThread(() -> mUsername.requestFocus());
state.pauseTiming(); // Ignore time spent waiting for callbacks
callback.expectEvent(mPassword, EVENT_INPUT_HIDDEN);
callback.expectEvent(mUsername, EVENT_INPUT_SHOWN);
state.resumeTiming();
mActivityRule.runOnUiThread(() -> mPassword.requestFocus());
state.pauseTiming(); // Ignore time spent waiting for callbacks
callback.expectEvent(mUsername, EVENT_INPUT_HIDDEN);
callback.expectEvent(mPassword, EVENT_INPUT_SHOWN);
state.resumeTiming();
}
// Sanity check
callback.assertNoAsyncErrors();
} finally {
mAfm.unregisterCallback(callback);
}
}
/**
* Now the service returns autofill data, but just for username.
*/
@Test
public void testFocus_autofillUsernameOnly() throws Throwable {
// Must set ignored ids so focus on password does not trigger new requests
MyAutofillService.newCannedResponse()
.setUsername(mUsername.getAutofillId(), "user")
.setIgnored(mPassword.getAutofillId())
.reply();
setService();
// Callback is used to slow down the calls made to the autofill server so the
// app is not crashed due to binder exhaustion. But the time spent waiting for the callbacks
// is not measured here...
MyAutofillCallback callback = new MyAutofillCallback();
mAfm.registerCallback(callback);
// Must first trigger autofill and wait for service response outside the loop
mActivityRule.runOnUiThread(() -> mUsername.requestFocus());
MyAutofillService.getLastFillRequest();
callback.expectEvent(mUsername, EVENT_INPUT_SHOWN);
// Then focus on password so loop start with focus away from username
mActivityRule.runOnUiThread(() -> mPassword.requestFocus());
callback.expectEvent(mUsername, EVENT_INPUT_HIDDEN);
// NOTE: we cannot run the whole loop inside the UI thread, because the autofill callback
// is called on it, which would cause a deadlock on expectEvent().
try {
BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
while (state.keepRunning()) {
mActivityRule.runOnUiThread(() -> mUsername.requestFocus());
state.pauseTiming(); // Ignore time spent waiting for callbacks
callback.expectEvent(mUsername, EVENT_INPUT_SHOWN);
state.resumeTiming();
mActivityRule.runOnUiThread(() -> mPassword.requestFocus());
state.pauseTiming(); // Ignore time spent waiting for callbacks
callback.expectEvent(mUsername, EVENT_INPUT_HIDDEN);
state.resumeTiming();
}
// Sanity check
callback.assertNoAsyncErrors();
} finally {
mAfm.unregisterCallback(callback);
}
}
/**
* This is the baseline test for changing the 2 views when autofill is disabled.
*/
@Test
public void testChange_noService() throws Throwable {
resetService();
changeTest(false);
}
/**
* This time the service is called, but it returns a {@code null} response so the UI behaves
* as if autofill was disabled.
*/
@Test
public void testChange_serviceDoesNotAutofill() throws Throwable {
MyAutofillService.newCannedResponse().reply();
setService();
changeTest(true);
}
/**
* Now the service returns autofill data, for both username and password.
*/
@Test
public void testChange_autofillBothFields() throws Throwable {
MyAutofillService.newCannedResponse()
.setUsername(mUsername.getAutofillId(), "user")
.setPassword(mPassword.getAutofillId(), "pass")
.reply();
setService();
changeTest(true);
}
/**
* Now the service returns autofill data, but just for username.
*/
@Test
public void testChange_autofillUsernameOnly() throws Throwable {
// Must set ignored ids so focus on password does not trigger new requests
MyAutofillService.newCannedResponse()
.setUsername(mUsername.getAutofillId(), "user")
.setIgnored(mPassword.getAutofillId())
.reply();
setService();
changeTest(true);
}
private void changeTest(boolean waitForService) throws Throwable {
// Must first focus in a field to trigger autofill and wait for service response
// outside the loop
mActivityRule.runOnUiThread(() -> mUsername.requestFocus());
if (waitForService) {
MyAutofillService.getLastFillRequest();
}
mActivityRule.runOnUiThread(() -> {
BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
while (state.keepRunning()) {
mUsername.setText("");
mUsername.setText("a");
mPassword.setText("");
mPassword.setText("x");
}
});
}
@Test
public void testCallbacks() throws Throwable {
MyAutofillService.newCannedResponse()
.setUsername(mUsername.getAutofillId(), "user")
.setPassword(mPassword.getAutofillId(), "pass")
.reply();
setService();
MyAutofillCallback callback = new MyAutofillCallback();
mAfm.registerCallback(callback);
// Must first focus in a field to trigger autofill and wait for service response
// outside the loop
mActivityRule.runOnUiThread(() -> mUsername.requestFocus());
MyAutofillService.getLastFillRequest();
callback.expectEvent(mUsername, EVENT_INPUT_SHOWN);
// Now focus on password to prepare loop state
mActivityRule.runOnUiThread(() -> mPassword.requestFocus());
callback.expectEvent(mUsername, EVENT_INPUT_HIDDEN);
callback.expectEvent(mPassword, EVENT_INPUT_SHOWN);
// NOTE: we cannot run the whole loop inside the UI thread, because the autofill callback
// is called on it, which would cause a deadlock on expectEvent().
try {
BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
while (state.keepRunning()) {
mActivityRule.runOnUiThread(() -> mUsername.requestFocus());
callback.expectEvent(mPassword, EVENT_INPUT_HIDDEN);
callback.expectEvent(mUsername, EVENT_INPUT_SHOWN);
mActivityRule.runOnUiThread(() -> mPassword.requestFocus());
callback.expectEvent(mUsername, EVENT_INPUT_HIDDEN);
callback.expectEvent(mPassword, EVENT_INPUT_SHOWN);
}
// Sanity check
callback.assertNoAsyncErrors();
} finally {
mAfm.unregisterCallback(callback);
}
}
}

View File

@@ -0,0 +1,127 @@
/*
* Copyright (C) 2018 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 android.view.autofill;
import android.view.View;
import android.view.autofill.AutofillManager.AutofillCallback;
import androidx.annotation.NonNull;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
import static android.view.autofill.AutofillManager.AutofillCallback.EVENT_INPUT_HIDDEN;
import static android.view.autofill.AutofillManager.AutofillCallback.EVENT_INPUT_SHOWN;
import static android.view.autofill.AutofillManager.AutofillCallback.EVENT_INPUT_UNAVAILABLE;
import android.os.CancellationSignal;
import android.service.autofill.FillCallback;
import android.service.autofill.FillRequest;
import android.util.Log;
/**
* Custom {@link AutofillCallback} used to recover events during tests.
*/
public final class MyAutofillCallback extends AutofillCallback {
private static final String TAG = "MyAutofillCallback";
private static final int TIMEOUT_MS = 5000;
private final BlockingQueue<MyEvent> mEvents = new LinkedBlockingQueue<>(2);
private final List<String> mAsyncErrors = new ArrayList<>();
@Override
public void onAutofillEvent(View view, int event) {
boolean offered = false;
try {
offered = mEvents.offer(new MyEvent(view, event), TIMEOUT_MS, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
if (!offered) {
String error = "could not offer " + toString(view, event) + " in " + TIMEOUT_MS + "ms";
Log.e(TAG, error);
mAsyncErrors.add(error);
}
}
/**
* Asserts the callback is called for the given view and event, or fail if it times out.
*/
public void expectEvent(@NonNull View view, int event) {
MyEvent myEvent;
try {
myEvent = mEvents.poll(TIMEOUT_MS, TimeUnit.MILLISECONDS);
if (myEvent == null) {
throw new IllegalStateException("no event received in " + TIMEOUT_MS
+ "ms while waiting for " + toString(view, event));
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new IllegalStateException("interrupted waiting for " + toString(view, event));
}
if (!myEvent.view.equals(view) || myEvent.event != event) {
throw new AssertionError("Invalid event: expected " + myEvent + ", got "
+ toString(view, event));
}
}
/**
* Throws an exception if an error happened asynchronously while handing
* {@link #onAutofillEvent(View, int)}.
*/
public void assertNoAsyncErrors() {
if (!mAsyncErrors.isEmpty()) {
throw new IllegalStateException(mAsyncErrors.size() + " errors: " + mAsyncErrors);
}
}
private static String eventToString(int event) {
switch (event) {
case EVENT_INPUT_HIDDEN:
return "HIDDEN";
case EVENT_INPUT_SHOWN:
return "SHOWN";
case EVENT_INPUT_UNAVAILABLE:
return "UNAVAILABLE";
default:
throw new IllegalArgumentException("invalid event: " + event);
}
}
private static String toString(View view, int event) {
return eventToString(event) + ": " + view + ")";
}
private static final class MyEvent {
public final View view;
public final int event;
MyEvent(View view, int event) {
this.view = view;
this.event = event;
}
@Override
public String toString() {
return MyAutofillCallback.toString(view, event);
}
}
}

View File

@@ -0,0 +1,219 @@
/*
* Copyright (C) 2018 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 android.view.autofill;
import android.os.CancellationSignal;
import android.service.autofill.AutofillService;
import android.service.autofill.Dataset;
import android.service.autofill.FillCallback;
import android.service.autofill.FillRequest;
import android.service.autofill.FillResponse;
import android.service.autofill.SaveCallback;
import android.service.autofill.SaveRequest;
import android.util.Log;
import android.util.Pair;
import android.widget.RemoteViews;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.android.perftests.autofill.R;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
/**
* An {@link AutofillService} implementation whose replies can be programmed by the test case.
*/
public class MyAutofillService extends AutofillService {
private static final String TAG = "MyAutofillService";
private static final int TIMEOUT_MS = 5000;
private static final String PACKAGE_NAME = "com.android.perftests.autofill";
static final String COMPONENT_NAME = PACKAGE_NAME + "/android.view.autofill.MyAutofillService";
private static final BlockingQueue<FillRequest> sFillRequests = new LinkedBlockingQueue<>();
private static final BlockingQueue<CannedResponse> sCannedResponses =
new LinkedBlockingQueue<>();
private static boolean sEnabled;
/**
* Resets the static state associated with the service.
*/
static void resetStaticState() {
sFillRequests.clear();
sCannedResponses.clear();
sEnabled = false;
}
/**
* Sets whether the service is enabled or not - when disabled, calls to
* {@link #onFillRequest(FillRequest, CancellationSignal, FillCallback)} will be ignored.
*/
static void setEnabled(boolean enabled) {
sEnabled = enabled;
}
/**
* Gets the the last {@link FillRequest} passed to
* {@link #onFillRequest(FillRequest, CancellationSignal, FillCallback)} or throws an
* exception if that method was not called.
*/
@NonNull
static FillRequest getLastFillRequest() {
FillRequest request = null;
try {
request = sFillRequests.poll(TIMEOUT_MS, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new IllegalStateException("onFillRequest() interrupted");
}
if (request == null) {
throw new IllegalStateException("onFillRequest() not called in " + TIMEOUT_MS + "ms");
}
return request;
}
@Override
public void onFillRequest(FillRequest request, CancellationSignal cancellationSignal,
FillCallback callback) {
try {
handleRequest(request, callback);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
onError("onFillRequest() interrupted", e, callback);
} catch (Exception e) {
onError("exception on onFillRequest()", e, callback);
}
}
private void handleRequest(FillRequest request, FillCallback callback) throws Exception {
if (!sEnabled) {
onError("ignoring onFillRequest(): service is disabled", callback);
return;
}
CannedResponse response = sCannedResponses.poll(TIMEOUT_MS, TimeUnit.MILLISECONDS);
if (response == null) {
onError("ignoring onFillRequest(): response not set", callback);
return;
}
Dataset.Builder dataset = new Dataset.Builder(newDatasetPresentation("dataset"));
boolean hasData = false;
if (response.mUsername != null) {
hasData = true;
dataset.setValue(response.mUsername.first,
AutofillValue.forText(response.mUsername.second));
}
if (response.mPassword != null) {
hasData = true;
dataset.setValue(response.mPassword.first,
AutofillValue.forText(response.mPassword.second));
}
if (hasData) {
FillResponse.Builder fillResponse = new FillResponse.Builder();
if (response.mIgnoredIds != null) {
fillResponse.setIgnoredIds(response.mIgnoredIds);
}
callback.onSuccess(fillResponse.addDataset(dataset.build()).build());
} else {
callback.onSuccess(null);
}
if (!sFillRequests.offer(request, TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
Log.w(TAG, "could not offer request in " + TIMEOUT_MS + "ms");
}
}
@Override
public void onSaveRequest(SaveRequest request, SaveCallback callback) {
// No current test should have triggered it...
Log.e(TAG, "onSaveRequest() should not have been called");
callback.onFailure("onSaveRequest() should not have been called");
}
static final class CannedResponse {
private final Pair<AutofillId, String> mUsername;
private final Pair<AutofillId, String> mPassword;
private final AutofillId[] mIgnoredIds;
private CannedResponse(@NonNull Builder builder) {
mUsername = builder.mUsername;
mPassword = builder.mPassword;
mIgnoredIds = builder.mIgnoredIds;
}
static class Builder {
private Pair<AutofillId, String> mUsername;
private Pair<AutofillId, String> mPassword;
private AutofillId[] mIgnoredIds;
@NonNull
Builder setUsername(@NonNull AutofillId id, @NonNull String value) {
mUsername = new Pair<>(id, value);
return this;
}
@NonNull
Builder setPassword(@NonNull AutofillId id, @NonNull String value) {
mPassword = new Pair<>(id, value);
return this;
}
@NonNull
Builder setIgnored(AutofillId... ids) {
mIgnoredIds = ids;
return this;
}
void reply() {
sCannedResponses.add(new CannedResponse(this));
}
}
}
/**
* Sets the expected canned {@link FillResponse} for the next
* {@link AutofillService#onFillRequest(FillRequest, CancellationSignal, FillCallback)}.
*/
static CannedResponse.Builder newCannedResponse() {
return new CannedResponse.Builder();
}
private void onError(@NonNull String msg, @NonNull FillCallback callback) {
Log.e(TAG, msg);
callback.onFailure(msg);
}
private void onError(@NonNull String msg, @NonNull Exception e,
@NonNull FillCallback callback) {
Log.e(TAG, msg, e);
callback.onFailure(msg);
}
@NonNull
private static RemoteViews newDatasetPresentation(@NonNull CharSequence text) {
RemoteViews presentation =
new RemoteViews(PACKAGE_NAME, R.layout.autofill_dataset_picker_text_only);
presentation.setTextViewText(R.id.text, text);
return presentation;
}
}

View File

@@ -9,7 +9,8 @@ LOCAL_SRC_FILES := \
src/android/os/ISomeService.aidl
LOCAL_STATIC_JAVA_LIBRARIES := \
android-support-test \
androidx.test.rules \
androidx.annotation_annotation \
apct-perftests-utils \
guava

View File

@@ -16,9 +16,19 @@
</intent-filter>
</activity>
<service android:name="android.os.SomeService" android:exported="false" android:process=":some_service" />
<service
android:name="android.view.autofill.MyAutofillService"
android:label="PERF AutofillService"
android:permission="android.permission.BIND_AUTOFILL_SERVICE" >
<intent-filter>
<action android:name="android.service.autofill.AutofillService" />
</intent-filter>
</service>
</application>
<instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
<instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
android:targetPackage="com.android.perftests.core"/>
</manifest>

View File

@@ -23,10 +23,10 @@ import android.content.Context;
import android.content.pm.PackageManager;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.LargeTest;
import android.support.test.runner.AndroidJUnit4;
import android.util.Log;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.LargeTest;
import androidx.test.runner.AndroidJUnit4;
import org.junit.Rule;
import org.junit.Test;

View File

@@ -21,9 +21,10 @@ import android.content.Intent;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.perftests.utils.StubActivity;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.LargeTest;
import android.support.test.runner.AndroidJUnit4;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.LargeTest;
import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Rule;
@@ -33,7 +34,6 @@ import org.junit.runner.RunWith;
// Due to b/71353150, you might get "java.lang.AssertionError: Binder ProxyMap has too many
// entries", but it's flaky. Adding "Runtime.getRuntime().gc()" between each iteration solves
// the problem, but it doesn't seem like it's currently needed.
@RunWith(AndroidJUnit4.class)
@LargeTest
public class PendingIntentPerfTest {

View File

@@ -0,0 +1,108 @@
/*
* Copyright (C) 2018 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 android.app;
import static org.junit.Assert.fail;
import android.content.res.AssetManager;
import android.content.res.Resources;
import android.content.res.XmlResourceParser;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import androidx.test.filters.LargeTest;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
/**
* Benchmarks for {@link android.content.res.Resources}.
*/
@LargeTest
public class ResourcesPerfTest {
@Rule
public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter();
private AssetManager mAsset;
private Resources mRes;
private int mTextId;
private int mColorId;
private int mIntegerId;
private int mLayoutId;
@Before
public void setUp() {
mAsset = new AssetManager();
mAsset.addAssetPath("/system/framework/framework-res.apk");
mRes = new Resources(mAsset, null, null);
mTextId = mRes.getIdentifier("cancel", "string", "android");
mColorId = mRes.getIdentifier("transparent", "color", "android");
mIntegerId = mRes.getIdentifier("config_shortAnimTime", "integer", "android");
mLayoutId = mRes.getIdentifier("two_line_list_item", "layout", "android");
}
@After
public void tearDown() {
mAsset.close();
}
@Test
public void getText() {
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
while (state.keepRunning()) {
mRes.getText(mTextId);
}
}
@Test
public void getColor() {
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
while (state.keepRunning()) {
mRes.getColor(mColorId, null);
}
}
@Test
public void getInteger() {
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
while (state.keepRunning()) {
mRes.getInteger(mIntegerId);
}
}
@Test
public void getLayoutAndTravese() {
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
while (state.keepRunning()) {
try (XmlResourceParser parser = mRes.getLayout(mLayoutId)) {
while (parser.next() != XmlPullParser.END_DOCUMENT) {
// Walk the entire tree
}
} catch (IOException | XmlPullParserException exception) {
fail("Parsing of the layout failed. Something is really broken");
}
}
}
}

View File

@@ -0,0 +1,55 @@
/*
* Copyright (C) 2018 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 android.app;
import android.content.Context;
import android.content.res.Resources;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.LargeTest;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
/**
* Benchmarks for {@link android.content.res.Resources.Theme}.
*/
@LargeTest
public class ResourcesThemePerfTest {
@Rule
public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter();
private Resources.Theme mTheme;
@Before
public void setUp() {
Context context = InstrumentationRegistry.getTargetContext();
mTheme = context.getTheme();
}
@Test
public void obtainStyledAttributesForViewFromMaterial() {
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
while (state.keepRunning()) {
mTheme.obtainStyledAttributes(android.R.style.Theme_Material, android.R.styleable.View);
}
}
}

View File

@@ -23,9 +23,10 @@ import android.database.sqlite.SQLiteCursor;
import android.database.sqlite.SQLiteDatabase;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.LargeTest;
import android.support.test.runner.AndroidJUnit4;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.LargeTest;
import androidx.test.runner.AndroidJUnit4;
import org.junit.AfterClass;
import org.junit.BeforeClass;

View File

@@ -16,17 +16,20 @@
package android.database;
import static org.junit.Assert.assertEquals;
import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.LargeTest;
import android.support.test.runner.AndroidJUnit4;
import android.util.ArrayMap;
import android.util.Log;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.LargeTest;
import androidx.test.runner.AndroidJUnit4;
import com.android.internal.util.Preconditions;
import org.junit.After;
@@ -40,8 +43,6 @@ import java.nio.file.Files;
import java.util.List;
import java.util.Map;
import static org.junit.Assert.assertEquals;
/**
* Performance tests for measuring amount of data written during typical DB operations
*

View File

@@ -16,14 +16,18 @@
package android.database;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.LargeTest;
import android.support.test.runner.AndroidJUnit4;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.LargeTest;
import androidx.test.runner.AndroidJUnit4;
import org.junit.After;
import org.junit.Before;
@@ -33,9 +37,6 @@ import org.junit.runner.RunWith;
import java.util.Random;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
/**
* Performance tests for typical CRUD operations and loading rows into the Cursor
*

View File

@@ -17,14 +17,15 @@
package android.graphics.perftests;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.Bitmap.Config;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RecordingCanvas;
import android.graphics.RenderNode;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.support.test.filters.LargeTest;
import android.view.DisplayListCanvas;
import android.view.RenderNode;
import androidx.test.filters.LargeTest;
import org.junit.Rule;
import org.junit.Test;
@@ -43,7 +44,7 @@ public class CanvasPerfTest {
RenderNode child = RenderNode.create("child", null);
child.setLeftTopRightBottom(50, 50, 100, 100);
DisplayListCanvas canvas = node.start(100, 100);
RecordingCanvas canvas = node.start(100, 100);
node.end(canvas);
canvas = child.start(50, 50);
canvas.drawColor(Color.WHITE);
@@ -70,7 +71,7 @@ public class CanvasPerfTest {
BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
RenderNode node = RenderNode.create("benchmark", null);
DisplayListCanvas canvas = node.start(100, 100);
RecordingCanvas canvas = node.start(100, 100);
node.end(canvas);
Bitmap bitmap = Bitmap.createBitmap(80, 80, Config.ARGB_8888);
Paint paint = new Paint();

View File

@@ -19,8 +19,8 @@ package android.graphics.perftests;
import android.graphics.Outline;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.support.test.filters.LargeTest;
import android.view.RenderNode;
import androidx.test.filters.LargeTest;
import org.junit.Rule;
import org.junit.Test;

View File

@@ -20,17 +20,18 @@ import android.graphics.Paint;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.perftests.utils.StubActivity;
import android.support.test.filters.LargeTest;
import android.support.test.rule.ActivityTestRule;
import java.util.Arrays;
import java.util.Collection;
import androidx.test.filters.LargeTest;
import androidx.test.rule.ActivityTestRule;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized.Parameters;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import java.util.Arrays;
import java.util.Collection;
@LargeTest
@RunWith(Parameterized.class)

View File

@@ -19,9 +19,10 @@ package android.graphics.perftests;
import android.graphics.Canvas;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.support.test.filters.LargeTest;
import android.text.TextPaint;
import androidx.test.filters.LargeTest;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;

View File

@@ -20,7 +20,8 @@ import android.graphics.Path;
import android.graphics.RectF;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.support.test.filters.LargeTest;
import androidx.test.filters.LargeTest;
import org.junit.Rule;
import org.junit.Test;

View File

@@ -17,17 +17,15 @@
package android.graphics.perftests;
import android.graphics.Outline;
import android.graphics.RenderNode;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.support.test.filters.LargeTest;
import android.view.DisplayListCanvas;
import android.view.RenderNode;
import androidx.test.filters.LargeTest;
import org.junit.Rule;
import org.junit.Test;
import java.util.ArrayList;
@LargeTest
public class RenderNodePerfTest {
@Rule
@@ -47,8 +45,7 @@ public class RenderNodePerfTest {
public void testCreateRenderNodeNoName() {
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
while (state.keepRunning()) {
RenderNode node = RenderNode.create(null, null);
node.destroy();
RenderNode.create(null, null);
}
}
@@ -56,8 +53,7 @@ public class RenderNodePerfTest {
public void testCreateRenderNode() {
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
while (state.keepRunning()) {
RenderNode node = RenderNode.create("LinearLayout", null);
node.destroy();
RenderNode.create("LinearLayout", null);
}
}
@@ -66,7 +62,7 @@ public class RenderNodePerfTest {
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
RenderNode node = RenderNode.create("LinearLayout", null);
while (state.keepRunning()) {
node.isValid();
node.hasDisplayList();
}
}
@@ -75,8 +71,8 @@ public class RenderNodePerfTest {
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
RenderNode node = RenderNode.create("LinearLayout", null);
while (state.keepRunning()) {
DisplayListCanvas canvas = node.start(100, 100);
node.end(canvas);
node.beginRecording(100, 100);
node.endRecording();
}
}
@@ -84,17 +80,16 @@ public class RenderNodePerfTest {
public void testStartEndDeepHierarchy() {
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
RenderNode[] nodes = new RenderNode[30];
DisplayListCanvas[] canvases = new DisplayListCanvas[nodes.length];
for (int i = 0; i < nodes.length; i++) {
nodes[i] = RenderNode.create("LinearLayout", null);
}
while (state.keepRunning()) {
for (int i = 0; i < nodes.length; i++) {
canvases[i] = nodes[i].start(100, 100);
nodes[i].beginRecording(100, 100);
}
for (int i = nodes.length - 1; i >= 0; i--) {
nodes[i].end(canvases[i]);
nodes[i].endRecording();
}
}
}

View File

@@ -18,12 +18,20 @@ package android.graphics.perftests;
import android.content.Context;
import android.content.res.AssetManager;
import android.content.res.Resources;
import android.graphics.Typeface;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.LargeTest;
import android.support.test.runner.AndroidJUnit4;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.LargeTest;
import androidx.test.runner.AndroidJUnit4;
import com.android.perftests.core.R;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.io.File;
import java.io.FileOutputStream;
@@ -31,10 +39,6 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
@LargeTest
@RunWith(AndroidJUnit4.class)
public class TypefaceCreatePerfTest {
@@ -103,4 +107,15 @@ public class TypefaceCreatePerfTest {
outFile.delete();
}
@Test
public void testCreate_fromResources() {
BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
final Resources r = InstrumentationRegistry.getContext().getResources();
while (state.keepRunning()) {
Typeface face = r.getFont(R.font.samplefont);
}
}
}

View File

@@ -16,6 +16,8 @@
package android.graphics.perftests;
import static junit.framework.Assert.assertTrue;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Canvas;
@@ -25,21 +27,17 @@ import android.perftests.utils.BenchmarkState;
import android.perftests.utils.BitmapUtils;
import android.perftests.utils.PerfStatusReporter;
import android.perftests.utils.StubActivity;
import android.support.test.InstrumentationRegistry;
import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.LargeTest;
import androidx.test.rule.ActivityTestRule;
import androidx.test.runner.AndroidJUnit4;
import com.android.perftests.core.R;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.io.IOException;
import static junit.framework.Assert.assertTrue;
@RunWith(AndroidJUnit4.class)
@LargeTest
public class VectorDrawablePerfTest {

View File

@@ -18,10 +18,13 @@ package android.os;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.support.test.filters.LargeTest;
import android.support.test.runner.AndroidJUnit4;
import androidx.test.filters.LargeTest;
import androidx.test.runner.AndroidJUnit4;
import com.android.internal.os.BinderCallsStats;
import com.android.internal.os.BinderInternal.CallSession;
import com.android.internal.os.CachedDeviceState;
import org.junit.After;
import org.junit.Before;
@@ -29,15 +32,30 @@ import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.assertNull;
/**
* Performance tests for {@link BinderCallsStats}
*/
@RunWith(AndroidJUnit4.class)
@LargeTest
public class BinderCallsStatsPerfTest {
private static final int DEFAULT_BUCKET_SIZE = 1000;
private static final int WORKSOURCE_UID = 1;
static class FakeCpuTimeBinderCallsStats extends BinderCallsStats {
private int mTimeMs;
FakeCpuTimeBinderCallsStats() {
super(new BinderCallsStats.Injector());
setDeviceState(new CachedDeviceState(false, false).getReadonlyClient());
}
protected long getThreadTimeMicro() {
return mTimeMs++;
}
protected long getElapsedRealtimeMicro() {
return mTimeMs++;
}
}
@Rule
public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter();
@@ -45,7 +63,9 @@ public class BinderCallsStatsPerfTest {
@Before
public void setUp() {
mBinderCallsStats = new BinderCallsStats(true);
mBinderCallsStats = new BinderCallsStats(new BinderCallsStats.Injector());
CachedDeviceState deviceState = new CachedDeviceState(false, false);
mBinderCallsStats.setDeviceState(deviceState.getReadonlyClient());
}
@After
@@ -54,25 +74,53 @@ public class BinderCallsStatsPerfTest {
@Test
public void timeCallSession() {
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
Binder b = new Binder();
int i = 0;
while (state.keepRunning()) {
BinderCallsStats.CallSession s = mBinderCallsStats.callStarted(b, i % 100);
mBinderCallsStats.callEnded(s);
i++;
}
mBinderCallsStats.setDetailedTracking(true);
runScenario(DEFAULT_BUCKET_SIZE);
}
@Test
public void timeCallSessionOnePercentSampling() {
mBinderCallsStats.setDetailedTracking(false);
mBinderCallsStats.setSamplingInterval(100);
runScenario(DEFAULT_BUCKET_SIZE);
}
@Test
public void timeCallSessionTrackingDisabled() {
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
Binder b = new Binder();
mBinderCallsStats = new BinderCallsStats(false);
while (state.keepRunning()) {
BinderCallsStats.CallSession s = mBinderCallsStats.callStarted(b, 0);
mBinderCallsStats.callEnded(s);
}
mBinderCallsStats.setDetailedTracking(false);
runScenario(DEFAULT_BUCKET_SIZE);
}
@Test
public void timeCallSession_1000_buckets_cpuNotRecorded() {
mBinderCallsStats = new FakeCpuTimeBinderCallsStats();
mBinderCallsStats.setSamplingInterval(1);
runScenario(/* max bucket size */ 1000);
}
@Test
public void timeCallSession_500_buckets_cpuNotRecorded() {
mBinderCallsStats = new FakeCpuTimeBinderCallsStats();
mBinderCallsStats.setSamplingInterval(1);
runScenario(/* max bucket size */ 500);
}
@Test
public void timeCallSession_100_buckets_cpuNotRecorded() {
mBinderCallsStats = new FakeCpuTimeBinderCallsStats();
mBinderCallsStats.setSamplingInterval(1);
runScenario(/* max bucket size */ 100);
}
// There will be a warmup time of maxBucketSize to initialize the map of CallStat.
private void runScenario(int maxBucketSize) {
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
Binder b = new Binder();
while (state.keepRunning()) {
for (int i = 0; i < 10000; i++) {
CallSession s = mBinderCallsStats.callStarted(b, i % maxBucketSize, WORKSOURCE_UID);
mBinderCallsStats.callEnded(s, 0, 0, WORKSOURCE_UID);
}
}
}
}

View File

@@ -0,0 +1,80 @@
/*
* Copyright (C) 2018 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 android.os;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import androidx.test.filters.LargeTest;
import androidx.test.runner.AndroidJUnit4;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.nio.file.Files;
import java.nio.file.Paths;
/**
* Performance tests collecting CPU data different mechanisms.
*/
@RunWith(AndroidJUnit4.class)
@LargeTest
public class CpuUsageTrackingPerfTest {
@Rule
public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter();
@Test
public void timeSystemThread() {
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
Binder b = new Binder();
while (state.keepRunning()) {
SystemClock.currentThreadTimeMicro();
}
}
@Test
public void timeReadStatFileDirectly() throws Exception {
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
// CPU usage by frequency for this pid. Data is in text format.
final String procFile = "/proc/self/stat";
while (state.keepRunning()) {
byte[] data = Files.readAllBytes(Paths.get(procFile));
}
}
@Test
public void timeReadPidProcDirectly() throws Exception {
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
// CPU usage by frequency for this pid. Data is in text format.
final String procFile = "/proc/self/time_in_state";
while (state.keepRunning()) {
byte[] data = Files.readAllBytes(Paths.get(procFile));
}
}
@Test
public void timeReadThreadProcDirectly() throws Exception {
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
// CPU usage by frequency for this UID. Data is in text format.
final String procFile = "/proc/self/task/" + android.os.Process.myTid()
+ "/time_in_state";
while (state.keepRunning()) {
byte[] data = Files.readAllBytes(Paths.get(procFile));
}
}
}

View File

@@ -0,0 +1,53 @@
/*
* Copyright (C) 2018 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 android.os;
import static org.junit.Assert.assertNotNull;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import androidx.test.filters.LargeTest;
import androidx.test.runner.AndroidJUnit4;
import com.android.internal.os.KernelCpuThreadReader;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
/**
* Performance tests collecting per-thread CPU data.
*/
@RunWith(AndroidJUnit4.class)
@LargeTest
public class KernelCpuThreadReaderPerfTest {
@Rule
public final PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter();
private final KernelCpuThreadReader mKernelCpuThreadReader =
KernelCpuThreadReader.create(8, uid -> 1000 <= uid && uid < 2000);
@Test
public void timeReadCurrentProcessCpuUsage() {
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
assertNotNull(mKernelCpuThreadReader);
while (state.keepRunning()) {
this.mKernelCpuThreadReader.getProcessCpuUsage();
}
}
}

View File

@@ -0,0 +1,96 @@
/*
* Copyright (C) 2018 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 android.os;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import androidx.test.filters.LargeTest;
import androidx.test.runner.AndroidJUnit4;
import com.android.internal.os.CachedDeviceState;
import com.android.internal.os.LooperStats;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
/**
* Performance tests for {@link LooperStats}.
*/
@RunWith(AndroidJUnit4.class)
@LargeTest
public class LooperStatsPerfTest {
private static final int DISTINCT_MESSAGE_COUNT = 1000;
@Rule
public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter();
private LooperStats mStats;
private CachedDeviceState mDeviceState;
private HandlerThread mThread;
private Message[] mMessages = new Message[DISTINCT_MESSAGE_COUNT];
@Before
public void setUp() {
mStats = new LooperStats(1, DISTINCT_MESSAGE_COUNT - 1);
mDeviceState = new CachedDeviceState(false, false);
mStats.setDeviceState(mDeviceState.getReadonlyClient());
// The tests are all single-threaded. HandlerThread is created to allow creating Handlers.
mThread = new HandlerThread("UnusedThread");
mThread.start();
for (int i = 0; i < DISTINCT_MESSAGE_COUNT; i++) {
mMessages[i] = mThread.getThreadHandler().obtainMessage(i);
}
}
@After
public void tearDown() {
mThread.quit();
}
@Test
public void timeHundredPercentSampling() {
mStats.setSamplingInterval(1);
runScenario();
}
@Test
public void timeOnePercentSampling() {
mStats.setSamplingInterval(100);
runScenario();
}
@Test
public void timeCollectionDisabled() {
// We do not collect data on charger.
mDeviceState.setCharging(true);
runScenario();
}
private void runScenario() {
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
while (state.keepRunning()) {
for (int i = 0; i < DISTINCT_MESSAGE_COUNT; i++) {
Object token = mStats.messageDispatchStarting();
mStats.messageDispatched(token, mMessages[i]);
}
}
}
}

View File

@@ -16,20 +16,16 @@
package android.os;
import static android.content.pm.PackageManager.PERMISSION_DENIED;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.LargeTest;
import android.support.test.runner.AndroidJUnit4;
import org.junit.Assert;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.LargeTest;
import androidx.test.runner.AndroidJUnit4;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;

View File

@@ -18,7 +18,8 @@ package android.os;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.support.test.filters.LargeTest;
import androidx.test.filters.LargeTest;
import org.junit.After;
import org.junit.Before;

View File

@@ -16,10 +16,15 @@
package android.os;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.support.test.filters.LargeTest;
import android.support.test.runner.AndroidJUnit4;
import androidx.test.filters.LargeTest;
import androidx.test.runner.AndroidJUnit4;
import org.junit.After;
import org.junit.Before;
@@ -27,10 +32,6 @@ import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
@RunWith(AndroidJUnit4.class)
@LargeTest
public class ParcelPerfTest {

View File

@@ -18,8 +18,9 @@ package android.os;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.support.test.filters.LargeTest;
import android.support.test.runner.AndroidJUnit4;
import androidx.test.filters.LargeTest;
import androidx.test.runner.AndroidJUnit4;
import org.junit.Rule;
import org.junit.Test;

View File

@@ -20,9 +20,10 @@ import android.content.Context;
import android.content.SharedPreferences;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.LargeTest;
import android.support.test.runner.AndroidJUnit4;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.LargeTest;
import androidx.test.runner.AndroidJUnit4;
import org.junit.Rule;
import org.junit.Test;

View File

@@ -23,17 +23,21 @@ import android.content.ServiceConnection;
import android.net.Uri;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.LargeTest;
import android.support.test.runner.AndroidJUnit4;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.LargeTest;
import androidx.test.runner.AndroidJUnit4;
import com.google.common.util.concurrent.SettableFuture;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
@RunWith(AndroidJUnit4.class)
@LargeTest
public class StrictModeTest {

View File

@@ -0,0 +1,87 @@
/*
* Copyright (C) 2018 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 android.os;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.perftests.utils.ShellHelper;
import androidx.test.runner.AndroidJUnit4;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(AndroidJUnit4.class)
public class TracePerfTest {
@Rule
public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter();
@BeforeClass
public static void startTracing() {
ShellHelper.runShellCommandRaw("atrace -c --async_start -a *");
}
@AfterClass
public static void endTracing() {
ShellHelper.runShellCommandRaw("atrace --async_stop");
}
@Before
public void verifyTracingEnabled() {
Assert.assertTrue(Trace.isEnabled());
}
@Test
public void testEnabled() {
BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
while (state.keepRunning()) {
Trace.isEnabled();
}
}
@Test
public void testBeginEndSection() {
BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
while (state.keepRunning()) {
Trace.beginSection("testBeginEndSection");
Trace.endSection();
}
}
@Test
public void testAsyncBeginEnd() {
BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
while (state.keepRunning()) {
Trace.beginAsyncSection("testAsyncBeginEnd", 42);
Trace.endAsyncSection("testAsyncBeginEnd", 42);
}
}
@Test
public void testCounter() {
BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
while (state.keepRunning()) {
Trace.setCounter("testCounter", 123);
}
}
}

View File

@@ -18,8 +18,9 @@ package android.perftests;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.support.test.filters.LargeTest;
import android.support.test.runner.AndroidJUnit4;
import androidx.test.filters.LargeTest;
import androidx.test.runner.AndroidJUnit4;
import dalvik.annotation.optimization.FastNative;

View File

@@ -18,12 +18,13 @@ package android.text;
import static android.text.Layout.Alignment.ALIGN_NORMAL;
import android.graphics.Canvas;
import android.graphics.RecordingCanvas;
import android.graphics.RenderNode;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.support.test.filters.LargeTest;
import android.text.NonEditableTextGenerator.TextType;
import android.view.DisplayListCanvas;
import android.view.RenderNode;
import androidx.test.filters.LargeTest;
import org.junit.Rule;
import org.junit.Test;
@@ -46,7 +47,7 @@ public class BoringLayoutCreateDrawPerfTest {
private static final float SPACING_ADD = 10f;
private static final float SPACING_MULT = 1.5f;
@Parameterized.Parameters(name = "cached={3},{1}chars,{0}")
@Parameterized.Parameters(name = "cached {3} {1}chars {0}")
public static Collection cases() {
final List<Object[]> params = new ArrayList<>();
for (int length : new int[]{128}) {
@@ -120,7 +121,7 @@ public class BoringLayoutCreateDrawPerfTest {
while (state.keepRunning()) {
state.pauseTiming();
final DisplayListCanvas canvas = node.start(1200, 200);
final RecordingCanvas canvas = node.start(1200, 200);
final int save = canvas.save();
if (!mCached) Canvas.freeTextLayoutCaches();
state.resumeTiming();

View File

@@ -18,9 +18,10 @@ package android.text;
import android.graphics.Canvas;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.support.test.filters.LargeTest;
import android.text.NonEditableTextGenerator.TextType;
import androidx.test.filters.LargeTest;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -40,7 +41,7 @@ public class BoringLayoutIsBoringPerfTest {
private static final boolean[] BOOLEANS = new boolean[]{false, true};
@Parameterized.Parameters(name = "cached={4},{1}chars,{0}")
@Parameterized.Parameters(name = "cached {4} {1}chars {0}")
public static Collection cases() {
final List<Object[]> params = new ArrayList<>();
for (int length : new int[]{128}) {

View File

@@ -0,0 +1,71 @@
/*
* Copyright (C) 2018 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 android.text;
import android.graphics.RecordingCanvas;
import android.graphics.RenderNode;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import androidx.test.filters.LargeTest;
import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.Random;
@LargeTest
@RunWith(AndroidJUnit4.class)
public class CanvasDrawTextTest {
private static final int WORD_LENGTH = 9; // Random word has 9 characters.
private static final TextPaint PAINT = new TextPaint();
@Rule
public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter();
private TextPerfUtils mTextUtil = new TextPerfUtils();
@Before
public void setUp() {
mTextUtil.resetRandom(0 /* seed */);
}
@Test
public void drawText_LongText_SmallWindow() {
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
final String text = mTextUtil.nextRandomParagraph(
WORD_LENGTH, 4 * 1024 * 1024 /* 4mb text */).toString();
final RenderNode node = RenderNode.create("benchmark", null);
final RenderNode child = RenderNode.create("child", null);
child.setLeftTopRightBottom(50, 50, 100, 100);
RecordingCanvas canvas = node.start(100, 100);
node.end(canvas);
canvas = child.start(50, 50);
child.end(canvas);
final Random r = new Random(0);
while (state.keepRunning()) {
int start = r.nextInt(text.length() - 100);
canvas.drawText(text, start, start + 100, 0, 0, PAINT);
}
}
}

View File

@@ -24,11 +24,12 @@ import android.graphics.Paint.FontMetricsInt;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.perftests.utils.StubActivity;
import android.support.test.filters.LargeTest;
import android.support.test.rule.ActivityTestRule;
import android.text.style.ReplacementSpan;
import android.util.ArraySet;
import androidx.test.filters.LargeTest;
import androidx.test.rule.ActivityTestRule;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;

View File

@@ -17,11 +17,12 @@ package android.text;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RecordingCanvas;
import android.graphics.RenderNode;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.support.test.filters.LargeTest;
import android.view.DisplayListCanvas;
import android.view.RenderNode;
import androidx.test.filters.LargeTest;
import org.junit.Rule;
import org.junit.Test;
@@ -42,7 +43,7 @@ public class PaintMeasureDrawPerfTest {
private static final boolean[] BOOLEANS = new boolean[]{false, true};
@Parameterized.Parameters(name = "cached={1},{0}chars")
@Parameterized.Parameters(name = "cached {1} {0}chars")
public static Collection cases() {
final List<Object[]> params = new ArrayList<>();
for (int length : new int[]{128}) {
@@ -107,7 +108,7 @@ public class PaintMeasureDrawPerfTest {
while (state.keepRunning()) {
state.pauseTiming();
final DisplayListCanvas canvas = node.start(1200, 200);
final RecordingCanvas canvas = node.start(1200, 200);
final int save = canvas.save();
if (!mCached) Canvas.freeTextLayoutCaches();
state.resumeTiming();

View File

@@ -16,32 +16,18 @@
package android.text;
import static android.text.TextDirectionHeuristics.LTR;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.support.test.filters.LargeTest;
import android.support.test.runner.AndroidJUnit4;
import android.app.Activity;
import android.os.Bundle;
import android.support.test.InstrumentationRegistry;
import android.content.res.ColorStateList;
import android.graphics.Canvas;
import android.graphics.Typeface;
import android.text.Layout;
import android.text.style.TextAppearanceSpan;
import android.view.DisplayListCanvas;
import android.view.RenderNode;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.LargeTest;
import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.nio.CharBuffer;
import java.util.Random;
import java.util.Locale;
@LargeTest
@RunWith(AndroidJUnit4.class)
@@ -49,9 +35,7 @@ public class PrecomputedTextMemoryUsageTest {
private static final int WORD_LENGTH = 9; // Random word has 9 characters.
private static final boolean NO_STYLE_TEXT = false;
private static TextPaint PAINT = new TextPaint();
private static int TRIAL_COUNT = 100;
private static int TRIAL_COUNT = 10;
public PrecomputedTextMemoryUsageTest() {}
@@ -75,9 +59,10 @@ public class PrecomputedTextMemoryUsageTest {
}
@Test
public void testMemoryUsage_NoHyphenation() {
public void testMemoryUsage_Latin_NoHyphenation() {
TextPaint paint = new TextPaint();
int[] memories = new int[TRIAL_COUNT];
final PrecomputedText.Params param = new PrecomputedText.Params.Builder(PAINT)
final PrecomputedText.Params param = new PrecomputedText.Params.Builder(paint)
.setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE)
.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE)
.build();
@@ -88,13 +73,14 @@ public class PrecomputedTextMemoryUsageTest {
mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT), param)
.getMemoryUsage();
}
reportMemoryUsage(median(memories), "MemoryUsage_NoHyphenation");
reportMemoryUsage(median(memories), "MemoryUsage_Latin_NoHyphenation");
}
@Test
public void testMemoryUsage_Hyphenation() {
public void testMemoryUsage_Latin_Hyphenation() {
TextPaint paint = new TextPaint();
int[] memories = new int[TRIAL_COUNT];
final PrecomputedText.Params param = new PrecomputedText.Params.Builder(PAINT)
final PrecomputedText.Params param = new PrecomputedText.Params.Builder(paint)
.setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED)
.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NORMAL)
.build();
@@ -105,48 +91,97 @@ public class PrecomputedTextMemoryUsageTest {
mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT), param)
.getMemoryUsage();
}
reportMemoryUsage(median(memories), "MemoryUsage_Hyphenation");
reportMemoryUsage(median(memories), "MemoryUsage_Latin_Hyphenation");
}
@Test
public void testMemoryUsage_NoHyphenation_WidthOnly() {
public void testMemoryUsage_CJK_NoHyphenation() {
TextPaint paint = new TextPaint();
int[] memories = new int[TRIAL_COUNT];
final PrecomputedText.Params param = new PrecomputedText.Params.Builder(PAINT)
final PrecomputedText.Params param = new PrecomputedText.Params.Builder(paint)
.setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE)
.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE)
.build();
// Report median of randomly generated PrecomputedText.
for (int i = 0; i < TRIAL_COUNT; ++i) {
CharSequence cs = mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT);
PrecomputedText.ParagraphInfo[] paragraphInfo =
PrecomputedText.createMeasuredParagraphs(cs, param, 0, cs.length(), false);
memories[i] = 0;
for (PrecomputedText.ParagraphInfo info : paragraphInfo) {
memories[i] += info.measured.getMemoryUsage();
}
memories[i] = PrecomputedText.create(
mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT, "[\\u4E00-\\u9FA0]"),
param).getMemoryUsage();
}
reportMemoryUsage(median(memories), "MemoryUsage_NoHyphenation_WidthOnly");
reportMemoryUsage(median(memories), "MemoryUsage_CJK_NoHyphenation");
}
@Test
public void testMemoryUsage_Hyphenatation_WidthOnly() {
public void testMemoryUsage_CJK_Hyphenation() {
TextPaint paint = new TextPaint();
int[] memories = new int[TRIAL_COUNT];
final PrecomputedText.Params param = new PrecomputedText.Params.Builder(PAINT)
final PrecomputedText.Params param = new PrecomputedText.Params.Builder(paint)
.setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED)
.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NORMAL)
.build();
// Report median of randomly generated PrecomputedText.
for (int i = 0; i < TRIAL_COUNT; ++i) {
CharSequence cs = mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT);
PrecomputedText.ParagraphInfo[] paragraphInfo =
PrecomputedText.createMeasuredParagraphs(cs, param, 0, cs.length(), false);
memories[i] = 0;
for (PrecomputedText.ParagraphInfo info : paragraphInfo) {
memories[i] += info.measured.getMemoryUsage();
}
memories[i] = PrecomputedText.create(
mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT, "[\\u4E00-\\u9FA0]"),
param).getMemoryUsage();
}
reportMemoryUsage(median(memories), "MemoryUsage_Hyphenation_WidthOnly");
reportMemoryUsage(median(memories), "MemoryUsage_CJK_Hyphenation");
}
@Test
public void testMemoryUsage_Arabic_NoHyphenation() {
TextPaint paint = new TextPaint();
paint.setTextLocale(Locale.forLanguageTag("ar"));
int[] memories = new int[TRIAL_COUNT];
final PrecomputedText.Params param = new PrecomputedText.Params.Builder(paint)
.setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE)
.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE)
.build();
// Report median of randomly generated PrecomputedText.
for (int i = 0; i < TRIAL_COUNT; ++i) {
memories[i] = PrecomputedText.create(
mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT, "[\\u0600-\\u06FF]"),
param).getMemoryUsage();
}
reportMemoryUsage(median(memories), "MemoryUsage_Arabic_NoHyphenation");
}
@Test
public void testMemoryUsage_Arabic_Hyphenation() {
TextPaint paint = new TextPaint();
paint.setTextLocale(Locale.forLanguageTag("ar"));
int[] memories = new int[TRIAL_COUNT];
final PrecomputedText.Params param = new PrecomputedText.Params.Builder(paint)
.setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED)
.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NORMAL)
.build();
// Report median of randomly generated PrecomputedText.
for (int i = 0; i < TRIAL_COUNT; ++i) {
memories[i] = PrecomputedText.create(
mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT, "[\\u0600-\\u06FF]"),
param).getMemoryUsage();
}
reportMemoryUsage(median(memories), "MemoryUsage_Arabic_Hyphenation");
}
@Test
public void testMemoryUsage_Emoji() {
TextPaint paint = new TextPaint();
int[] memories = new int[TRIAL_COUNT];
final PrecomputedText.Params param = new PrecomputedText.Params.Builder(paint)
.setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE)
.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE)
.build();
// Report median of randomly generated PrecomputedText.
for (int i = 0; i < TRIAL_COUNT; ++i) {
memories[i] = PrecomputedText.create(
mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT, "[:emoji:]"),
param).getMemoryUsage();
}
reportMemoryUsage(median(memories), "MemoryUsage_Emoji_NoHyphenation");
}
}

View File

@@ -16,30 +16,17 @@
package android.text;
import static android.text.TextDirectionHeuristics.LTR;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.support.test.filters.LargeTest;
import android.support.test.runner.AndroidJUnit4;
import android.content.res.ColorStateList;
import android.graphics.Canvas;
import android.graphics.Typeface;
import android.text.Layout;
import android.text.style.TextAppearanceSpan;
import android.view.DisplayListCanvas;
import android.view.RenderNode;
import androidx.test.filters.LargeTest;
import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.nio.CharBuffer;
import java.util.Random;
@LargeTest
@RunWith(AndroidJUnit4.class)
public class PrecomputedTextPerfTest {

View File

@@ -18,12 +18,13 @@ package android.text;
import static android.text.Layout.Alignment.ALIGN_NORMAL;
import android.graphics.Canvas;
import android.graphics.RecordingCanvas;
import android.graphics.RenderNode;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.support.test.filters.LargeTest;
import android.text.NonEditableTextGenerator.TextType;
import android.view.DisplayListCanvas;
import android.view.RenderNode;
import androidx.test.filters.LargeTest;
import org.junit.Rule;
import org.junit.Test;
@@ -50,7 +51,7 @@ public class StaticLayoutCreateDrawPerfTest {
@Rule
public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter();
@Parameterized.Parameters(name = "cached={3},{1}chars,{0}")
@Parameterized.Parameters(name = "cached {3} {1}chars {0}")
public static Collection cases() {
final List<Object[]> params = new ArrayList<>();
for (int length : new int[]{128}) {
@@ -119,7 +120,7 @@ public class StaticLayoutCreateDrawPerfTest {
while (state.keepRunning()) {
state.pauseTiming();
final DisplayListCanvas canvas = node.start(1200, 200);
final RecordingCanvas canvas = node.start(1200, 200);
int save = canvas.save();
if (!mCached) Canvas.freeTextLayoutCaches();
state.resumeTiming();

View File

@@ -0,0 +1,100 @@
/*
* Copyright (C) 2018 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 android.text;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import androidx.test.filters.LargeTest;
import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
@LargeTest
@RunWith(AndroidJUnit4.class)
public class StaticLayoutGetOffsetForHorizontalPerfTest {
private static final int WORD_LENGTH = 9; // Random word has 9 characters.
private static final int WORDS_IN_LINE = 64; // Roughly, 64 words in a line.
private static final boolean NO_STYLE_TEXT = false;
private static final boolean STYLE_TEXT = true;
private static TextPaint PAINT = new TextPaint();
static {
PAINT.setTextSize(16.0f);
}
private static final int TEXT_WIDTH = WORDS_IN_LINE * WORD_LENGTH * (int) PAINT.getTextSize();
public StaticLayoutGetOffsetForHorizontalPerfTest() {}
@Rule
public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter();
private TextPerfUtils mTextUtil = new TextPerfUtils();
@Before
public void setUp() {
mTextUtil.resetRandom(0 /* seed */);
}
@Test
public void testGetOffsetForHorizontal_LTR() {
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
while (state.keepRunning()) {
state.pauseTiming();
final CharSequence text = mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT,
"[a-zA-Z]");
StaticLayout layout =
StaticLayout.Builder.obtain(text, 0, text.length(), PAINT, TEXT_WIDTH).build();
state.resumeTiming();
layout.getOffsetForHorizontal(0, TEXT_WIDTH / 2.0f);
}
}
@Test
public void testGetOffsetForHorizontal_RTL() {
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
while (state.keepRunning()) {
state.pauseTiming();
final CharSequence text = mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT,
"[:Arabic:]");
StaticLayout layout =
StaticLayout.Builder.obtain(text, 0, text.length(), PAINT, TEXT_WIDTH).build();
state.resumeTiming();
layout.getOffsetForHorizontal(0, TEXT_WIDTH / 2.0f);
}
}
@Test
public void testGetOffsetForHorizontal_BiDi() {
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
while (state.keepRunning()) {
state.pauseTiming();
final CharSequence text = mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT,
"[[a-zA-Z][:Arabic:]]");
StaticLayout layout =
StaticLayout.Builder.obtain(text, 0, text.length(), PAINT, TEXT_WIDTH).build();
state.resumeTiming();
layout.getOffsetForHorizontal(0, TEXT_WIDTH / 2.0f);
}
}
}

View File

@@ -19,17 +19,16 @@ package android.text;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.support.test.filters.LargeTest;
import android.support.test.runner.AndroidJUnit4;
import androidx.test.filters.LargeTest;
import androidx.test.runner.AndroidJUnit4;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.Random;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
@LargeTest
@RunWith(AndroidJUnit4.class)

View File

@@ -16,30 +16,20 @@
package android.text;
import static android.text.TextDirectionHeuristics.LTR;
import android.graphics.Canvas;
import android.graphics.RecordingCanvas;
import android.graphics.RenderNode;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.support.test.filters.LargeTest;
import android.support.test.runner.AndroidJUnit4;
import android.content.res.ColorStateList;
import android.graphics.Canvas;
import android.graphics.Typeface;
import android.text.Layout;
import android.text.style.TextAppearanceSpan;
import android.view.DisplayListCanvas;
import android.view.RenderNode;
import androidx.test.filters.LargeTest;
import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.nio.CharBuffer;
import java.util.Random;
@LargeTest
@RunWith(AndroidJUnit4.class)
public class StaticLayoutPerfTest {
@@ -179,6 +169,25 @@ public class StaticLayoutPerfTest {
}
}
@Test
public void testCreate_PrecomputedText_NoStyled_Greedy_NoHyphenation_DirDifferent() {
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
while (state.keepRunning()) {
state.pauseTiming();
final PrecomputedText text = makeMeasured(
mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT), PAINT,
Layout.BREAK_STRATEGY_SIMPLE, Layout.HYPHENATION_FREQUENCY_NONE);
Canvas.freeTextLayoutCaches();
state.resumeTiming();
StaticLayout.Builder.obtain(text, 0, text.length(), PAINT, TEXT_WIDTH)
.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE)
.setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE)
.setTextDirection(TextDirectionHeuristics.RTL)
.build();
}
}
@Test
public void testCreate_PrecomputedText_NoStyled_Greedy_Hyphenation() {
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
@@ -256,10 +265,11 @@ public class StaticLayoutPerfTest {
state.pauseTiming();
final StaticLayout layout =
StaticLayout.Builder.obtain(text, 0, text.length(), PAINT, TEXT_WIDTH).build();
final DisplayListCanvas c = node.start(1200, 200);
final RecordingCanvas c = node.beginRecording(1200, 200);
state.resumeTiming();
layout.draw(c);
node.endRecording();
}
}
@@ -272,10 +282,11 @@ public class StaticLayoutPerfTest {
final CharSequence text = mTextUtil.nextRandomParagraph(WORD_LENGTH, STYLE_TEXT);
final StaticLayout layout =
StaticLayout.Builder.obtain(text, 0, text.length(), PAINT, TEXT_WIDTH).build();
final DisplayListCanvas c = node.start(1200, 200);
final RecordingCanvas c = node.beginRecording(1200, 200);
state.resumeTiming();
layout.draw(c);
node.endRecording();
}
}
@@ -288,10 +299,11 @@ public class StaticLayoutPerfTest {
final CharSequence text = mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT);
final StaticLayout layout =
StaticLayout.Builder.obtain(text, 0, text.length(), PAINT, TEXT_WIDTH).build();
final DisplayListCanvas c = node.start(1200, 200);
final RecordingCanvas c = node.beginRecording(1200, 200);
state.resumeTiming();
layout.draw(c);
node.endRecording();
}
}
@@ -304,11 +316,12 @@ public class StaticLayoutPerfTest {
final CharSequence text = mTextUtil.nextRandomParagraph(WORD_LENGTH, STYLE_TEXT);
final StaticLayout layout =
StaticLayout.Builder.obtain(text, 0, text.length(), PAINT, TEXT_WIDTH).build();
final DisplayListCanvas c = node.start(1200, 200);
final RecordingCanvas c = node.beginRecording(1200, 200);
Canvas.freeTextLayoutCaches();
state.resumeTiming();
layout.draw(c);
node.endRecording();
}
}
@@ -321,11 +334,12 @@ public class StaticLayoutPerfTest {
final CharSequence text = mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT);
final StaticLayout layout =
StaticLayout.Builder.obtain(text, 0, text.length(), PAINT, TEXT_WIDTH).build();
final DisplayListCanvas c = node.start(1200, 200);
final RecordingCanvas c = node.beginRecording(1200, 200);
Canvas.freeTextLayoutCaches();
state.resumeTiming();
layout.draw(c);
node.endRecording();
}
}
@@ -339,10 +353,11 @@ public class StaticLayoutPerfTest {
mTextUtil.nextRandomParagraph(WORD_LENGTH, STYLE_TEXT), PAINT);
final StaticLayout layout =
StaticLayout.Builder.obtain(text, 0, text.length(), PAINT, TEXT_WIDTH).build();
final DisplayListCanvas c = node.start(1200, 200);
final RecordingCanvas c = node.beginRecording(1200, 200);
state.resumeTiming();
layout.draw(c);
node.endRecording();
}
}
@@ -356,10 +371,11 @@ public class StaticLayoutPerfTest {
mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT), PAINT);
final StaticLayout layout =
StaticLayout.Builder.obtain(text, 0, text.length(), PAINT, TEXT_WIDTH).build();
final DisplayListCanvas c = node.start(1200, 200);
final RecordingCanvas c = node.beginRecording(1200, 200);
state.resumeTiming();
layout.draw(c);
node.endRecording();
}
}
@@ -373,11 +389,12 @@ public class StaticLayoutPerfTest {
mTextUtil.nextRandomParagraph(WORD_LENGTH, STYLE_TEXT), PAINT);
final StaticLayout layout =
StaticLayout.Builder.obtain(text, 0, text.length(), PAINT, TEXT_WIDTH).build();
final DisplayListCanvas c = node.start(1200, 200);
final RecordingCanvas c = node.beginRecording(1200, 200);
Canvas.freeTextLayoutCaches();
state.resumeTiming();
layout.draw(c);
node.endRecording();
}
}
@@ -391,11 +408,12 @@ public class StaticLayoutPerfTest {
mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT), PAINT);
final StaticLayout layout =
StaticLayout.Builder.obtain(text, 0, text.length(), PAINT, TEXT_WIDTH).build();
final DisplayListCanvas c = node.start(1200, 200);
final RecordingCanvas c = node.beginRecording(1200, 200);
Canvas.freeTextLayoutCaches();
state.resumeTiming();
layout.draw(c);
node.endRecording();
}
}

View File

@@ -16,28 +16,14 @@
package android.text;
import static android.text.TextDirectionHeuristics.LTR;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.support.test.filters.LargeTest;
import android.support.test.runner.AndroidJUnit4;
import android.content.res.ColorStateList;
import android.graphics.Canvas;
import android.graphics.Typeface;
import android.text.Layout;
import android.icu.text.UnicodeSet;
import android.icu.text.UnicodeSetIterator;
import android.text.style.TextAppearanceSpan;
import android.view.DisplayListCanvas;
import android.view.RenderNode;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.nio.CharBuffer;
import java.util.ArrayList;
import java.util.Random;
public class TextPerfUtils {
@@ -46,8 +32,17 @@ public class TextPerfUtils {
private Random mRandom = new Random(0);
private static final String ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
private static final int ALPHABET_LENGTH = ALPHABET.length();
private static final String[] ALPHABET;
private static final int ALPHABET_LENGTH;
static {
String alphabets = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
ALPHABET_LENGTH = alphabets.length();
ALPHABET = new String[ALPHABET_LENGTH];
for (int i = 0; i < ALPHABET_LENGTH; ++i) {
ALPHABET[i] = Character.toString(alphabets.charAt(i));
}
}
private static final ColorStateList TEXT_COLOR = ColorStateList.valueOf(0x00000000);
private static final String[] FAMILIES = { "sans-serif", "serif", "monospace" };
@@ -55,30 +50,64 @@ public class TextPerfUtils {
Typeface.NORMAL, Typeface.BOLD, Typeface.ITALIC, Typeface.BOLD_ITALIC
};
private final char[] mBuffer = new char[PARA_LENGTH];
public void resetRandom(long seed) {
mRandom = new Random(seed);
}
private static String[] UnicodeSetToArray(String setStr) {
final UnicodeSet set = new UnicodeSet(setStr);
final UnicodeSetIterator iterator = new UnicodeSetIterator(set);
final ArrayList<String> out = new ArrayList<>(set.size());
while (iterator.next()) {
out.add(iterator.getString());
}
return out.toArray(new String[out.size()]);
}
public CharSequence nextRandomParagraph(int wordLen, boolean applyRandomStyle, String setStr) {
return nextRandomParagraph(wordLen, PARA_LENGTH, applyRandomStyle,
UnicodeSetToArray(setStr));
}
public CharSequence nextRandomParagraph(int wordLen, boolean applyRandomStyle) {
for (int i = 0; i < PARA_LENGTH; i++) {
return nextRandomParagraph(wordLen, PARA_LENGTH, applyRandomStyle, ALPHABET);
}
public CharSequence nextRandomParagraph(int wordLen, int paraLength) {
return nextRandomParagraph(wordLen, paraLength, false /* no style */, ALPHABET);
}
public CharSequence nextRandomParagraph(int wordLen, int paraLength, boolean applyRandomStyle,
String[] charSet) {
ArrayList<Character> chars = new ArrayList<>();
ArrayList<Integer> wordOffsets = new ArrayList<>();
for (int i = 0; i < paraLength; i++) {
if (i % (wordLen + 1) == wordLen) {
mBuffer[i] = ' ';
chars.add(' ');
wordOffsets.add(chars.size());
} else {
mBuffer[i] = ALPHABET.charAt(mRandom.nextInt(ALPHABET_LENGTH));
final String str = charSet[mRandom.nextInt(charSet.length)];
for (int j = 0; j < str.length(); ++j) {
chars.add(str.charAt(j));
}
}
}
wordOffsets.add(chars.size());
CharSequence cs = CharBuffer.wrap(mBuffer);
char[] buffer = new char[chars.size()];
for (int i = 0; i < buffer.length; ++i) {
buffer[i] = chars.get(i);
}
CharSequence cs = CharBuffer.wrap(buffer);
if (!applyRandomStyle) {
return cs;
}
SpannableStringBuilder ssb = new SpannableStringBuilder(cs);
for (int i = 0; i < ssb.length(); i += wordLen + 1) {
final int spanStart = i;
final int spanEnd = (i + wordLen) > ssb.length() ? ssb.length() : i + wordLen;
int prevWordStart = 0;
for (int i = 0; i < wordOffsets.size(); i++) {
final int spanStart = prevWordStart;
final int spanEnd = wordOffsets.get(i);
final TextAppearanceSpan span = new TextAppearanceSpan(
FAMILIES[mRandom.nextInt(FAMILIES.length)],
@@ -87,6 +116,7 @@ public class TextPerfUtils {
TEXT_COLOR, TEXT_COLOR);
ssb.setSpan(span, spanStart, spanEnd, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
prevWordStart = spanEnd;
}
return ssb;
}

View File

@@ -19,15 +19,16 @@ import static android.view.View.MeasureSpec.AT_MOST;
import static android.view.View.MeasureSpec.UNSPECIFIED;
import android.graphics.Canvas;
import android.graphics.RecordingCanvas;
import android.graphics.RenderNode;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.LargeTest;
import android.text.NonEditableTextGenerator.TextType;
import android.view.DisplayListCanvas;
import android.view.RenderNode;
import android.widget.TextView;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.LargeTest;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -51,7 +52,7 @@ public class TextViewSetTextMeasurePerfTest {
@Rule
public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter();
@Parameterized.Parameters(name = "cached={3},{1}chars,{0}")
@Parameterized.Parameters(name = "cached {3} {1}chars {0}")
public static Collection cases() {
final List<Object[]> params = new ArrayList<>();
for (int length : new int[]{128}) {
@@ -92,6 +93,8 @@ public class TextViewSetTextMeasurePerfTest {
Canvas.freeTextLayoutCaches();
final CharSequence text = createRandomText(mLength);
final TextView textView = new TextView(InstrumentationRegistry.getTargetContext());
textView.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE);
textView.setText(text);
state.resumeTiming();
@@ -119,13 +122,14 @@ public class TextViewSetTextMeasurePerfTest {
final RenderNode node = RenderNode.create("benchmark", null);
final CharSequence text = createRandomText(mLength);
final TextView textView = new TextView(InstrumentationRegistry.getTargetContext());
textView.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE);
textView.setText(text);
state.resumeTiming();
while (state.keepRunning()) {
state.pauseTiming();
final DisplayListCanvas canvas = node.start(1200, 200);
final RecordingCanvas canvas = node.start(1200, 200);
int save = canvas.save();
textView.setTextLocale(Locale.UK);
textView.setTextLocale(Locale.US);

View File

@@ -0,0 +1,213 @@
/*
* Copyright (C) 2018 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 android.util;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import androidx.test.filters.LargeTest;
import androidx.test.runner.AndroidJUnit4;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.function.Predicate;
@RunWith(AndroidJUnit4.class)
@LargeTest
public class ArraySetPerfTest {
private static final int NUM_ITERATIONS = 100;
private static final int SET_SIZE_SMALL = 10;
private static final int SET_SIZE_LARGE = 50;
@Rule
public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter();
@Test
public void testValueAt_InBounds() {
BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
ArraySet<Integer> set = new ArraySet<>();
set.add(0);
while (state.keepRunning()) {
for (int i = 0; i < NUM_ITERATIONS; ++i) {
set.valueAt(0);
}
}
}
@Test
public void testValueAt_OutOfBounds_Negative() {
BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
ArraySet<Integer> set = new ArraySet<>();
while (state.keepRunning()) {
for (int i = 0; i < NUM_ITERATIONS; ++i) {
try {
set.valueAt(-1);
} catch (ArrayIndexOutOfBoundsException expected) {
// expected
}
}
}
}
/**
* Tests the case where ArraySet could index into its array even though the index is out of
* bounds.
*/
@Test
public void testValueAt_OutOfBounds_EdgeCase() {
BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
ArraySet<Integer> set = new ArraySet<>();
set.add(0);
while (state.keepRunning()) {
for (int i = 0; i < NUM_ITERATIONS; ++i) {
try {
set.valueAt(1);
} catch (ArrayIndexOutOfBoundsException expected) {
// expected
}
}
}
}
/**
* This is the same code as testRemoveIf_Small_* without the removeIf in order to measure
* the performance of the rest of the code in the loop.
*/
@Test
public void testRemoveIf_Small_Base() {
BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
Predicate<Integer> predicate = (i) -> i % 2 == 0;
while (state.keepRunning()) {
for (int i = 0; i < NUM_ITERATIONS; ++i) {
ArraySet<Integer> set = new ArraySet<>();
for (int j = 0; j < SET_SIZE_SMALL; ++j) {
set.add(j);
}
}
}
}
@Test
public void testRemoveIf_Small_RemoveNothing() {
BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
Predicate<Integer> predicate = (i) -> false;
while (state.keepRunning()) {
for (int i = 0; i < NUM_ITERATIONS; ++i) {
ArraySet<Integer> set = new ArraySet<>();
for (int j = 0; j < SET_SIZE_SMALL; ++j) {
set.add(j);
}
set.removeIf(predicate);
}
}
}
@Test
public void testRemoveIf_Small_RemoveAll() {
BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
Predicate<Integer> predicate = (i) -> true;
while (state.keepRunning()) {
for (int i = 0; i < NUM_ITERATIONS; ++i) {
ArraySet<Integer> set = new ArraySet<>();
for (int j = 0; j < SET_SIZE_SMALL; j++) {
set.add(j);
}
set.removeIf(predicate);
}
}
}
@Test
public void testRemoveIf_Small_RemoveHalf() {
BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
Predicate<Integer> predicate = (i) -> i % 2 == 0;
while (state.keepRunning()) {
for (int i = 0; i < NUM_ITERATIONS; ++i) {
ArraySet<Integer> set = new ArraySet<>();
for (int j = 0; j < SET_SIZE_SMALL; ++j) {
set.add(j);
}
set.removeIf(predicate);
}
}
}
/**
* This is the same code as testRemoveIf_Large_* without the removeIf in order to measure
* the performance of the rest of the code in the loop.
*/
@Test
public void testRemoveIf_Large_Base() {
BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
Predicate<Integer> predicate = (i) -> i % 2 == 0;
while (state.keepRunning()) {
for (int i = 0; i < NUM_ITERATIONS; ++i) {
ArraySet<Integer> set = new ArraySet<>();
for (int j = 0; j < SET_SIZE_LARGE; ++j) {
set.add(j);
}
}
}
}
@Test
public void testRemoveIf_Large_RemoveNothing() {
BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
Predicate<Integer> predicate = (i) -> false;
while (state.keepRunning()) {
for (int i = 0; i < NUM_ITERATIONS; ++i) {
ArraySet<Integer> set = new ArraySet<>();
for (int j = 0; j < SET_SIZE_LARGE; ++j) {
set.add(j);
}
set.removeIf(predicate);
}
}
}
@Test
public void testRemoveIf_Large_RemoveAll() {
BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
Predicate<Integer> predicate = (i) -> true;
while (state.keepRunning()) {
for (int i = 0; i < NUM_ITERATIONS; ++i) {
ArraySet<Integer> set = new ArraySet<>();
for (int j = 0; j < SET_SIZE_LARGE; ++j) {
set.add(j);
}
set.removeIf(predicate);
}
}
}
@Test
public void testRemoveIf_Large_RemoveHalf() {
BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
Predicate<Integer> predicate = (i) -> i % 2 == 0;
while (state.keepRunning()) {
for (int i = 0; i < NUM_ITERATIONS; ++i) {
ArraySet<Integer> set = new ArraySet<>();
for (int j = 0; j < SET_SIZE_LARGE; ++j) {
set.add(j);
}
set.removeIf(predicate);
}
}
}
}

View File

@@ -18,11 +18,11 @@ package android.util.perftests;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.support.test.filters.LargeTest;
import android.support.test.runner.AndroidJUnit4;
import android.util.Log;
import androidx.test.filters.LargeTest;
import androidx.test.runner.AndroidJUnit4;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;

View File

@@ -17,13 +17,13 @@
package android.view;
import android.content.Context;
import android.content.res.Resources;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.LargeTest;
import android.widget.FrameLayout;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.LargeTest;
import com.android.perftests.core.R;
import org.junit.Rule;

View File

@@ -24,14 +24,15 @@ import android.graphics.drawable.ColorDrawable;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.perftests.utils.StubActivity;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.LargeTest;
import android.support.test.rule.ActivityTestRule;
import android.view.View.MeasureSpec;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.LargeTest;
import androidx.test.rule.ActivityTestRule;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -155,7 +156,7 @@ public class ViewShowHidePerfTest {
}
private void updateAndValidateDisplayList(View view) {
boolean hasDisplayList = view.updateDisplayListIfDirty().isValid();
boolean hasDisplayList = view.updateDisplayListIfDirty().hasDisplayList();
assertTrue(hasDisplayList);
}

View File

@@ -19,14 +19,15 @@ package android.widget;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.perftests.utils.StubActivity;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.LargeTest;
import android.support.test.rule.ActivityTestRule;
import android.text.Selection;
import android.view.KeyEvent;
import android.view.View.MeasureSpec;
import android.view.ViewGroup;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.LargeTest;
import androidx.test.rule.ActivityTestRule;
import org.junit.Assert;
import org.junit.Rule;
import org.junit.Test;

View File

@@ -19,14 +19,15 @@ package android.widget;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.perftests.utils.StubActivity;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.LargeTest;
import android.support.test.rule.ActivityTestRule;
import android.text.Selection;
import android.view.KeyEvent;
import android.view.View.MeasureSpec;
import android.view.ViewGroup;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.LargeTest;
import androidx.test.rule.ActivityTestRule;
import org.junit.Assert;
import org.junit.Rule;
import org.junit.Test;

View File

@@ -16,10 +16,16 @@
package android.widget;
import java.util.Arrays;
import java.util.Collection;
import java.util.Locale;
import java.util.Random;
import android.app.Activity;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.perftests.utils.StubActivity;
import android.view.KeyEvent;
import android.view.View.MeasureSpec;
import android.view.ViewGroup;
import androidx.test.filters.LargeTest;
import androidx.test.rule.ActivityTestRule;
import org.junit.Rule;
import org.junit.Test;
@@ -27,22 +33,9 @@ import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.util.Log;
import android.view.KeyEvent;
import android.view.RenderNodeAnimator;
import android.view.ViewGroup;
import android.view.View.MeasureSpec;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.perftests.utils.StubActivity;
import android.support.test.filters.LargeTest;
import android.support.test.runner.AndroidJUnit4;
import android.support.test.rule.ActivityTestRule;
import android.support.test.InstrumentationRegistry;
import java.util.Arrays;
import java.util.Collection;
import java.util.Random;
@LargeTest
@RunWith(Parameterized.class)

View File

@@ -16,17 +16,26 @@
package android.widget;
import static android.perftests.utils.LayoutUtils.gatherViewTree;
import static android.perftests.utils.LayoutUtils.requestLayoutForAllNodes;
import static android.view.View.MeasureSpec.AT_MOST;
import static android.view.View.MeasureSpec.EXACTLY;
import static android.view.View.MeasureSpec.UNSPECIFIED;
import static org.junit.Assert.assertTrue;
import android.app.Activity;
import android.os.Looper;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.perftests.utils.StubActivity;
import android.support.test.annotation.UiThreadTest;
import android.support.test.filters.LargeTest;
import android.support.test.rule.ActivityTestRule;
import android.view.View;
import android.view.ViewGroup;
import androidx.test.annotation.UiThreadTest;
import androidx.test.filters.LargeTest;
import androidx.test.rule.ActivityTestRule;
import com.android.perftests.core.R;
import org.junit.Rule;
@@ -38,13 +47,6 @@ import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import static android.perftests.utils.LayoutUtils.gatherViewTree;
import static android.perftests.utils.LayoutUtils.requestLayoutForAllNodes;
import static android.view.View.MeasureSpec.AT_MOST;
import static android.view.View.MeasureSpec.EXACTLY;
import static android.view.View.MeasureSpec.UNSPECIFIED;
import static org.junit.Assert.assertTrue;
@LargeTest
@RunWith(Parameterized.class)
public class LayoutPerfTest {

View File

@@ -16,33 +16,27 @@
package android.widget;
import static org.junit.Assert.assertTrue;
import android.app.Activity;
import android.os.Looper;
import android.os.Bundle;
import android.perftests.utils.PerfStatusReporter;
import android.util.Log;
import android.view.View;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.perftests.utils.StubActivity;
import android.support.test.filters.LargeTest;
import android.support.test.runner.AndroidJUnit4;
import android.support.test.rule.ActivityTestRule;
import android.support.test.InstrumentationRegistry;
import androidx.test.filters.LargeTest;
import androidx.test.rule.ActivityTestRule;
import com.android.perftests.core.R;
import java.util.Locale;
import java.util.Collection;
import java.util.Arrays;
import org.junit.Test;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import org.junit.runner.RunWith;
import static org.junit.Assert.assertTrue;
import java.util.Arrays;
import java.util.Collection;
@LargeTest
@RunWith(Parameterized.class)

View File

@@ -19,23 +19,21 @@ package android.widget;
import android.content.Context;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.LargeTest;
import android.support.test.runner.AndroidJUnit4;
import android.view.LayoutInflater;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.LargeTest;
import com.android.perftests.core.R;
import java.util.Collection;
import java.util.Arrays;
import org.junit.Test;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import org.junit.runner.RunWith;
import static org.junit.Assert.assertTrue;
import java.util.Arrays;
import java.util.Collection;
@LargeTest
@RunWith(Parameterized.class)

View File

@@ -25,24 +25,20 @@ import android.content.res.ColorStateList;
import android.graphics.Typeface;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.LargeTest;
import android.support.test.runner.AndroidJUnit4;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.style.TextAppearanceSpan;
import android.view.LayoutInflater;
import com.android.perftests.core.R;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.LargeTest;
import androidx.test.runner.AndroidJUnit4;
import java.util.Random;
import java.util.Locale;
import org.junit.Test;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.assertTrue;
import java.util.Locale;
import java.util.Random;
@LargeTest
@RunWith(AndroidJUnit4.class)

View File

@@ -16,46 +16,30 @@
package android.widget;
import static android.view.View.MeasureSpec.AT_MOST;
import static android.view.View.MeasureSpec.EXACTLY;
import static android.view.View.MeasureSpec.UNSPECIFIED;
import static android.widget.TextView.UNKNOWN_BORING;
import android.content.Context;
import android.content.res.ColorStateList;
import android.graphics.Typeface;
import android.graphics.Canvas;
import android.graphics.RecordingCanvas;
import android.graphics.RenderNode;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.LargeTest;
import android.support.test.runner.AndroidJUnit4;
import android.text.PrecomputedText;
import android.text.Layout;
import android.text.BoringLayout;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.Layout;
import android.text.PrecomputedText;
import android.text.TextPaint;
import android.text.style.TextAppearanceSpan;
import android.view.LayoutInflater;
import android.text.TextPerfUtils;
import android.view.View.MeasureSpec;
import android.view.DisplayListCanvas;
import android.view.RenderNode;
import com.android.perftests.core.R;
import java.util.Random;
import java.util.Locale;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.LargeTest;
import androidx.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.assertTrue;
import static android.widget.TextView.UNKNOWN_BORING;
@LargeTest
@RunWith(AndroidJUnit4.class)
public class TextViewPrecomputedTextPerfTest {
@@ -360,13 +344,14 @@ public class TextViewPrecomputedTextPerfTest {
textView.setText(text);
textView.measure(width, height);
textView.layout(0, 0, textView.getMeasuredWidth(), textView.getMeasuredHeight());
final DisplayListCanvas c = node.start(
final RecordingCanvas c = node.beginRecording(
textView.getMeasuredWidth(), textView.getMeasuredHeight());
textView.nullLayouts();
Canvas.freeTextLayoutCaches();
state.resumeTiming();
textView.onDraw(c);
node.endRecording();
}
}
@@ -386,13 +371,14 @@ public class TextViewPrecomputedTextPerfTest {
textView.setText(text);
textView.measure(width, height);
textView.layout(0, 0, textView.getMeasuredWidth(), textView.getMeasuredHeight());
final DisplayListCanvas c = node.start(
final RecordingCanvas c = node.beginRecording(
textView.getMeasuredWidth(), textView.getMeasuredHeight());
textView.nullLayouts();
Canvas.freeTextLayoutCaches();
state.resumeTiming();
textView.onDraw(c);
node.endRecording();
}
}
@@ -414,13 +400,14 @@ public class TextViewPrecomputedTextPerfTest {
textView.setText(text);
textView.measure(width, height);
textView.layout(0, 0, textView.getMeasuredWidth(), textView.getMeasuredHeight());
final DisplayListCanvas c = node.start(
final RecordingCanvas c = node.beginRecording(
textView.getMeasuredWidth(), textView.getMeasuredHeight());
textView.nullLayouts();
Canvas.freeTextLayoutCaches();
state.resumeTiming();
textView.onDraw(c);
node.endRecording();
}
}
@@ -443,13 +430,14 @@ public class TextViewPrecomputedTextPerfTest {
textView.setText(text);
textView.measure(width, height);
textView.layout(0, 0, textView.getMeasuredWidth(), textView.getMeasuredHeight());
final DisplayListCanvas c = node.start(
final RecordingCanvas c = node.beginRecording(
textView.getMeasuredWidth(), textView.getMeasuredHeight());
textView.nullLayouts();
Canvas.freeTextLayoutCaches();
state.resumeTiming();
textView.onDraw(c);
node.endRecording();
}
}
}

View File

@@ -19,8 +19,9 @@ package android.widget;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.perftests.utils.StubActivity;
import android.support.test.filters.LargeTest;
import android.support.test.rule.ActivityTestRule;
import androidx.test.filters.LargeTest;
import androidx.test.rule.ActivityTestRule;
import org.junit.Rule;
import org.junit.Test;

View File

@@ -16,8 +16,8 @@ android_test {
name: "MultiUserPerfTests",
srcs: ["src/**/*.java"],
static_libs: [
"android-support-test",
"ub-uiautomator",
"androidx.test.rules",
"apct-perftests-utils",
],
platform_apis: true,
test_suites: ["device-tests"],

View File

@@ -25,7 +25,7 @@
<uses-library android:name="android.test.runner" />
</application>
<instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
<instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
android:targetPackage="com.android.perftests.multiuser"/>
</manifest>

View File

@@ -60,11 +60,13 @@ public class BenchmarkResults {
if (size == 0) {
return 0f;
}
Collections.sort(mResults);
final ArrayList<Long> resultsCopy = new ArrayList<>(mResults);
Collections.sort(resultsCopy);
final int idx = size / 2;
return size % 2 == 0
? (double) (mResults.get(idx) + mResults.get(idx - 1)) / 2
: mResults.get(idx);
? (double) (resultsCopy.get(idx) + resultsCopy.get(idx - 1)) / 2
: resultsCopy.get(idx);
}
private double standardDeviation() {

View File

@@ -18,9 +18,10 @@ package android.multiuser;
import android.app.Activity;
import android.app.Instrumentation;
import android.os.Bundle;
import android.support.test.InstrumentationRegistry;
import android.util.Log;
import androidx.test.InstrumentationRegistry;
import org.junit.rules.TestRule;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;

View File

@@ -17,10 +17,8 @@ package android.multiuser;
import android.os.Bundle;
import android.os.SystemClock;
import android.support.test.InstrumentationRegistry;
import android.support.test.uiautomator.UiDevice;
import android.perftests.utils.ShellHelper;
import java.io.IOException;
import java.util.ArrayList;
// Based on //platform/frameworks/base/apct-tests/perftests/utils/BenchmarkState.java
@@ -74,12 +72,7 @@ public class BenchmarkRunner {
private void prepareForNextRun() {
SystemClock.sleep(COOL_OFF_PERIOD_MS);
try {
UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
.executeShellCommand("am wait-for-broadcast-idle");
} catch (IOException e) {
throw new IllegalStateException("Cannot execute shell command", e);
}
ShellHelper.runShellCommand("am wait-for-broadcast-idle");
mStartTimeNs = System.nanoTime();
mPausedDurationNs = 0;
}

View File

@@ -27,9 +27,11 @@ import android.content.pm.UserInfo;
import android.os.RemoteException;
import android.os.UserHandle;
import android.os.UserManager;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.LargeTest;
import android.support.test.runner.AndroidJUnit4;
import android.util.Log;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.LargeTest;
import androidx.test.runner.AndroidJUnit4;
import org.junit.After;
import org.junit.Before;
@@ -50,7 +52,7 @@ import java.util.concurrent.TimeUnit;
* adb install -r \
* ${ANDROID_PRODUCT_OUT}/data/app/MultiUserPerfTests/MultiUserPerfTests.apk &&
* adb shell am instrument -e class android.multiuser.UserLifecycleTests \
* -w com.android.perftests.multiuser/android.support.test.runner.AndroidJUnitRunner
* -w com.android.perftests.multiuser/androidx.test.runner.AndroidJUnitRunner
*
* or
*
@@ -129,6 +131,47 @@ public class UserLifecycleTests {
}
}
/** Tests switching to an already-created, but no-longer-running, user. */
@Test
public void switchUser_stopped() throws Exception {
while (mRunner.keepRunning()) {
mRunner.pauseTiming();
final int startUser = mAm.getCurrentUser();
final int testUser = initializeNewUserAndSwitchBack(/* stopNewUser */ true);
final CountDownLatch latch = new CountDownLatch(1);
registerBroadcastReceiver(Intent.ACTION_USER_UNLOCKED, latch, testUser);
mRunner.resumeTiming();
mAm.switchUser(testUser);
boolean success = latch.await(TIMEOUT_IN_SECOND, TimeUnit.SECONDS);
mRunner.pauseTiming();
attestTrue("Failed to achieve 2nd ACTION_USER_UNLOCKED for user " + testUser, success);
switchUser(startUser);
removeUser(testUser);
mRunner.resumeTiming();
}
}
/** Tests switching to an already-created already-running non-owner user. */
@Test
public void switchUser_running() throws Exception {
while (mRunner.keepRunning()) {
mRunner.pauseTiming();
final int startUser = mAm.getCurrentUser();
final int testUser = initializeNewUserAndSwitchBack(/* stopNewUser */ false);
mRunner.resumeTiming();
switchUser(testUser);
mRunner.pauseTiming();
attestTrue("Failed to switch to user " + testUser, mAm.isUserRunning(testUser));
switchUser(startUser);
removeUser(testUser);
mRunner.resumeTiming();
}
}
@Test
public void stopUser() throws Exception {
while (mRunner.keepRunning()) {
@@ -187,6 +230,34 @@ public class UserLifecycleTests {
}
}
/** Tests starting an already-created, but no-longer-running, profile. */
@Test
public void managedProfileUnlock_stopped() throws Exception {
while (mRunner.keepRunning()) {
mRunner.pauseTiming();
final UserInfo userInfo = mUm.createProfileForUser("TestUser",
UserInfo.FLAG_MANAGED_PROFILE, mAm.getCurrentUser());
// Start the profile initially, then stop it. Similar to setQuietModeEnabled.
final CountDownLatch latch1 = new CountDownLatch(1);
registerBroadcastReceiver(Intent.ACTION_USER_UNLOCKED, latch1, userInfo.id);
mIam.startUserInBackground(userInfo.id);
latch1.await(TIMEOUT_IN_SECOND, TimeUnit.SECONDS);
stopUser(userInfo.id, true);
// Now we restart the profile.
final CountDownLatch latch2 = new CountDownLatch(1);
registerBroadcastReceiver(Intent.ACTION_USER_UNLOCKED, latch2, userInfo.id);
mRunner.resumeTiming();
mIam.startUserInBackground(userInfo.id);
latch2.await(TIMEOUT_IN_SECOND, TimeUnit.SECONDS);
mRunner.pauseTiming();
removeUser(userInfo.id);
mRunner.resumeTiming();
}
}
@Test
public void ephemeralUserStopped() throws Exception {
while (mRunner.keepRunning()) {
@@ -261,6 +332,35 @@ public class UserLifecycleTests {
latch.await(TIMEOUT_IN_SECOND, TimeUnit.SECONDS);
}
/**
* Creates a user and waits for its ACTION_USER_UNLOCKED.
* Then switches to back to the original user and waits for its switchUser() to finish.
*
* @param stopNewUser whether to stop the new user after switching to otherUser.
* @return userId of the newly created user.
*/
private int initializeNewUserAndSwitchBack(boolean stopNewUser) throws Exception {
final int origUser = mAm.getCurrentUser();
// First, create and switch to testUser, waiting for its ACTION_USER_UNLOCKED
final int testUser = mUm.createUser("TestUser", 0).id;
final CountDownLatch latch1 = new CountDownLatch(1);
registerBroadcastReceiver(Intent.ACTION_USER_UNLOCKED, latch1, testUser);
mAm.switchUser(testUser);
attestTrue("Failed to achieve initial ACTION_USER_UNLOCKED for user " + testUser,
latch1.await(TIMEOUT_IN_SECOND, TimeUnit.SECONDS));
// Second, switch back to origUser, waiting merely for switchUser() to finish
switchUser(origUser);
attestTrue("Didn't switch back to user, " + origUser, origUser == mAm.getCurrentUser());
if (stopNewUser) {
stopUser(testUser, true);
attestFalse("Failed to stop user " + testUser, mAm.isUserRunning(testUser));
}
return testUser;
}
private void registerUserSwitchObserver(final CountDownLatch switchLatch,
final CountDownLatch bootCompleteLatch, final int userId) throws Exception {
ActivityManager.getService().registerUserSwitchObserver(
@@ -312,4 +412,14 @@ public class UserLifecycleTests {
mUsersToRemove.add(userId);
}
}
private void attestTrue(String message, boolean attestion) {
if (!attestion) {
Log.w(TAG, message);
}
}
private void attestFalse(String message, boolean attestion) {
attestTrue(message, !attestion);
}
}

View File

@@ -0,0 +1,25 @@
// Copyright (C) 2019 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.
android_test {
name: "TextClassifierPerfTests",
srcs: ["src/**/*.java"],
static_libs: [
"androidx.test.rules",
"androidx.annotation_annotation",
"apct-perftests-utils",
],
platform_apis: true,
test_suites: ["device-tests"],
}

View File

@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2018 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.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.perftests.textclassifier">
<application>
<uses-library android:name="android.test.runner" />
</application>
<instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
android:targetPackage="com.android.perftests.textclassifier"/>
</manifest>

View File

@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2018 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.
-->
<configuration description="Runs TextClassifierPerfTests metric instrumentation.">
<option name="test-suite-tag" value="apct" />
<option name="test-suite-tag" value="apct-metric-instrumentation" />
<target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
<option name="cleanup-apks" value="true" />
<option name="test-file-name" value="TextClassifierPerfTests.apk" />
</target_preparer>
<test class="com.android.tradefed.testtype.AndroidJUnitTest" >
<option name="package" value="com.android.perftests.textclassifier" />
<option name="hidden-api-checks" value="false"/>
</test>
</configuration>

View File

@@ -0,0 +1,8 @@
set -e
make TextClassifierPerfTests perf-setup.sh
adb install ${OUT}/testcases/TextClassifierPerfTests/arm64/TextClassifierPerfTests.apk
adb shell cmd package compile -m speed -f com.android.perftests.textclassifier
adb push ${OUT}/obj/EXECUTABLES/perf-setup.sh_intermediates/perf-setup.sh /data/local/tmp/
adb shell chmod +x /data/local/tmp/perf-setup.sh
adb shell /data/local/tmp/perf-setup.sh
adb shell am instrument -w -e package android.view.textclassifier com.android.perftests.textclassifier/androidx.test.runner.AndroidJUnitRunner

View File

@@ -0,0 +1,74 @@
/*
* Copyright (C) 2018 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 android.view.textclassifier;
import android.content.Context;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import android.perftests.utils.SettingsHelper;
import android.provider.Settings;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.LargeTest;
import org.junit.After;
import org.junit.Rule;
import org.junit.Test;
@LargeTest
public class TextClassificationManagerPerfTest {
@Rule
public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter();
@After
public void tearDown() {
SettingsHelper.delete(
SettingsHelper.NAMESPACE_GLOBAL, Settings.Global.TEXT_CLASSIFIER_CONSTANTS);
}
@Test
public void testGetTextClassifier_systemTextClassifierDisabled() {
Context context = InstrumentationRegistry.getTargetContext();
SettingsHelper.set(
SettingsHelper.NAMESPACE_GLOBAL,
Settings.Global.TEXT_CLASSIFIER_CONSTANTS,
"system_textclassifier_enabled=false");
TextClassificationManager textClassificationManager =
context.getSystemService(TextClassificationManager.class);
BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
while (state.keepRunning()) {
textClassificationManager.getTextClassifier();
textClassificationManager.invalidateForTesting();
}
}
@Test
public void testGetTextClassifier_systemTextClassifierEnabled() {
Context context = InstrumentationRegistry.getTargetContext();
SettingsHelper.set(
SettingsHelper.NAMESPACE_GLOBAL,
Settings.Global.TEXT_CLASSIFIER_CONSTANTS,
"system_textclassifier_enabled=true");
TextClassificationManager textClassificationManager =
context.getSystemService(TextClassificationManager.class);
BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
while (state.keepRunning()) {
textClassificationManager.getTextClassifier();
textClassificationManager.invalidateForTesting();
}
}
}

View File

@@ -0,0 +1,110 @@
/*
* Copyright (C) 2018 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 android.view.textclassifier;
import android.content.Context;
import android.perftests.utils.BenchmarkState;
import android.perftests.utils.PerfStatusReporter;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.LargeTest;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Random;
@RunWith(Parameterized.class)
@LargeTest
public class TextClassifierPerfTest {
/** Request contains meaning text, rather than garbled text. */
private static final int ACTUAL_REQUEST = 0;
private static final String RANDOM_CHAR_SET = "abcdefghijklmnopqrstuvwxyz0123456789";
@Rule
public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter();
@Parameterized.Parameters(name = "size{0}")
public static Collection<Object[]> data() {
return Arrays.asList(new Object[][]{{ACTUAL_REQUEST}, {10}, {100}, {1000}});
}
private TextClassifier mTextClassifier;
private final int mSize;
public TextClassifierPerfTest(int size) {
mSize = size;
}
@Before
public void setUp() {
Context context = InstrumentationRegistry.getTargetContext();
TextClassificationManager textClassificationManager =
context.getSystemService(TextClassificationManager.class);
mTextClassifier = textClassificationManager.getTextClassifier(TextClassifier.LOCAL);
}
@Test
public void testSuggestConversationActions() {
String text = mSize == ACTUAL_REQUEST ? "Where are you?" : generateRandomString(mSize);
ConversationActions.Request request = createConversationActionsRequest(text);
BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
while (state.keepRunning()) {
mTextClassifier.suggestConversationActions(request);
}
}
@Test
public void testDetectLanguage() {
String text = mSize == ACTUAL_REQUEST
? "これは日本語のテキストです" : generateRandomString(mSize);
TextLanguage.Request request = createTextLanguageRequest(text);
BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
while (state.keepRunning()) {
mTextClassifier.detectLanguage(request);
}
}
private static ConversationActions.Request createConversationActionsRequest(CharSequence text) {
ConversationActions.Message message =
new ConversationActions.Message.Builder(
ConversationActions.Message.PERSON_USER_OTHERS)
.setText(text)
.build();
return new ConversationActions.Request.Builder(Collections.singletonList(message))
.build();
}
private static TextLanguage.Request createTextLanguageRequest(CharSequence text) {
return new TextLanguage.Request.Builder(text).build();
}
private static String generateRandomString(int length) {
Random random = new Random();
StringBuilder stringBuilder = new StringBuilder(length);
for (int i = 0; i < length; i++) {
int index = random.nextInt(RANDOM_CHAR_SET.length());
stringBuilder.append(RANDOM_CHAR_SET.charAt(index));
}
return stringBuilder.toString();
}
}

View File

@@ -1,6 +1,9 @@
java_library {
name: "apct-perftests-utils",
static_libs: ["android-support-test"],
static_libs: [
"androidx.test.rules",
"androidx.annotation_annotation",
],
// Build all java files in the java subdirectory
srcs: ["**/*.java"],
}

View File

@@ -20,9 +20,10 @@ import android.app.Activity;
import android.app.Instrumentation;
import android.os.Bundle;
import android.os.Debug;
import android.support.test.InstrumentationRegistry;
import android.util.Log;
import androidx.test.InstrumentationRegistry;
import java.io.File;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;

View File

@@ -0,0 +1,82 @@
/*
* Copyright (C) 2018 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 android.perftests.utils;
import static android.perftests.utils.SettingsHelper.NAMESPACE_SECURE;
import android.content.ContentResolver;
import android.content.Context;
import android.database.ContentObserver;
import android.net.Uri;
import android.os.Handler;
import android.os.Looper;
import android.provider.Settings;
import androidx.annotation.NonNull;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
/**
* Helper used to block tests until a secure settings value has been updated.
*/
public final class OneTimeSettingsListener extends ContentObserver {
private final CountDownLatch mLatch = new CountDownLatch(1);
private final ContentResolver mResolver;
private final String mKey;
private final int mTimeoutMs;
public OneTimeSettingsListener(@NonNull Context context, @NonNull String namespace,
@NonNull String key, int timeoutMs) {
super(new Handler(Looper.getMainLooper()));
mKey = key;
mResolver = context.getContentResolver();
mTimeoutMs = timeoutMs;
final Uri uri;
switch (namespace) {
case NAMESPACE_SECURE:
uri = Settings.Secure.getUriFor(key);
break;
default:
throw new IllegalArgumentException("invalid namespace: " + namespace);
}
mResolver.registerContentObserver(uri, false, this);
}
@Override
public void onChange(boolean selfChange, Uri uri) {
mResolver.unregisterContentObserver(this);
mLatch.countDown();
}
/**
* Blocks for a few seconds until it's called, or throws an {@link IllegalStateException} if
* it isn't.
*/
public void assertCalled() {
try {
final boolean updated = mLatch.await(mTimeoutMs, TimeUnit.MILLISECONDS);
if (!updated) {
throw new IllegalStateException(
"Settings " + mKey + " not called in " + mTimeoutMs + "ms");
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new IllegalStateException("Interrupted", e);
}
}
}

View File

@@ -16,7 +16,7 @@
package android.perftests.utils;
import android.support.test.InstrumentationRegistry;
import androidx.test.InstrumentationRegistry;
import org.junit.rules.TestRule;
import org.junit.runner.Description;

View File

@@ -16,15 +16,17 @@
package android.perftests.utils;
import android.support.test.InstrumentationRegistry;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;
import android.util.Log;
import androidx.test.InstrumentationRegistry;
import org.junit.rules.TestRule;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;
/**
* Use this rule to make sure we report the status after the test success.
*
@@ -49,6 +51,7 @@ import static junit.framework.Assert.assertTrue;
*/
public class PerfStatusReporter implements TestRule {
private static final String TAG = "PerfStatusReporter";
private final BenchmarkState mState = new BenchmarkState();
public BenchmarkState getBenchmarkState() {
@@ -61,6 +64,8 @@ public class PerfStatusReporter implements TestRule {
@Override
public void evaluate() throws Throwable {
String invokeMethodName = description.getMethodName();
Log.i(TAG, "Running " + description.getClassName() + "#" + invokeMethodName);
// validate and simplify the function name.
// First, remove the "test" prefix which normally comes from CTS test.
// Then make sure the [subTestName] is valid, not just numbers like [0].

View File

@@ -0,0 +1,118 @@
/*
* Copyright (C) 2018 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 android.perftests.utils;
import android.content.Context;
import android.provider.Settings;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import java.util.Objects;
/**
* Provides utilities to interact with the device's {@link Settings}.
*/
public final class SettingsHelper {
public static final String NAMESPACE_SECURE = "secure";
public static final String NAMESPACE_GLOBAL = "global";
private static int DEFAULT_TIMEOUT_MS = 5000;
/**
* Uses a Shell command to "asynchronously" set the given preference, returning right away.
*/
public static void set(@NonNull String namespace, @NonNull String key, @Nullable String value) {
if (value == null) {
delete(namespace, key);
return;
}
ShellHelper.runShellCommand("settings put %s %s %s default", namespace, key, value);
}
/**
* Uses a Shell command to "synchronously" set the given preference by registering a listener
* and wait until it's set.
*/
public static void syncSet(@NonNull Context context, @NonNull String namespace,
@NonNull String key, @Nullable String value) {
if (value == null) {
syncDelete(context, namespace, key);
return;
}
String currentValue = get(namespace, key);
if (value.equals(currentValue)) {
// Already set, ignore
return;
}
OneTimeSettingsListener observer = new OneTimeSettingsListener(context, namespace, key,
DEFAULT_TIMEOUT_MS);
set(namespace, key, value);
observer.assertCalled();
assertNewValue(namespace, key, value);
}
/**
* Uses a Shell command to "asynchronously" delete the given preference, returning right away.
*/
public static void delete(@NonNull String namespace, @NonNull String key) {
ShellHelper.runShellCommand("settings delete %s %s", namespace, key);
}
/**
* Uses a Shell command to "synchronously" delete the given preference by registering a listener
* and wait until it's called.
*/
public static void syncDelete(@NonNull Context context, @NonNull String namespace,
@NonNull String key) {
String currentValue = get(namespace, key);
if (currentValue == null || currentValue.equals("null")) {
// Already set, ignore
return;
}
OneTimeSettingsListener observer = new OneTimeSettingsListener(context, namespace, key,
DEFAULT_TIMEOUT_MS);
delete(namespace, key);
observer.assertCalled();
assertNewValue(namespace, key, "null");
}
/**
* Gets the value of a given preference using Shell command.
*/
@NonNull
public static String get(@NonNull String namespace, @NonNull String key) {
return ShellHelper.runShellCommand("settings get %s %s", namespace, key);
}
private static void assertNewValue(@NonNull String namespace, @NonNull String key,
@Nullable String expectedValue) {
String actualValue = get(namespace, key);
if (!Objects.equals(actualValue, expectedValue)) {
throw new AssertionError("invalid value for " + namespace + ":" + key + ": expected '"
+ actualValue + "' , got '" + expectedValue + "'");
}
}
private SettingsHelper() {
throw new UnsupportedOperationException("contain static methods only");
}
}

View File

@@ -0,0 +1,39 @@
/*
* Copyright (C) 2018 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 android.perftests.utils;
import android.content.Context;
import android.provider.Settings;
import androidx.annotation.NonNull;
/**
* JUnit rule used to restore a {@link Settings} preference after the test is run.
*
* <p>It stores the current value before the test, and restores it after the test (if necessary).
*/
public class SettingsStateKeeperRule extends StateKeeperRule<String> {
/**
* Default constructor.
*
* @param context context used to retrieve the {@link Settings} provider.
* @param key prefence key.
*/
public SettingsStateKeeperRule(@NonNull Context context, @NonNull String key) {
super(new SettingsStateManager(context, SettingsHelper.NAMESPACE_SECURE, key));
}
}

View File

@@ -0,0 +1,63 @@
/*
* Copyright (C) 2018 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 android.perftests.utils;
import android.content.Context;
import android.provider.Settings;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
/**
* Manages the state of a preference backed by {@link Settings}.
*/
public class SettingsStateManager implements StateManager<String> {
private final Context mContext;
private final String mNamespace;
private final String mKey;
/**
* Default constructor.
*
* @param context context used to retrieve the {@link Settings} provider.
* @param namespace settings namespace.
* @param key prefence key.
*/
public SettingsStateManager(@NonNull Context context, @NonNull String namespace,
@NonNull String key) {
mContext = context;
mNamespace = namespace;
mKey = key;
}
@Override
public void set(@Nullable String value) {
SettingsHelper.syncSet(mContext, mNamespace, mKey, value);
}
@Override
@Nullable
public String get() {
return SettingsHelper.get(mNamespace, mKey);
}
@Override
public String toString() {
return "SettingsStateManager[namespace=" + mNamespace + ", key=" + mKey + "]";
}
}

View File

@@ -0,0 +1,71 @@
/*
* Copyright (C) 2018 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 android.perftests.utils;
import android.app.UiAutomation;
import android.os.ParcelFileDescriptor;
import android.text.TextUtils;
import android.util.AndroidRuntimeException;
import androidx.annotation.NonNull;
import androidx.test.InstrumentationRegistry;
import java.io.FileInputStream;
/**
* Provides Shell-based utilities such as running a command.
*/
public final class ShellHelper {
/**
* Runs a Shell command, returning a trimmed response.
*/
@NonNull
public static String runShellCommand(@NonNull String template, Object...args) {
String command = String.format(template, args);
return runShellCommandRaw(command);
}
/**
* Runs a Shell command, returning a trimmed response.
*/
@NonNull
public static String runShellCommandRaw(@NonNull String command) {
UiAutomation automan = InstrumentationRegistry.getInstrumentation()
.getUiAutomation();
ParcelFileDescriptor pfd = automan.executeShellCommand(command);
byte[] buf = new byte[512];
int bytesRead;
try(FileInputStream fis = new ParcelFileDescriptor.AutoCloseInputStream(pfd)) {
StringBuilder stdout = new StringBuilder();
while ((bytesRead = fis.read(buf)) != -1) {
stdout.append(new String(buf, 0, bytesRead));
}
String result = stdout.toString();
return TextUtils.isEmpty(result) ? "" : result.trim();
} catch (Exception e) {
throw new AndroidRuntimeException("Command '" + command + "' failed: ", e);
} finally {
// Must disconnect UI automation after every call, otherwise its accessibility service
// skews the performance tests.
automan.destroy();
}
}
private ShellHelper() {
throw new UnsupportedOperationException("contain static methods only");
}
}

View File

@@ -0,0 +1,63 @@
/*
* Copyright (C) 2018 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 android.perftests.utils;
import androidx.annotation.NonNull;
import org.junit.rules.TestRule;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;
import java.util.Objects;
/**
* JUnit rule used to restore a state after the test is run.
*
* <p>It stores the current state before the test, and restores it after the test (if necessary).
*/
public class StateKeeperRule<T> implements TestRule {
private final StateManager<T> mStateManager;
/**
* Default constructor.
*
* @param stateManager abstraction used to manage the state.
*/
public StateKeeperRule(StateManager<T> stateManager) {
mStateManager = stateManager;
}
@Override
public Statement apply(Statement base, Description description) {
return new Statement() {
@Override
public void evaluate() throws Throwable {
final T previousValue = mStateManager.get();
try {
base.evaluate();
} finally {
final T currentValue = mStateManager.get();
if (!Objects.equals(previousValue, currentValue)) {
mStateManager.set(previousValue);
}
}
}
};
}
}

View File

@@ -0,0 +1,34 @@
/*
* Copyright (C) 2018 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 android.perftests.utils;
import androidx.annotation.Nullable;
/**
* Abstraction for a state that is managed somewhere, like Android Settings.
*/
public interface StateManager<T> {
/**
* Sets a new state.
*/
void set(@Nullable T value);
/**
* Gets the current state.
*/
@Nullable T get();
}

View File

@@ -2,6 +2,14 @@
"presubmit": [
{
"name": "CtsCurrentApiSignatureTestCases"
},
{
"name": "CtsSystemApiSignatureTestCases"
}
],
"imports": [
{
"path": "vendor/xts/gts-tests/hostsidetests/api"
}
]
}

6694
api/current.txt Executable file → Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -32,7 +32,7 @@ package android.app {
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
field public static final int CONTENTS_FILE_DESCRIPTOR = 1; // 0x1
field public static final android.os.Parcelable.Creator<android.app.PictureInPictureArgs> CREATOR;
field @NonNull public static final android.os.Parcelable.Creator<android.app.PictureInPictureArgs> CREATOR;
field public static final int PARCELABLE_WRITE_RETURN_VALUE = 1; // 0x1
}
@@ -238,6 +238,11 @@ package android.graphics {
method @Deprecated public android.graphics.Rasterizer setRasterizer(android.graphics.Rasterizer);
}
public class Picture {
method @Deprecated public static android.graphics.Picture createFromStream(@NonNull java.io.InputStream);
method @Deprecated public void writeToStream(@NonNull java.io.OutputStream);
}
@Deprecated public class PixelXorXfermode extends android.graphics.Xfermode {
ctor public PixelXorXfermode(int);
}
@@ -291,6 +296,11 @@ package android.location {
method @Deprecated public void removeVerticalAccuracy();
}
public class LocationManager {
method @Deprecated @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public boolean addNmeaListener(android.location.GpsStatus.NmeaListener);
method @Deprecated public void removeNmeaListener(android.location.GpsStatus.NmeaListener);
}
}
package android.media {
@@ -347,7 +357,7 @@ package android.os {
public final class PowerManager {
method public void goToSleep(long);
method @Deprecated public void userActivity(long, boolean);
method public void wakeUp(long);
method @Deprecated public void wakeUp(long);
}
public class RecoverySystem {
@@ -355,11 +365,11 @@ package android.os {
}
public static final class StrictMode.ThreadPolicy.Builder {
method public android.os.StrictMode.ThreadPolicy.Builder penaltyListener(@NonNull android.os.StrictMode.OnThreadViolationListener, @NonNull java.util.concurrent.Executor);
method @NonNull public android.os.StrictMode.ThreadPolicy.Builder penaltyListener(@NonNull android.os.StrictMode.OnThreadViolationListener, @NonNull java.util.concurrent.Executor);
}
public static final class StrictMode.VmPolicy.Builder {
method public android.os.StrictMode.VmPolicy.Builder penaltyListener(@NonNull android.os.StrictMode.OnVmViolationListener, @NonNull java.util.concurrent.Executor);
method @NonNull public android.os.StrictMode.VmPolicy.Builder penaltyListener(@NonNull android.os.StrictMode.OnVmViolationListener, @NonNull java.util.concurrent.Executor);
}
public final class SystemClock {
@@ -510,6 +520,65 @@ package android.provider {
field @Deprecated public static final String TIMESTAMP = "timestamp";
}
public final class MediaStore {
method @Deprecated @NonNull public static android.net.Uri createPending(@NonNull android.content.Context, @NonNull android.provider.MediaStore.PendingParams);
method @Deprecated @NonNull public static java.util.Set<java.lang.String> getAllVolumeNames(@NonNull android.content.Context);
method @Deprecated @NonNull public static android.provider.MediaStore.PendingSession openPending(@NonNull android.content.Context, @NonNull android.net.Uri);
method @Deprecated @NonNull public static android.net.Uri setIncludeTrashed(@NonNull android.net.Uri);
method @Deprecated public static void trash(@NonNull android.content.Context, @NonNull android.net.Uri);
method @Deprecated public static void trash(@NonNull android.content.Context, @NonNull android.net.Uri, long);
method @Deprecated public static void untrash(@NonNull android.content.Context, @NonNull android.net.Uri);
}
public static interface MediaStore.Audio.AudioColumns extends android.provider.MediaStore.MediaColumns {
field public static final String DURATION = "duration";
}
public static interface MediaStore.DownloadColumns extends android.provider.MediaStore.MediaColumns {
field @Deprecated public static final String DESCRIPTION = "description";
}
public static interface MediaStore.Images.ImageColumns extends android.provider.MediaStore.MediaColumns {
field public static final String BUCKET_DISPLAY_NAME = "bucket_display_name";
field public static final String BUCKET_ID = "bucket_id";
field public static final String DATE_TAKEN = "datetaken";
field public static final String GROUP_ID = "group_id";
field public static final String ORIENTATION = "orientation";
}
public static interface MediaStore.MediaColumns extends android.provider.BaseColumns {
field @Deprecated public static final String GROUP_ID = "group_id";
field @Deprecated public static final String HASH = "_hash";
field @Deprecated public static final String IS_TRASHED = "is_trashed";
field @Deprecated public static final String PRIMARY_DIRECTORY = "primary_directory";
field @Deprecated public static final String SECONDARY_DIRECTORY = "secondary_directory";
}
@Deprecated public static class MediaStore.PendingParams {
ctor public MediaStore.PendingParams(@NonNull android.net.Uri, @NonNull String, @NonNull String);
method public void setDownloadUri(@Nullable android.net.Uri);
method public void setPrimaryDirectory(@Nullable String);
method public void setRefererUri(@Nullable android.net.Uri);
method public void setSecondaryDirectory(@Nullable String);
}
@Deprecated public static class MediaStore.PendingSession implements java.lang.AutoCloseable {
method public void abandon();
method public void close();
method public void notifyProgress(@IntRange(from=0, to=100) int);
method @NonNull public android.os.ParcelFileDescriptor open() throws java.io.FileNotFoundException;
method @NonNull public java.io.OutputStream openOutputStream() throws java.io.FileNotFoundException;
method @NonNull public android.net.Uri publish();
}
public static interface MediaStore.Video.VideoColumns extends android.provider.MediaStore.MediaColumns {
field public static final String BUCKET_DISPLAY_NAME = "bucket_display_name";
field public static final String BUCKET_ID = "bucket_id";
field public static final String DATE_TAKEN = "datetaken";
field public static final String DURATION = "duration";
field public static final String GROUP_ID = "group_id";
}
public static final class Settings.Global extends android.provider.Settings.NameValueTable {
field @Deprecated public static final String CONTACT_METADATA_SYNC = "contact_metadata_sync";
}
@@ -630,6 +699,13 @@ package android.widget {
method protected <T extends android.view.View> T findViewWithTagTraversal(Object);
}
public class PopupWindow {
method @Deprecated public boolean isClipToScreenEnabled();
method @Deprecated public boolean isLayoutInScreenEnabled();
method @Deprecated public void setClipToScreenEnabled(boolean);
method @Deprecated public void setLayoutInScreenEnabled(boolean);
}
@android.widget.RemoteViews.RemoteView public class TextView extends android.view.View implements android.view.ViewTreeObserver.OnPreDrawListener {
method public static int getTextColor(android.content.Context, android.content.res.TypedArray, int);
method public static android.content.res.ColorStateList getTextColors(android.content.Context, android.content.res.TypedArray);

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,18 @@
// Signature format: 2.0
package android {
public static final class Manifest.permission {
field public static final String MANAGE_DEVICE_ADMINS = "android.permission.MANAGE_DEVICE_ADMINS";
}
}
package android.app {
public class AppOpsManager {
method @Deprecated @NonNull @RequiresPermission(android.Manifest.permission.GET_APP_OPS_STATS) public java.util.List<android.app.AppOpsManager.PackageOps> getOpsForPackage(int, @NonNull String, @Nullable int[]);
}
public class Notification implements android.os.Parcelable {
method public static Class<? extends android.app.Notification.Style> getNotificationStyleClass(String);
}
@@ -20,6 +32,25 @@ package android.app.admin {
}
package android.app.backup {
public class RestoreSession {
method @Deprecated public int restoreSome(long, android.app.backup.RestoreObserver, android.app.backup.BackupManagerMonitor, String[]);
method @Deprecated public int restoreSome(long, android.app.backup.RestoreObserver, String[]);
}
}
package android.app.prediction {
public static final class AppTarget.Builder {
ctor @Deprecated public AppTarget.Builder(@NonNull android.app.prediction.AppTargetId);
method @Deprecated @NonNull public android.app.prediction.AppTarget.Builder setTarget(@NonNull String, @NonNull android.os.UserHandle);
method @Deprecated @NonNull public android.app.prediction.AppTarget.Builder setTarget(@NonNull android.content.pm.ShortcutInfo);
}
}
package android.content {
public class Intent implements java.lang.Cloneable android.os.Parcelable {
@@ -52,6 +83,41 @@ package android.content {
}
package android.content.pm {
public class PackageItemInfo {
field @Deprecated public static final int SAFE_LABEL_FLAG_FIRST_LINE = 4; // 0x4
field @Deprecated public static final int SAFE_LABEL_FLAG_SINGLE_LINE = 2; // 0x2
field @Deprecated public static final int SAFE_LABEL_FLAG_TRIM = 1; // 0x1
}
}
package android.hardware.hdmi {
public final class HdmiControlManager {
method @Deprecated public java.util.List<android.hardware.hdmi.HdmiDeviceInfo> getConnectedDevicesList();
method @Deprecated public boolean isRemoteDeviceConnected(@NonNull android.hardware.hdmi.HdmiDeviceInfo);
method @Deprecated public void powerOffRemoteDevice(@NonNull android.hardware.hdmi.HdmiDeviceInfo);
method @Deprecated public void powerOnRemoteDevice(android.hardware.hdmi.HdmiDeviceInfo);
method @Deprecated public void requestRemoteDeviceToBecomeActiveSource(@NonNull android.hardware.hdmi.HdmiDeviceInfo);
}
}
package android.location {
public class LocationManager {
method @Deprecated public boolean addGpsMeasurementListener(android.location.GpsMeasurementsEvent.Listener);
method @Deprecated public boolean addGpsNavigationMessageListener(android.location.GpsNavigationMessageEvent.Listener);
method @Deprecated public void removeGpsMeasurementListener(android.location.GpsMeasurementsEvent.Listener);
method @Deprecated public void removeGpsNavigationMessageListener(android.location.GpsNavigationMessageEvent.Listener);
method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void setLocationControllerExtraPackage(String);
method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void setLocationControllerExtraPackageEnabled(boolean);
}
}
package android.media.tv {
public final class TvInputManager {
@@ -82,7 +148,7 @@ package android.net.wifi {
package android.os {
public class Build {
field public static final boolean PERMISSIONS_REVIEW_REQUIRED;
field public static final boolean PERMISSIONS_REVIEW_REQUIRED = true;
}
public final class PowerManager {
@@ -92,34 +158,15 @@ package android.os {
}
package android.security.keystore.recovery {
package android.provider {
public final class KeyChainSnapshot implements android.os.Parcelable {
method @Deprecated @NonNull public byte[] getTrustedHardwarePublicKey();
public final class DeviceConfig {
method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static void addOnPropertyChangedListener(@NonNull String, @NonNull java.util.concurrent.Executor, @NonNull android.provider.DeviceConfig.OnPropertyChangedListener);
method public static void removeOnPropertyChangedListener(@NonNull android.provider.DeviceConfig.OnPropertyChangedListener);
}
public class RecoveryController {
method @Deprecated @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public byte[] generateAndStoreKey(@NonNull String, byte[]) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.LockScreenRequiredException;
method @Deprecated @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public java.security.Key generateKey(@NonNull String, byte[]) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.LockScreenRequiredException;
method @Deprecated @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public java.util.List<java.lang.String> getAliases(@Nullable String) throws android.security.keystore.recovery.InternalRecoveryServiceException;
method @Deprecated @Nullable @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public android.security.keystore.recovery.KeyChainSnapshot getRecoveryData() throws android.security.keystore.recovery.InternalRecoveryServiceException;
method @Deprecated @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public int getRecoveryStatus(String, String) throws android.security.keystore.recovery.InternalRecoveryServiceException;
method @Deprecated @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public void initRecoveryService(@NonNull String, @NonNull byte[]) throws java.security.cert.CertificateException, android.security.keystore.recovery.InternalRecoveryServiceException;
method @Deprecated @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public void setRecoveryStatus(@NonNull String, String, int) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.content.pm.PackageManager.NameNotFoundException;
}
public class RecoverySession implements java.lang.AutoCloseable {
method @Deprecated @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public java.util.Map<java.lang.String,byte[]> recoverKeys(@NonNull byte[], @NonNull java.util.List<android.security.keystore.recovery.WrappedApplicationKey>) throws android.security.keystore.recovery.DecryptionFailedException, android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.SessionExpiredException;
method @Deprecated @NonNull @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public byte[] start(@NonNull byte[], @NonNull byte[], @NonNull byte[], @NonNull java.util.List<android.security.keystore.recovery.KeyChainProtectionParams>) throws java.security.cert.CertificateException, android.security.keystore.recovery.InternalRecoveryServiceException;
method @Deprecated @NonNull @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public byte[] start(@NonNull java.security.cert.CertPath, @NonNull byte[], @NonNull byte[], @NonNull java.util.List<android.security.keystore.recovery.KeyChainProtectionParams>) throws java.security.cert.CertificateException, android.security.keystore.recovery.InternalRecoveryServiceException;
}
public final class WrappedApplicationKey implements android.os.Parcelable {
method @Deprecated @NonNull public byte[] getAccount();
}
public static class WrappedApplicationKey.Builder {
method @Deprecated public android.security.keystore.recovery.WrappedApplicationKey.Builder setAccount(@NonNull byte[]);
public static interface DeviceConfig.OnPropertyChangedListener {
method public void onPropertyChanged(@NonNull String, @NonNull String, @Nullable String);
}
}
@@ -144,6 +191,14 @@ package android.service.notification {
}
package android.telecom {
public class TelecomManager {
method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.MODIFY_PHONE_STATE, android.Manifest.permission.WRITE_SECURE_SETTINGS}) public boolean setDefaultDialer(@Nullable String);
}
}
package android.telephony {
public class TelephonyManager {

File diff suppressed because it is too large Load Diff

View File

@@ -1 +1,23 @@
// Signature format: 2.0
package android.app.prediction {
public static final class AppTarget.Builder {
method @Deprecated @NonNull public android.app.prediction.AppTarget.Builder setTarget(@NonNull String, @NonNull android.os.UserHandle);
method @Deprecated @NonNull public android.app.prediction.AppTarget.Builder setTarget(@NonNull android.content.pm.ShortcutInfo);
}
}
package android.provider {
public final class DeviceConfig {
method @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public static void addOnPropertyChangedListener(@NonNull String, @NonNull java.util.concurrent.Executor, @NonNull android.provider.DeviceConfig.OnPropertyChangedListener);
method public static void removeOnPropertyChangedListener(@NonNull android.provider.DeviceConfig.OnPropertyChangedListener);
}
public static interface DeviceConfig.OnPropertyChangedListener {
method public void onPropertyChanged(@NonNull String, @NonNull String, @Nullable String);
}
}

View File

@@ -38,6 +38,7 @@ message ResultsBundle {
message TestStatus {
optional sint32 result_code = 3;
optional ResultsBundle results = 4;
optional string logcat = 5;
}
enum SessionStatusCode {

View File

@@ -175,7 +175,7 @@ public class Am extends BaseCommand {
} else if (opt.equals("--no-hidden-api-checks")) {
instrument.disableHiddenApiChecks = true;
} else if (opt.equals("--no-isolated-storage")) {
// NOTE: currently a no-op in this branch
instrument.disableIsolatedStorage = true;
} else if (opt.equals("--user")) {
instrument.userId = parseUserArg(nextArgRequired());
} else if (opt.equals("--abi")) {

Some files were not shown because too many files have changed in this diff Show More