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

put r8 rules for enums back in to fix crash in AccountListActivity #4299

Merged
merged 1 commit into from
Mar 4, 2024

Conversation

connyduck
Copy link
Collaborator

Regression from #4291 // cc @cbeyls

Stacktrace
Process: com.keylesspalace.tusky, PID: 31230
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.keylesspalace.tusky/com.keylesspalace.tusky.components.accountlist.AccountListActivity}: java.lang.RuntimeException: java.lang.NoSuchMethodException: h4.a.values []
  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3635)
  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3792)
  at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103)
  at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
  at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2210)
  at android.os.Handler.dispatchMessage(Handler.java:106)
  at android.os.Looper.loopOnce(Looper.java:201)
  at android.os.Looper.loop(Looper.java:288)
  at android.app.ActivityThread.main(ActivityThread.java:7839)
  at java.lang.reflect.Method.invoke(Native Method)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
Caused by: java.lang.RuntimeException: java.lang.NoSuchMethodException: h4.a.values []
  at java.lang.Enum.enumValues(Enum.java:270)
  at java.lang.Enum.access$000(Enum.java:61)
  at java.lang.Enum$1.create(Enum.java:277)
  at java.lang.Enum$1.create(Enum.java:275)
  at libcore.util.BasicLruCache.get(BasicLruCache.java:63)
  at java.lang.Enum.getSharedConstants(Enum.java:289)
  at java.lang.Enum.valueOf(Enum.java:243)
  at java.io.ObjectInputStream.readEnum(ObjectInputStream.java:1841)
  at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1409)
  at java.io.ObjectInputStream.readObject(ObjectInputStream.java:427)
  at android.os.Parcel.readSerializable(Parcel.java:3507)
  at android.os.Parcel.readValue(Parcel.java:3277)
  at android.os.Parcel.readArrayMapInternal(Parcel.java:3623)
  at android.os.BaseBundle.initializeFromParcelLocked(BaseBundle.java:292)
  at android.os.BaseBundle.unparcel(BaseBundle.java:236)
  at android.os.BaseBundle.getSerializable(BaseBundle.java:1268)
  at android.os.Bundle.getSerializable(Bundle.java:1104)
  at android.content.Intent.getSerializableExtra(Intent.java:8575)
  at com.keylesspalace.tusky.components.accountlist.AccountListActivity.onCreate(SourceFile:23)
  at android.app.Activity.performCreate(Activity.java:8051)
  at android.app.Activity.performCreate(Activity.java:8031)
  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1329)
  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3608)
  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3792) 
  at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103) 
  at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
  at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2210) 
  at android.os.Handler.dispatchMessage(Handler.java:106) 
  at android.os.Looper.loopOnce(Looper.java:201) 
  at android.os.Looper.loop(Looper.java:288) 
  at android.app.ActivityThread.main(ActivityThread.java:7839) 
  at java.lang.reflect.Method.invoke(Native Method) 
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) 
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003) 
Caused by: java.lang.NoSuchMethodException: h4.a.values []
  at java.lang.Class.getMethod(Class.java:2103)
  at java.lang.Class.getDeclaredMethod(Class.java:2081)
  at java.lang.Enum.enumValues(Enum.java:267)
  at java.lang.Enum.access$000(Enum.java:61) 
  at java.lang.Enum$1.create(Enum.java:277) 
  at java.lang.Enum$1.create(Enum.java:275) 
  at libcore.util.BasicLruCache.get(BasicLruCache.java:63) 
  at java.lang.Enum.getSharedConstants(Enum.java:289) 
  at java.lang.Enum.valueOf(Enum.java:243) 
  at java.io.ObjectInputStream.readEnum(ObjectInputStream.java:1841) 
  at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1409) 
  at java.io.ObjectInputStream.readObject(ObjectInputStream.java:427) 
  at android.os.Parcel.readSerializable(Parcel.java:3507) 
  at android.os.Parcel.readValue(Parcel.java:3277) 
  at android.os.Parcel.readArrayMapInternal(Parcel.java:3623) 
  at android.os.BaseBundle.initializeFromParcelLocked(BaseBundle.java:292) 
  at android.os.BaseBundle.unparcel(BaseBundle.java:236) 
  at android.os.BaseBundle.getSerializable(BaseBundle.java:1268) 
  at android.os.Bundle.getSerializable(Bundle.java:1104) 
  at android.content.Intent.getSerializableExtra(Intent.java:8575) 
  at com.keylesspalace.tusky.components.accountlist.AccountListActivity.onCreate(SourceFile:23) 
  at android.app.Activity.performCreate(Activity.java:8051) 
  at android.app.Activity.performCreate(Activity.java:8031) 
  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1329) 
  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3608) 
  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3792) 
  at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103) 
  at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
  at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2210) 
  at android.os.Handler.dispatchMessage(Handler.java:106) 
  at android.os.Looper.loopOnce(Looper.java:201) 
  at android.os.Looper.loop(Looper.java:288) 
  at android.app.ActivityThread.main(ActivityThread.java:7839) 
  at java.lang.reflect.Method.invoke(Native Method) 
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) 
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003) 

closes #4297

@connyduck connyduck requested review from Tak and charlag March 1, 2024 08:26
@cbeyls
Copy link
Contributor

cbeyls commented Mar 1, 2024

My bad, didn't realize the project was using Bundle.putSerializable(). You need to add rules for types you pass as Serializable. Usually I prefer to pass enums as Strings and convert them back using enumValueOf() (for example using extension functions on Bundle), that doesn't need a rule because R8 can see the enum is actually used in the reified type.

Alternatively you can make the enums implement Parcelable and annotate them with @Parcelize but that makes them less portable.

@cbeyls
Copy link
Contributor

cbeyls commented Mar 1, 2024

Also note that the Parcelize plugin and the navigation library both pass Enums as Strings and not as Serializable.

@connyduck
Copy link
Collaborator Author

Serializing as String or Parcelable are indeed options, but after trying them out I think I like it best this way. No code change necessary and we should have the rules in place anyway to prevent future mistakes.

Copy link
Collaborator

@charlag charlag left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not a fan of Serializable but since we use it for little things only I think it's fine to keep as is

@connyduck connyduck merged commit 7a05530 into develop Mar 4, 2024
3 checks passed
@connyduck connyduck deleted the fix_account_list_crash branch March 4, 2024 05:54
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 this pull request may close these issues.

crash: can't view a person's followers or who they are following
4 participants