Status Update
Comments
di...@target.com <di...@target.com> #2
This is a particularly hard device to come by - do you happen to have access to the device? If so could you provide us with the output of: adb shell dumpsys media.camera > info.txt
Thanks!
ra...@google.com <ra...@google.com>
ma...@google.com <ma...@google.com> #3
Stacktrace:
Caused by: java.lang.IllegalArgumentException: Can not get supported output size under supported maximum for the format: 34
at androidx.camera.camera2.internal.SupportedSurfaceCombination.getSupportedOutputSizes(SupportedSurfaceCombination.java:355)
at androidx.camera.camera2.internal.SupportedSurfaceCombination.getSuggestedResolutions(SupportedSurfaceCombination.java:197)
at androidx.camera.camera2.internal.Camera2DeviceSurfaceManager.getSuggestedResolutions(Camera2DeviceSurfaceManager.java:198)
at androidx.camera.core.CameraX.calculateSuggestedResolutions(CameraX.java:943)
at androidx.camera.core.CameraX.bindToLifecycle(CameraX.java:293)
at androidx.camera.lifecycle.ProcessCameraProvider.bindToLifecycle(ProcessCameraProvider.java:227)
Below are some findings based on our debugging
When Dex is connected
previewConfig.getMaxResolution() is returning "731x411" as maxSize.
Inside Preview.Builder.build() -> Default_MAX_resolution is set to "CameraX.getSurfaceManager().getPreviewSize()" which is 731x411
this is being picked as maxSize.
While rendering maxSize is 731x411 and minSize is 640x480 and below are available outputSizes
0 = {Size@11860} "4032x3024"
1 = {Size@11861} "3984x2988"
2 = {Size@11862} "4032x2268"
3 = {Size@11863} "3024x3024"
4 = {Size@11864} "2976x2976"
5 = {Size@11865} "3840x2160"
6 = {Size@11866} "3264x2448"
7 = {Size@11867} "4032x1960"
8 = {Size@11868} "2880x2160"
9 = {Size@11869} "3264x1836"
10 = {Size@11870} "2160x2160"
11 = {Size@11871} "2560x1440"
12 = {Size@11872} "2224x1080"
13 = {Size@11873} "2048x1152"
14 = {Size@11874} "1920x1080"
15 = {Size@11875} "1440x1080"
16 = {Size@11876} "1088x1088"
17 = {Size@11877} "1280x720"
18 = {Size@11878} "1024x768"
19 = {Size@11879} "1056x704"
20 = {Size@11880} "960x720"
21 = {Size@11881} "960x540"
22 = {Size@11882} "720x720"
23 = {Size@11883} "800x450"
24 = {Size@11884} "720x480"
25 = {Size@11885} "640x480"
26 = {Size@11886} "352x288"
27 = {Size@11887} "320x240"
28 = {Size@11888} "256x144"
29 = {Size@11889} "176x144"
and couldn't find any size in this range.
When Dex not connected
minsize = 640x480
maxsize = 1920x1080
0 = {Size@11836} "4032x3024"
1 = {Size@11837} "3984x2988"
2 = {Size@11838} "4032x2268"
3 = {Size@11839} "3024x3024"
4 = {Size@11840} "2976x2976"
5 = {Size@11841} "3840x2160"
6 = {Size@11842} "3264x2448"
7 = {Size@11843} "4032x1960"
8 = {Size@11844} "2880x2160"
9 = {Size@11845} "3264x1836"
10 = {Size@11846} "2160x2160"
11 = {Size@11847} "2560x1440"
12 = {Size@11848} "2224x1080"
13 = {Size@11849} "2048x1152"
14 = {Size@11850} "1920x1080"
15 = {Size@11851} "1440x1080"
16 = {Size@11852} "1088x1088"
17 = {Size@11853} "1280x720"
18 = {Size@11854} "1024x768"
19 = {Size@11855} "1056x704"
20 = {Size@11856} "960x720"
21 = {Size@11857} "960x540"
22 = {Size@11858} "720x720"
23 = {Size@11859} "800x450"
24 = {Size@11860} "720x480"
25 = {Size@11861} "640x480"
26 = {Size@11862} "352x288"
27 = {Size@11863} "320x240"
28 = {Size@11864} "256x144"
29 = {Size@11865} "176x144"
and we have 12 available sizes in this range
Camera2DeviceSurfaceManager.java:: getPreviewSize()
mCameraSupportedSurfaceCombinationMap.get(cameraId).getSurfaceDefinition().getPreviewSize() = "1920x1080"
cameraId=0
di...@gmail.com <di...@gmail.com> #4
di...@target.com <di...@target.com> #5
> A temporary workaround for this situation is to use Preview.Builder#setTargetResolution() to set a size smaller than 640x480 to bypass the problem.
OK. I will try it.
> Could you confirm that the problem exist on arrowsM04 device?
We receive the crash report (Crashlytics) that this crash has occurred on arrowsM04.
We don't have this device so we can't confirm that the problem really exist on arrowsM04.
> What will be the returned value when using Display#getRealSize to obtain the display size?
We can't investigate it for the same reason.
Thank you.
ma...@google.com <ma...@google.com> #6
This issue happened on devices that the display size is smaller than 640x480. In original auto-resolution mechanism, supported sizes smaller than 640x480 will be default filter out.
The auto-resolution mechanism encodes the guaranteed configurations tables in CameraDevice#createCaptureSession(SessionConfiguration). It defines that the PREVIEW size is the small one of the device display size and 1080p. The PREVIEW size will be the maximal size limitation for Preview use case. The reason it limits the size to display size and 1080p is the stream output in display size or 1080p has been able to provide good enough preview quality. Therefore, auto-resolution mechanism will limit the selected size to be smaller than the small one of the device display size and 1080p.
With above two conditions, in this issue, all sizes smaller than 640x480 have been filter out, therefore, there is no size smaller than the display size 320x240 can be selected to use. And cause the exception.
Solution:
When the display size is smaller than 640x480, auto-resolution mechanism won't filter out those small sizes smaller than 640x480. This makes those small size be left and can be selected for the Preview use case on small display devices.
The solution has been merged and will be included in next CameraX release.
ma...@google.com <ma...@google.com> #7
Hello.
This crash still occurs.
- CAMERAX VERSION: 1.0.0-beta4
- ANDROID OS BUILD NUMBER: Android 7.1.1
- DEVICE NAME: FUJITSU F-02H
We receive following crash report from FUJITSU F-02H. So far We have received this crash report only from F-02H.
java.lang.IllegalArgumentException
Can not get supported output size under supported maximum for the format: 34
androidx.camera.camera2.internal.SupportedSurfaceCombination.getSupportedOutputSizes (SupportedSurfaceCombination.java:349)
androidx.camera.camera2.internal.SupportedSurfaceCombination.getSuggestedResolutions (SupportedSurfaceCombination.java:197)
androidx.camera.camera2.internal.Camera2DeviceSurfaceManager.getSuggestedResolutions (Camera2DeviceSurfaceManager.java:198)
androidx.camera.core.CameraX.calculateSuggestedResolutions (CameraX.java:949)
androidx.camera.core.CameraX.bindToLifecycle (CameraX.java:351)
androidx.camera.lifecycle.ProcessCameraProvider.bindToLifecycle (ProcessCameraProvider.java:230)
(our application's package name).CameraFragment.bindCameraUseCases (CameraFragment.java:174)
di...@target.com <di...@target.com> #8
Could you help to provide the following information to clarify the issue?
1. Is the full name of the device Fujitsu Arrows NX F-02H that has a 1440x2560 display?
2. Please help to provide the supported output sizes of ImageFormat.PRIVATE that is obtained by StreamConfigurationMap#getOutputSizes(int).
di...@target.com <di...@target.com> #9
- Is the full name of the device Fujitsu Arrows NX F-02H that has a 1440x2560 display?
Yes
- Please help to provide the supported output sizes of ImageFormat.PRIVATE that is obtained by StreamConfigurationMap#getOutputSizes(int).
Since we don't have this device, we'll try to collect this information in the next version of our app. The next version will be released later this month.
ma...@google.com <ma...@google.com> #10
Hello.
- Please help to provide the supported output sizes of ImageFormat.PRIVATE that is obtained by StreamConfigurationMap#getOutputSizes(int).
We have collected the output of the device where the crash occurs.
Device1
- Model : arrows Be F-05J
- Android Version : 7.1.1
- Supported output sizes of ImageFormat.PRIVATE
CameraId 0: 480x480
CameraId 1: 2048x1536 ,1920x1080 ,1280x720 ,960x720 ,640x480 ,320x240 ,176x144
Device2
- Model : Fujitsu arrows M04
- Android Version : 7.1.1
- Supported output sizes of ImageFormat.PRIVATE
CameraId 0: 480x480
CameraId 1: 2048x1536 ,1920x1080 ,1280x720 ,960x720 ,640x480 ,320x240 ,176x144
Additional Information
CameraX version : 1.0.0-beta04
We collect the supported output sizes by following code.
val errorString = buildString {
append("The supported output sizes of ImageFormat.PRIVATE: ")
(requireContext().getSystemService(Context.CAMERA_SERVICE) as CameraManager).apply {
cameraIdList.forEachIndexed { index, cameraId ->
val msg = if (VERSION.SDK_INT >= VERSION_CODES.M) {
val configurationMap =
getCameraCharacteristics(cameraId).get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP)
val sizes = configurationMap?.getOutputSizes(ImageFormat.PRIVATE)
"CameraId $index: ${sizes?.joinToString(" ,")}"
} else {
"CameraId $index: This device version is under M."
}
append(msg)
}
}
}
di...@target.com <di...@target.com> #11
di...@target.com <di...@target.com> #12
I tried to find the device specs and both 720x1280
size display. For the camera id 0 device, it is a different case that the display size is larger than 640x480
but the device only supports a 480x480
size. The case also caused the same IllegalArgumentException and was also fixed by 1.0.0-beta04
release. Before 480x480
size would be filtered out and then caused the IllegalArgumentException. After it was merged, the 640x480
size threshold was removed and then the 480x480
size would be kept and selected to use.
It looks like 1.0.0-beta04
release had been used to collect the supported sizes information. But the issue should have been fixed by 1.0.0-beta04
release. Did you only check the device model name to collect the supported sizes information or collect the information when the IllegalArgumentException issue happens again?
CameraX's 1.0.0-beta04
version. Maybe you can also consider to upgrade to the latest 1.0.0-rc01
version for your application. Thanks.
ma...@google.com <ma...@google.com> #13
Did you only check the device model name to collect the supported sizes information or collect the information when the IllegalArgumentException issue happens again?
We collect informations only from the device on which IllegalArgumentException happened.
Our latest app uses CameraX version 1.0.0-beta10
and this issue still occurres.
However we don't receive crash report from Fujitsu arrows Be F-05J
or Fujitsu arrows M04
so far. (This doesn't mean this issue is fixed on these devices because our app is heavily rely on camera so these device's user wouldn't use our app anymore.)
Instead, we receive crash report from
- Model : Fujitsu F-03K
- Android Version : 7.1.2
- Supported output sizes of ImageFormat.PRIVATE
CameraId 0 : 480x480
CameraId 1 : 2048x1536 ,1920x1080 ,1280x720 ,960x720 ,640x480 ,320x240 ,176x144
di...@target.com <di...@target.com> #14
I missed some settings when I simulated the issue by robolectric test so that I was not able to reproduce it. Now, I can reproduce the issue if the device only supports one 480x480 resolution. I'm working on the solution and target to make it included in next release.
ma...@google.com <ma...@google.com> #15
Branch: androidx-main
commit 69d15dff7bb857ee33a0f643ff42a0f8bc475ab2
Author: charcoalchen <charcoalchen@google.com>
Date: Fri Jan 08 18:30:03 2021
Fixed IllegalArgumentException issue happened when all preview supported sizes are smaller than 640x480 and display size is larger than 640x480.
Do not filter out sizes smaller than 640x480 when all preview supported sizes are smaller than 640x480 and display size is larger than 640x480.
Relnote:"Fixed IllegalArgumentException issue happened when all preview supported sizes are smaller than 640x480 and display size is larger than 640x480."
Bug: 150506192
Test: SupportedSurfaceCombinationTest
Change-Id: I2a63ce8e2ad42a9cc060c8635ac3603bf440b1ec
M camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/SupportedSurfaceCombination.java
M camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/SupportedSurfaceCombinationTest.java
ed...@gmail.com <ed...@gmail.com> #16
bu...@google.com <bu...@google.com> #18
di...@target.com <di...@target.com> #19
I am unable to access
ma...@google.com <ma...@google.com> #20
That task is internal.
This task can be fixed only when that one is completed.
za...@gmail.com <za...@gmail.com> #21
Could the internal issue be made public? It's not clear from the (sparse) docs I could find on managed devices and baseline profile generation that only GMDs were supported.
be...@google.com <be...@google.com> #22
Thanks for flagging this problem. If you're facing it, use the +1 button.
This issue will be added to the
li...@gmail.com <li...@gmail.com> #23
I've come to this issue from the list of known issues of Baseline Profiles plugin. There it says:
Baseline Profile generation isn't supported on Firebase Test Lab devices, including Gradle-managed Test Lab devices
However,
When testing the application on a physical device (from FTL) with API 33, the profiles were successfully generated.
So, does it mean that it's actually possible to generate baseline profile using FTL devices?
se...@team.bumble.com <se...@team.bumble.com> #24
FWIW, I can generate baseline profiles using FTL ARM device but without AndroidX Baseline Profile Gradle plugin. The FTL Gradle plugin currently doesn't honour instrumentation runner arguments (see
It would be great if AndroidX Baseline Profile and FTL plugins could finally work properly together, but I don't get my hopes up as the FTL plugin has seen very little development this year.
li...@gmail.com <li...@gmail.com> #25
FWIW, I can generate baseline profiles using FTL ARM device but without AndroidX Benchmark Gradle plugin.
Do you mean w/o androidx.baselineprofile
plugin? How do you run the benchmarks/fetch the profiles then? It would be awesome if you could share your setup.
bu...@google.com <bu...@google.com>
se...@team.bumble.com <se...@team.bumble.com> #26
com.android.test
), and tell FTL plugin to pull the contents of the package-specific media directory where the generated baseline profiles are saved.
plugins {
id("com.google.firebase.testlab")
}
testLab {
managedDevices{
create("firebaseSmallPhone") {
device = "SmallPhone.arm"
apiLevel = 34
}
}
testOptions {
results {
directoriesToPull.set(
listOf("/sdcard/Android/media/${android.namespace}")
)
}
}
}
At the end of the build, I copy the pulled baseline profile to the src directory:
find <path to baseline profile module>/build/outputs -name '*-baseline-prof.txt' \
-exec cp {} <path to app module>/src/main/baselineProfiles/baseline-prof.txt \;
li...@gmail.com <li...@gmail.com> #27
Thanks!
Could you please specify how you launch a baseline profile generator with this setup? Simply as an instrumentation test?
A little side note. I though that the whole issue is that the folder, where profiles are generated, is always different on an FTL device. With the above setup, what actually prevent you from using the Baseline Profile plugin?
ma...@google.com <ma...@google.com> #28
With aosp/3267102, the ftl plugin can now be used with the baseline profile gradle plugin as well. This will be added in version 1.3.2.
In order to use, simply add a baseline profile module, for example :baselineprofile
and add the following to build.gradle
:
plugins {
...
id("androidx.baselineprofile")
id("com.google.firebase.testlab")
}
...
firebaseTestLab {
// Credentials for FTL service
serviceAccountCredentials.set(file("credentials.json"))
// Creates one or more managed devices to run the tests on.
managedDevices {
"ftlDeviceShiba34" {
device = "shiba"
apiLevel = 34
}
}
// Ensures the baseline profile are pulled from the device.
// Note that this will be automated as well later with aosp/3272935.
testOptions {
results {
directoriesToPull.addAll(\"/storage/emulated/0/Android/media/${android.namespace}\")
}
}
}
baselineProfile {
...
managedDevices += "ftlDeviceShiba34"
useConnectedDevices = false
}
ap...@google.com <ap...@google.com> #29
Branch: androidx-main
commit 7e25ec644b2fd621b7a96016f9e397dab254540d
Author: Marcello Albano <maralb@google.com>
Date: Tue Sep 17 15:11:56 2024
Added support for FTL to Baseline Profile Gradle Plugin
FTL devices don't use per test artifacts, rather global ones,
so in test-results.pb they need to be found separately.
Note that the ftl plugin still needs to be configured separately.
Relnote: "Added support for FTL to Baseline Profile Gradle Plugin.
To use FTL apply the plugin to the baseline profile module in the
plugin block, with:
```
plugins {
...
id(\"com.google.firebase.testlab\")
}
```
and then configure firebase test lab with:
```
firebaseTestLab {
// Credentials for FTL service
serviceAccountCredentials.set(file(\"credentials.json\"))
// Creates one or more managed devices to run the tests on.
managedDevices {
\"ftlDeviceShiba34\" {
device = \"shiba\"
apiLevel = 34
}
}
// Ensures the baseline profile are pulled from the device.
// Note that this will be automated as well later with aosp/3272935.
testOptions {
results {
directoriesToPull.addAll(\"/storage/emulated/0/Android/media/${android.namespace}\")
}
}
}
```
Also the created ftl device needs to be added to the baseline profile extension:
```
baselineProfile {
managedDevices += \"ftlDeviceShiba34\"
useConnectedDevices = false
}
```"
Test: ./gradlew :benchmark:benchmark-baseline-profile-gradle-plugin:test
Bug: 285187547
Change-Id: I2f6789d81a32d04df976437c2be426cbe04488ac
M benchmark/baseline-profile-gradle-plugin/src/main/kotlin/androidx/baselineprofile/gradle/producer/tasks/CollectBaselineProfileTask.kt
M benchmark/baseline-profile-gradle-plugin/src/test/kotlin/androidx/baselineprofile/gradle/consumer/BaselineProfileConsumerPluginTest.kt
M benchmark/baseline-profile-gradle-plugin/src/test/kotlin/androidx/baselineprofile/gradle/utils/BaselineProfileProjectSetupRule.kt
M benchmark/baseline-profile-gradle-plugin/src/test/kotlin/androidx/baselineprofile/gradle/utils/TestUtils.kt
li...@gmail.com <li...@gmail.com> #30
I apologise for posting an offtopic, but attempting to setup Baseline Profiles generation, using the above instructions and FTL Gradle plugin, I've encountered a strange dependency issue:
Firebase section of the issue tracker is not available for me, so posting a reference here with a hope, that somebody with access could check for duplicates and maybe suggest a solution.
ma...@google.com <ma...@google.com> #31
Thanks, the dependency issue is a different one already been tracked. Closing this one.
li...@gmail.com <li...@gmail.com> #32
Thanks!
Which version is this fix coming to? Will it be 1.3.2 or we'll need to wait for 1.4.0 release?
pr...@google.com <pr...@google.com> #33
The following release(s) address this bug.It is possible this bug has only been partially addressed:
androidx.annotation:annotation-wasm-js:1.9.0-rc01
androidx.annotation:annotation-watchosdevicearm64:1.9.0-rc01
androidx.benchmark:benchmark-baseline-profile-gradle-plugin:1.3.2
androidx.benchmark:benchmark-baseline-profile-gradle-plugin:1.4.0-alpha02
mo...@hungerstation.com <mo...@hungerstation.com> #34
Hello googlers,
I did as this
Our CI stack is Bitrise + Fastlane, I'm getting this error even when i run this sh "gcloud auth activate-service-account --key-file=#{decoded_service_account}"
Execution failed for task ':macrobenchmark:ftlDeviceShiba34Setup'.
A failure occurred while executing com.android.build.gradle.internal.tasks.ManagedDeviceSetupTask$SetupTaskWorkAction Unable to find the application-default credentials to send a request to Firebase TestLab. Please initialize your credentials using gcloud CLI. Examples: gcloud config set project $YOUR_PROJECT_ID gcloud auth application-default login gcloud auth application-default set-quota-project $YOUR_PROJECT_ID Please read
https://cloud.google.com/sdk/gcloud for details.
Description
We are trying to generate Baseline Profiles for our application using the BaselineProfiles plugin and since we want to generate it on our CI/CD pipelines we are exploring Gradle Managed devices.
As there is an already existing issue where Gradle Managed devices fail to setup on Linux machines, we are exploring the new feature of using Firebase Test Lab devices as Gradle Managed devices .
I am following the performance sample app and included the changes mentioned for running tests on Firebase Test Lab devices as Gradle Managed device. When the task
generateBaselineProfile
runs locally, Baseline Profiles are generated correctly. However, when run on the FTL configured device, tests are running successfully, but the profiles are not generated and I see this message in the output:Comparing the logs from local and FTL, I could see that the profiles are generated in a directory different than the task tries to extract from:
When run locally, I can see that it is using the same location from which it is later extracted:
Setup:
Android Studio Hedgehog | 2023.1.1 Canary 5
Build #AI-231.7864.76.2311.10195651, built on May 25, 2023
Runtime version: 17.0.6+0-17.0.6b829.9-10027231 aarch64
AGP 8.2.0-alpha05
Benchmark 1.2.0-alpha13
Could the copying be an issue?
I have attached the performance sample app code with the changes. Run it in the above configuration with FTL setup and should see a similar output.