Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

NoClassDefFoundError: android/app/ApplicationExitInfo on 4.6 #6589

Closed
jankowskib opened this issue Jul 2, 2021 · 7 comments · Fixed by #6590
Closed

NoClassDefFoundError: android/app/ApplicationExitInfo on 4.6 #6589

jankowskib opened this issue Jul 2, 2021 · 7 comments · Fixed by #6590

Comments

@jankowskib
Copy link

Description

When I lower sdk via @Config it'll cause NoClassDefFoundError and test fails

java.lang.NoClassDefFoundError: android/app/ApplicationExitInfo
	at java.base/java.lang.Class.getDeclaredMethods0(Native Method)
	at java.base/java.lang.Class.privateGetDeclaredMethods(Class.java:3166)
	at java.base/java.lang.Class.getDeclaredMethod(Class.java:2473)
	at org.robolectric.internal.bytecode.ShadowWrangler.findShadowMethodDeclaredOnClass(ShadowWrangler.java:319)
	at org.robolectric.internal.bytecode.ShadowWrangler.findShadowMethod(ShadowWrangler.java:288)
	at org.robolectric.internal.bytecode.ShadowWrangler.pickShadowMethod(ShadowWrangler.java:265)
	at org.robolectric.internal.bytecode.ShadowWrangler.classInitializing(ShadowWrangler.java:160)
	at org.robolectric.internal.bytecode.RobolectricInternals.classInitializing(RobolectricInternals.java:21)
	at android.app.ActivityManager.<clinit>(ActivityManager.java)
	at android.content.pm.PackageParser.parseActivity(PackageParser.java:3156)
	at android.content.pm.PackageParser.parseBaseApplication(PackageParser.java:2677)
	at android.content.pm.PackageParser.parseBaseApk(PackageParser.java:1462)
	at android.content.pm.PackageParser.parseBaseApk(PackageParser.java:890)
	at android.content.pm.PackageParser.parseMonolithicPackage(PackageParser.java:838)
	at android.content.pm.PackageParser.parsePackage(PackageParser.java:756)
	at org.robolectric.shadows.ShadowPackageParser.callParsePackage(ShadowPackageParser.java:47)
	at org.robolectric.android.internal.AndroidTestEnvironment.loadAppPackage_measured(AndroidTestEnvironment.java:386)
	at org.robolectric.android.internal.AndroidTestEnvironment.lambda$loadAppPackage$3(AndroidTestEnvironment.java:358)
	at org.robolectric.util.PerfStatsCollector.measure(PerfStatsCollector.java:53)
	at org.robolectric.android.internal.AndroidTestEnvironment.loadAppPackage(AndroidTestEnvironment.java:358)
	at org.robolectric.android.internal.AndroidTestEnvironment.installAndCreateApplication(AndroidTestEnvironment.java:257)
	at org.robolectric.android.internal.AndroidTestEnvironment.lambda$createApplicationSupplier$0(AndroidTestEnvironment.java:229)
	at org.robolectric.util.PerfStatsCollector.measure(PerfStatsCollector.java:53)
	at org.robolectric.android.internal.AndroidTestEnvironment.lambda$createApplicationSupplier$1(AndroidTestEnvironment.java:226)
	at com.google.common.base.Suppliers$NonSerializableMemoizingSupplier.get(Suppliers.java:167)
	at org.robolectric.RuntimeEnvironment.getApplication(RuntimeEnvironment.java:71)
	at org.robolectric.android.internal.AndroidTestEnvironment.setUpApplicationState(AndroidTestEnvironment.java:194)
	at org.robolectric.RobolectricTestRunner.beforeTest(RobolectricTestRunner.java:321)
	at org.robolectric.internal.SandboxTestRunner$2.lambda$evaluate$0(SandboxTestRunner.java:269)
	at org.robolectric.internal.bytecode.Sandbox.lambda$runOnMainThread$0(Sandbox.java:89)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:834)

However If I bump compileSdk to 30 error does not happen

Steps to Reproduce

Set app's target/compileSdkVersion to 29
Add @Config(sdk = [Build.VERSION_CODES.M]) (or any lower sdk than R) to a test case

Robolectric & Android Version

4.6, 29

@utzcoz
Copy link
Member

utzcoz commented Jul 2, 2021

Looks like some logic uses ApplicationExitInfo added from SDK 30 when config is less than 30. Hi @jankowskib , could you help to provide minimum reproduce sample?

@jankowskib
Copy link
Author

Here's minimal sample: https://github.com/jankowskib/ApplicationExitInfo
Just run ExampleUnitTest

@utzcoz
Copy link
Member

utzcoz commented Jul 2, 2021

Thanks. Looks like ShadowActivityManager uses ApplicationExitInfo added from SDK 30 directly without running SDK checking to support ShadowActivityManager#getHistoricalProcessExitReasons. cc @hoisie .

@hoisie
Copy link
Contributor

hoisie commented Jul 2, 2021 via email

@utzcoz
Copy link
Member

utzcoz commented Jul 2, 2021

Hi @jankowskib , the new commit will fix this problem. I have tested it with your sample project locally, and this problem disappeared. You can test it with later release.

@hoisie
Copy link
Contributor

hoisie commented Jul 4, 2021

Just bumped the version to 4.6.1 which fixes this issue.

@jankowskib
Copy link
Author

Thanks! That was super-fast :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants