Что такое «ИЛИ» в краш-стеке firebase?

Что такое <OR> в стеке сбоя firebase?

android.app.Activity.onMenuItemSelected (Activity.java:2566)
android.support.v4.app.FragmentActivity.onMenuItemSelected (FragmentActivity.java)
android.support.v7.app.AppCompatActivity.onMenuItemSelected (AppCompatActivity.java)
android.support.v7.view.WindowCallbackWrapper.onMenuItemSelected (WindowCallbackWrapper.java)
android.support.v7.app.AppCompatDelegateImplV9.onCreate (AppCompatDelegateImplV9.java)
<OR>.setSupportActionBar (AppCompatDelegateImplV9.java)
<OR>.findViewById (AppCompatDelegateImplV9.java)
<OR>.onConfigurationChanged (AppCompatDelegateImplV9.java)
<OR>.setContentView (AppCompatDelegateImplV9.java)
<OR>.setContentView (AppCompatDelegateImplV9.java)
<OR>.onSubDecorInstalled (AppCompatDelegateImplV9.java)
<OR>.onPanelClosed (AppCompatDelegateImplV9.java)
<OR>.onMenuItemSelected (AppCompatDelegateImplV9.java)
<OR>.onMenuModeChange (AppCompatDelegateImplV9.java)
<OR>.startSupportActionModeFromWindow (AppCompatDelegateImplV9.java)
<OR>.onKeyShortcut (AppCompatDelegateImplV9.java)
<OR>.dispatchKeyEvent (AppCompatDelegateImplV9.java)
<OR>.shouldInheritContext (AppCompatDelegateImplV9.java)
<OR>.onCreateView (AppCompatDelegateImplV9.java)
<OR>.openPanel (AppCompatDelegateImplV9.java)
<OR>.initializePanelDecor (AppCompatDelegateImplV9.java)
<OR>.reopenMenu (AppCompatDelegateImplV9.java)
<OR>.closePanel (AppCompatDelegateImplV9.java)
<OR>.callOnPanelClosed (AppCompatDelegateImplV9.java)
<OR>.findMenuPanel (AppCompatDelegateImplV9.java)
<OR>.getPanelState (AppCompatDelegateImplV9.java)
<OR>.performPanelShortcut (AppCompatDelegateImplV9.java)
android.support.v7.view.menu.MenuBuilder.setDefaultShowAsAction (MenuBuilder.java)
<OR>.addMenuPresenter (MenuBuilder.java)
<OR>.addMenuPresenter (MenuBuilder.java)
<OR>.dispatchSubMenuSelected (MenuBuilder.java)
<OR>.saveActionViewStates (MenuBuilder.java)
<OR>.getActionViewStatesKey (MenuBuilder.java)
<OR>.setCallback (MenuBuilder.java)
<OR>.addInternal (MenuBuilder.java)
<OR>.createNewMenuItem (MenuBuilder.java)
<OR>.removeItemAtInt (MenuBuilder.java)
<OR>.setExclusiveItemChecked (MenuBuilder.java)
<OR>.findGroupIndex (MenuBuilder.java)
<OR>.dispatchMenuItemSelected (MenuBuilder.java)
<OR>.findInsertIndex (MenuBuilder.java)
<OR>.findItemsWithShortcutForKey (MenuBuilder.java)
<OR>.findItemWithShortcutForKey (MenuBuilder.java)
<OR>.performItemAction (MenuBuilder.java)
<OR>.performItemAction (MenuBuilder.java)
<OR>.close (MenuBuilder.java)
<OR>.onItemVisibleChanged (MenuBuilder.java)
<OR>.setHeaderInternal (MenuBuilder.java)
<OR>.setHeaderTitleInt (MenuBuilder.java)
<OR>.setHeaderIconInt (MenuBuilder.java)
<OR>.setHeaderViewInt (MenuBuilder.java)
android.support.v7.view.menu.MenuItemImpl.invoke (MenuItemImpl.java)
<OR>.setCheckedInt (MenuItemImpl.java)
<OR>.setShowAsActionFlags (MenuItemImpl.java)
android.support.v7.view.menu.MenuBuilder.setDefaultShowAsAction (MenuBuilder.java)
<OR>.addMenuPresenter (MenuBuilder.java)
<OR>.addMenuPresenter (MenuBuilder.java)
<OR>.dispatchSubMenuSelected (MenuBuilder.java)
<OR>.saveActionViewStates (MenuBuilder.java)
<OR>.getActionViewStatesKey (MenuBuilder.java)
<OR>.setCallback (MenuBuilder.java)
<OR>.addInternal (MenuBuilder.java)
<OR>.createNewMenuItem (MenuBuilder.java)
<OR>.removeItemAtInt (MenuBuilder.java)
<OR>.setExclusiveItemChecked (MenuBuilder.java)
<OR>.findGroupIndex (MenuBuilder.java)
<OR>.dispatchMenuItemSelected (MenuBuilder.java)
<OR>.findInsertIndex (MenuBuilder.java)
<OR>.findItemsWithShortcutForKey (MenuBuilder.java)
<OR>.findItemWithShortcutForKey (MenuBuilder.java)
<OR>.performItemAction (MenuBuilder.java)
<OR>.performItemAction (MenuBuilder.java)
<OR>.close (MenuBuilder.java)
<OR>.onItemVisibleChanged (MenuBuilder.java)
<OR>.setHeaderInternal (MenuBuilder.java)
<OR>.setHeaderTitleInt (MenuBuilder.java)
<OR>.setHeaderIconInt (MenuBuilder.java)
<OR>.setHeaderViewInt (MenuBuilder.java)
android.support.v7.view.menu.MenuBuilder.setDefaultShowAsAction (MenuBuilder.java)
<OR>.addMenuPresenter (MenuBuilder.java)
<OR>.addMenuPresenter (MenuBuilder.java)
<OR>.dispatchSubMenuSelected (MenuBuilder.java)
<OR>.saveActionViewStates (MenuBuilder.java)
<OR>.getActionViewStatesKey (MenuBuilder.java)
<OR>.setCallback (MenuBuilder.java)
<OR>.addInternal (MenuBuilder.java)
<OR>.createNewMenuItem (MenuBuilder.java)
<OR>.removeItemAtInt (MenuBuilder.java)
<OR>.setExclusiveItemChecked (MenuBuilder.java)
<OR>.findGroupIndex (MenuBuilder.java)
<OR>.dispatchMenuItemSelected (MenuBuilder.java)
<OR>.findInsertIndex (MenuBuilder.java)
<OR>.findItemsWithShortcutForKey (MenuBuilder.java)
<OR>.findItemWithShortcutForKey (MenuBuilder.java)
<OR>.performItemAction (MenuBuilder.java)
<OR>.performItemAction (MenuBuilder.java)
<OR>.close (MenuBuilder.java)
<OR>.onItemVisibleChanged (MenuBuilder.java)
<OR>.setHeaderInternal (MenuBuilder.java)
<OR>.setHeaderTitleInt (MenuBuilder.java)
<OR>.setHeaderIconInt (MenuBuilder.java)
<OR>.setHeaderViewInt (MenuBuilder.java)
android.support.v7.widget.ActionMenuView.measureChildForCells (ActionMenuView.java)
<OR>.isOverflowReserved (ActionMenuView.java)
<OR>.generateLayoutParams (ActionMenuView.java)
<OR>.generateLayoutParams (ActionMenuView.java)
<OR>.invokeItem (ActionMenuView.java)
<OR>.initialize (ActionMenuView.java)
<OR>.setMenuCallbacks (ActionMenuView.java)
<OR>.hasSupportDividerBeforeChildAt (ActionMenuView.java)
android.support.v7.view.menu.ActionMenuItemView.onClick (ActionMenuItemView.java)
android.view.View.performClick (View.java:4211)
android.view.View$PerformClick.run (View.java:17446)
android.os.Handler.handleCallback (Handler.java:725)
android.os.Handler.dispatchMessage (Handler.java:92)
android.os.Looper.loop (Looper.java:153)
android.app.ActivityThread.main (ActivityThread.java:5299)
java.lang.reflect.Method.invokeNative (Method.java)
java.lang.reflect.Method.invoke (Method.java:511)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:833)
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:600)
dalvik.system.NativeStart.main (NativeStart.java)

person Alexey Subbota    schedule 27.02.2017    source источник
comment
Этот вопрос расплывчатый. Не могли бы вы поделиться некоторыми подробностями о том, где вы видите это, и, возможно, о вашем проекте?   -  person Doug Stevenson    schedule 27.02.2017
comment
@DougStevenson, я получил эту трассировку стека в консоли Firebase из своего приложения для Android. Если вы работаете в поддержке firebase, я пришлю вам любую информацию о проекте firbase.   -  person Alexey Subbota    schedule 28.02.2017


Ответы (1)


<OR> указывает на то, что деобфускатор не смог определить, какой метод является исходным, поскольку существует несколько потенциальных возможностей. Firebase получила запутанную трассировку стека и не смогла однозначно определить исходную трассировку стека с помощью предоставленного файла Proguard. Например, деобфусцированная трассировка стека, такая как:

android.support.v7.view.WindowCallbackWrapper.onMenuItemSelected (WindowCallbackWrapper.java)
android.support.v7.view.menu.MenuBuilder.setDefaultShowAsAction (MenuBuilder.java)
<OR>.addMenuPresenter (MenuBuilder.java)
<OR>.addMenuPresenter (MenuBuilder.java)
<OR>.dispatchSubMenuSelected (MenuBuilder.java)

означает, что первый кадр стека был однозначно деобфусцирован, но второй кадр стека в трассировке стека может быть любой из этих четырех возможностей.

В данном случае двусмысленность возникает из-за того, что оба:

  1. Нет номеров строк для различения методов, и
  2. несколько методов с разными сигнатурами были замаскированы в одну и ту же строку.

На этапе сжатия Proguard может быть настроен на разделение номеров строк. Чтобы избежать этой проблемы, отключите эту функцию.

Не гарантируется, что запутывание будет обратимым для трассировки стека без номеров строк, поскольку это не является одним из требований для действительного сопоставления Proguard. Proguard гарантирует обратимое запутывание только кода, но не трассировки стека. Файлы Proguard включают сигнатуры методов, поэтому любые методы с неконфликтующими сигнатурами могут быть замаскированы в одну и ту же строку.

Например: int method(int) и String method2(String) могут быть замаскированы до obf. Из контекста деобфускатор кода может увидеть, был ли передан obf тип int или String, и может однозначно выбрать правильный исходный метод. Для деобфускатора трассировки стека строка MyClass.obf(MyClass.java) могла происходить либо из MyClass.method(MyClass.java), либо из MyClass.method2(MyClass.java).

person Will Beason    schedule 28.02.2017
comment
В дополнение к этому: если вы настроили ProGuard для разделения номеров строк на этапе сжатия, то, что вы видите, может быть результатом этого. - person Doug Stevenson; 01.03.2017
comment
Благодарю вас! Странно, что proguard-android.txt по умолчанию не содержит параметров -keepattributes SourceFile, LineNumberTable. - person Alexey Subbota; 01.03.2017
comment
@DougStevenson, этот вопрос имеет отношение к stackoverflow. com/questions/41544446/ ? - person Alexey Subbota; 01.03.2017
comment
@AlexeySubbota Да, наверное. Это похоже на старое поведение. - person Will Beason; 01.03.2017