VFY: ошибка мертвого кода в модифицированном Sony Ericsson Launcher - PullRequest
1 голос
/ 13 октября 2011

Я нахожусь в процессе работы угловых кругов на устройствах hdpi. Все работает, кроме нажатия кнопки «Добавить» (также долгое нажатие на экран) и нажатия кнопки стиля сортировки в панели приложений. Оба приводят к F / C пусковой установки. Странно то, что он работает как на моем OG Droid, так и на моем Xoom, но не на моем Droid Incredible 2.

The Logcat:

     I/ActivityManager(24294): Displayed
     com.sonyericsson.home/.HomeActivity: +1s573ms W/cornerbuttons(26412):
     Customization file not found:
     /etc/customization/settings/com/sonyericsson/home/default_settings_topleftcornerbutton.xml
     W/cornerbuttons(26412): Customization file not found:
     /etc/customization/settings/com/sonyericsson/home/default_settings_toprightcornerbutton.xml
     W/cornerbuttons(26412): Customization file not found:
     /etc/customization/settings/com/sonyericsson/home/default_settings_bottomleftcornerbutton.xml
     W/cornerbuttons(26412): Customization file not found:
     /etc/customization/settings/com/sonyericsson/home/default_settings_bottomrightcornerbutton.xml
     W/app-tray(26412): Customization file not found:
     /etc/customization/settings/com/sonyericsson/home/default_settings_apptray.xml
     I/dalvikvm(26412): Could not find method
     android.app.AlertDialog$Builder.<init>, referenced from method
    com.sonyericsson.home.HomeActivity$AddDialog.createDialog
     D/dalvikvm(26412): VFY: dead code 0x0011-0034 in
     Lcom/sonyericsson/home/HomeActivity$AddDialog;.createDialog
     ()Landroid/app/Dialog; I/ActivityManager(24294): Displayed
     com.sonyericsson.home/.HomeActivity: +1s651ms I/dalvikvm(26442): Could
     not find method android.app.AlertDialog$Builder.<init>, referenced
     from method com.sonyericsson.home.HomeActivity$SortDialog.createDialog
     D/dalvikvm(26442): VFY: dead code 0x0019-0047 in
     Lcom/sonyericsson/home/HomeActivity$SortDialog;.createDialog
     ()Landroid/app/Dialog;
   PS: the f/cs occur even without my modifications  

1 Ответ

0 голосов
/ 29 октября 2011

После декомпиляции вы обнаружите, что в методе createDialog () внутреннего класса SortDialog « HomeActivity $ SortDialog.smali » ссылается на класс Util, чтобы узнать, какую тему украшать AlertDialogBuilder с.

СМАЛИ:

 .line 2507
    new-instance v0, Landroid/app/AlertDialog$Builder;

    iget-object v2, p0, Lcom/sonyericsson/home/HomeActivity$SortDialog;->this$0:Lcom/sonyericsson/home/HomeActivity;

    iget-object v3, p0, Lcom/sonyericsson/home/HomeActivity$SortDialog;->this$0:Lcom/sonyericsson/home/HomeActivity;

    invoke-virtual {v3}, Lcom/sonyericsson/home/HomeActivity;->getApplicationContext()Landroid/content/Context;

    move-result-object v3

    invoke-static {v3}, Lcom/sonyericsson/home/bidi/Utils;->getDialogAlertThemeStyle(Landroid/content/Context;)I

    move-result v3

    invoke-direct {v0, v2, v3}, Landroid/app/AlertDialog$Builder;-><init>(Landroid/content/Context;I)V

или на Java

int i = Utils.getDialogAlertThemeStyle(HomeActivity.this.getApplicationContext());

Затем их класс Utils проверяет сохраненную тему, в которой она будет применяться к SortDialog. Поскольку тема не установлена ​​(как я не знаю?), Она возвращает int с 0 или -1 (не уверен).

public static final int getDialogAlertThemeStyle(Context paramContext)
  {
    if ((sReflectionOk) && (isRtlAlphabet(paramContext)));
    for (int i = sThemeBidiDialogAlert; ; i = sThemeDialogAlert)
      return i;
  }

  public static final boolean isRtlAlphabet(Context paramContext)
  {
    int i = 0;
    if (sReflectionOk);
    try
    {
      Resources localResources = paramContext.getResources();
      int j = **sRtlAlphabetField**;
      boolean bool = localResources.getBoolean(j);
      i = bool;
      return i;
    }
    catch (Resources.NotFoundException localNotFoundException)
    {
      while (true)
        LogUtil.reportError("Bidi", "Get rtl alphabet resource failed", localNotFoundException);
    }
  }

j - это то, что возвращается, и sRtlAlphabetField не было инициализировано должным образом, я предполагаю

**sRtlAlphabetField** = Class.forName("com.android.internal.R$bool").getField("alphabet_isRtl").getInt(null);

Вы видите, что приведенный выше вызов вызывает идентификатор ресурса Alpx_isRtl, который находится в файле Android R.java модуля запуска. Он не должен возвращать верный идентификатор ресурса, поэтому, когда метод Util возвращает -1? или 0 он не может создать новый экземпляр AlertDialog с заданным параметром int. Простая строка журнала для вывода значения i из класса HomeActivity $ SortDialog или Util покажет вам, что он пытается использовать в качестве значения темы, в любом случае это вероятно gumpf.

Это может быть далеко, но я вполне уверен, что именно поэтому эта проблема возникает, и вы ожидаете, что эта ошибка возникнет в методах onCreate () AddToStageDialog, PickActivityDialog, AddDialog и SortDialog ".

Поскольку все они звонят по одной линии:

int i = Utils.getDialogAlertThemeStyle(HomeActivity.this.getApplicationContext());

Я предполагаю, решение было бы отредактировать классы SMALI для: AddToStageDialog, PickActivityDialog, AddDialog и SortDialog, чтобы они создавали AlertDialog.Builder, используя конструктор, который просто принимает контекст в качестве параметра .

1032 * то есть *

AlertDialog.Builder localBuilder1 = new AlertDialog.Builder(localHomeActivity);

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

Удачи!

Редактировать: Я тестировал это сам, и у меня это работает, отредактированный код smali:

от

invoke-direct {v0, v2, v3}, Landroid/app/AlertDialog$Builder;-><init>(Landroid/content/Context;I)V

до:

invoke-direct {v0, v2}, Landroid/app/AlertDialog$Builder;-><init>(Landroid/content/Context;)V

Сделайте это в классах диалога, которые я упоминал выше, и это решит проблему:)

...