修改后的索爱启动器出现死码错误



我正在制作hdpi设备上的角圈。除了按下"添加"按钮(长按屏幕)和按下应用程序抽屉中的排序样式按钮外,一切都可以工作。两者都会导致发射装置的F/c。奇怪的是,它可以在我的OG Droid和Xoom上运行,但不能在我的Droid Incredible 2上运行。

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  

当反编译时,你会发现在SortDialog内部类的createDialog()方法中HomeActivity$SortDialog。small "正在引用Util类来找出用什么主题来装饰AlertDialogBuilder

SMALI:

 .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);

您可以看到上面的调用正在调用alphabet_isRtl的资源id,该资源id可以在启动器的Android R.java文件中找到。它不能得到一个有效的资源标识符,因此为什么当Util方法返回-1?或者0,它无法用给定的int参数创建AlertDialog的新实例。在HomeActivity$SortDialog或Util类中输出i的值的简单日志行将向您展示它试图使用的主题值,无论哪种方式,它都可能是gumpf。

这可能是一个很长的镜头,但我很确定,这就是为什么这个问题正在发生,你会期望有这个错误在AddToStageDialog, PickActivityDialog, AddDialog和SortDialog"onCreate()方法。

因为它们都调用同一行:

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

我猜的解决方案将是编辑smalli类:AddToStageDialog, PickActivityDialog, AddDialog和SortDialog,使他们创建一个AlertDialog。

使用只接受上下文作为参数的构造函数创建。

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

这可能可以做到,但如果没有主题部分,您可能会到处寻找类似的调用。

祝你好运!

编辑:我自己测试了这个,我已经让它工作了,编辑的小代码是: 来自:

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

在我上面提到的对话框类中这样做,它将解决问题:)

相关内容

  • 没有找到相关文章

最新更新