airbnb / mavericks

Mavericks: Android on Autopilot
https://airbnb.io/mavericks/
Apache License 2.0
5.83k stars 500 forks source link

Proguard rules #71

Closed chrisbanes closed 6 years ago

chrisbanes commented 6 years ago

I've noticed lots of reflection using in MvRx, and indeed my app crashes with Proguard. MvRx should publish some recommended Proguard rules.

knordbo commented 6 years ago

It does have consumer proguard files set up, so there shouldn't be a need for consumers to manually proguard: https://github.com/airbnb/MvRx/blob/master/mvrx/build.gradle#L18

Where is it crashing? Perhaps https://github.com/airbnb/MvRx/blob/master/mvrx/proguard-rules.pro is not configured correctly.

chrisbanes commented 6 years ago

Ah yes, I missed that! I'll dig into the de-obfuscated stack trace tomorrow and report back. This might actually more of a kotlin-reflect issue than MvRx.

rossbacher commented 6 years ago

Yes, please let me know the stack trace and I can fix that. when I tested this the file was picked up correctly and part of the .aar but maybe we missed a rule.

chrisbanes commented 6 years ago

Here's the de-obfuscated stack trace:

java.lang.RuntimeException: Unable to resume activity {app.tivi/app.tivi.showdetails.ShowDetailsActivity}: java.lang.RuntimeException: Failed to call observer method
    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3784)
    at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3816)
    at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:51)
    at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:145)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:6669)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: java.lang.RuntimeException: Failed to call observer method
    at android.arch.lifecycle.ClassesInfoCache$MethodReference.invokeCallback(SourceFile:225)
    at android.arch.lifecycle.ClassesInfoCache$CallbackInfo.invokeMethodsForEvent(SourceFile:193)
    at android.arch.lifecycle.ClassesInfoCache$CallbackInfo.invokeCallbacks(SourceFile:184)
    at android.arch.lifecycle.ReflectiveGenericLifecycleObserver.onStateChanged(SourceFile:36)
    at android.arch.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent(SourceFile:354)
    at android.arch.lifecycle.LifecycleRegistry.forwardPass(SourceFile:292)
    at android.arch.lifecycle.LifecycleRegistry.sync(SourceFile:332)
    at android.arch.lifecycle.LifecycleRegistry.moveToState(SourceFile:137)
    at android.arch.lifecycle.LifecycleRegistry.handleLifecycleEvent(SourceFile:123)
    at android.support.v4.app.Fragment.performCreate(SourceFile:2423)
    at android.support.v4.app.FragmentManagerImpl.moveToState(SourceFile:1418)
    at android.support.v4.app.FragmentTransition.addToFirstInLastOut(SourceFile:1195)
    at android.support.v4.app.FragmentTransition.calculateFragments(SourceFile:1078)
    at android.support.v4.app.FragmentTransition.startTransitions(SourceFile:117)
    at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(SourceFile:2408)
    at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(SourceFile:2366)
    at android.support.v4.app.FragmentManagerImpl.execPendingActions(SourceFile:2273)
    at android.support.v4.app.FragmentController.execPendingActions(SourceFile:391)
    at android.support.v4.app.FragmentActivity.onResume(SourceFile:517)
    at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1412)
    at android.app.Activity.performResume(Activity.java:7292)
    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3776)
    ... 11 more
Caused by: java.lang.ExceptionInInitializerError
    at kotlin.reflect.jvm.internal.impl.builtins.BuiltInsLoader.<clinit>(Unknown Source:0)
    at kotlin.reflect.jvm.internal.impl.builtins.KotlinBuiltIns.createBuiltInsModule(SourceFile:148)
    at kotlin.reflect.jvm.internal.impl.platform.JvmBuiltIns.<init>(SourceFile:56)
    at kotlin.reflect.jvm.internal.impl.platform.JvmBuiltIns.<init>(SourceFile:31)
                                                          <init>
    at kotlin.reflect.jvm.internal.components.RuntimeModuleData$Companion.create(SourceFile:54)
    at kotlin.reflect.jvm.internal.ModuleByClassLoaderKt.getOrCreateModule(SourceFile:58)
    at kotlin.reflect.jvm.internal.KDeclarationContainerImpl$Data$moduleData$2.invoke(SourceFile:35)
    at kotlin.reflect.jvm.internal.KDeclarationContainerImpl$Data$moduleData$2.invoke(SourceFile:32)
    at kotlin.reflect.jvm.internal.ReflectProperties$LazySoftVal.invoke(SourceFile:93)
    at kotlin.reflect.jvm.internal.ReflectProperties$Val.getValue(SourceFile:32)
                                                      invoke
    at kotlin.reflect.jvm.internal.KDeclarationContainerImpl$Data.getModuleData(Unknown Source:7)
    at kotlin.reflect.jvm.internal.KClassImpl$Data$descriptor$2.invoke(SourceFile:46)
    at kotlin.reflect.jvm.internal.KClassImpl$Data$descriptor$2.invoke(SourceFile:43)
    at kotlin.reflect.jvm.internal.ReflectProperties$LazySoftVal.invoke(SourceFile:93)
    at kotlin.reflect.jvm.internal.ReflectProperties$Val.getValue(SourceFile:32)
                                                      invoke
    at kotlin.reflect.jvm.internal.KClassImpl$Data.getDescriptor(Unknown Source:7)
    at kotlin.reflect.jvm.internal.KClassImpl$Data$nestedClasses$2.invoke(SourceFile:96)
    at kotlin.reflect.jvm.internal.KClassImpl$Data$nestedClasses$2.invoke(SourceFile:43)
    at kotlin.reflect.jvm.internal.ReflectProperties$LazySoftVal.invoke(SourceFile:93)
    at kotlin.reflect.jvm.internal.ReflectProperties$Val.getValue(SourceFile:32)
                                                      invoke
    at kotlin.reflect.jvm.internal.KClassImpl$Data.getNestedClasses(Unknown Source:7)
    at kotlin.reflect.jvm.internal.KClassImpl.getNestedClasses(SourceFile:224)
    at kotlin.reflect.full.KClasses.getCompanionObject(SourceFile:51)
    at kotlin.reflect.full.KClasses.getCompanionObjectInstance(SourceFile:61)
    at com.airbnb.mvrx.MvRxViewModelProvider.createViewModel(SourceFile:63)
    at com.airbnb.mvrx.MvRxViewModelProvider$get$factory$1.invoke(SourceFile:43)
    at com.airbnb.mvrx.MvRxViewModelProvider$get$factory$1.invoke(SourceFile:16)
    at com.airbnb.mvrx.MvRxFactory.create(SourceFile:9)
    at android.arch.lifecycle.ViewModelProvider.get(SourceFile:134)
    at com.airbnb.mvrx.MvRxViewModelProvider.get(SourceFile:48)
    at app.tivi.showdetails.details.ShowDetailsFragment$$special$$inlined$fragmentViewModel$1.invoke(SourceFile:183)
    at app.tivi.showdetails.details.ShowDetailsFragment$$special$$inlined$fragmentViewModel$1.invoke(Unknown Source:0)
    at com.airbnb.mvrx.lifecycleAwareLazy.getValue(SourceFile:49)
    at com.airbnb.mvrx.lifecycleAwareLazy$1.onStart(SourceFile:28)
    at java.lang.reflect.Method.invoke(Native Method)
    at android.arch.lifecycle.ClassesInfoCache$MethodReference.invokeCallback(SourceFile:215)
    ... 32 more
Caused by: java.util.NoSuchElementException: Collection is empty.
    at kotlin.collections.CollectionsKt___CollectionsKt.first(SourceFile:172)
    at kotlin.reflect.jvm.internal.impl.builtins.BuiltInsLoader$Companion.<clinit>(SourceFile:38)
    ... 68 more
rossbacher commented 6 years ago

Can you also paste the obfuscated one? I think the interesting part also looks to be ( hard to tell int he deobfuscatd stack-trace) in the 68 more at the bottom. So if you could expand that and post that too, that would be helpful.