1

我正在使角圈在 hdpi 设备上工作。除了按“添加”按钮(也长按屏幕)和按应用程序抽屉中的排序样式按钮外,一切正常。两者都会导致启动器的 F/c。奇怪的是,它可以在我的 OG Droid 和 Xoom 上运行,但不是在我的 Droid Incredible 2 上。

日志猫:

     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  
4

1 回答 1

0

反编译后,您会发现在 SortDialog 内部类的 createDialog() 方法中,“ HomeActivity$SortDialog.smali ”引用了 Util 类以找出装饰AlertDialogBu​​ilder的主题。

斯玛利:

 .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 的已保存主题。由于没有设置主题(我怎么不知道?)它返回一个 0 或 -1 的 int (不确定)。

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

您会看到上面的调用调用了位于启动器的 Android R.java 文件中的Alphabet_isRtl 的资源ID。它不能取回有效的资源标识符,因此为什么当 Util 方法返回 -1 时?或 0 它无法使用给定的 int 参数创建 AlertDialog 的新实例。在 HomeActivity$SortDialog 或 Util 类中输出 i 值的简单日志行将向您显示它试图用作主题值的内容,无论哪种方式它都可能是 gumpf。

这可能是一个长镜头,但我很确定这就是发生此问题的原因,并且您希望在 AddToStageDialog、PickActivityDialog、AddDialog 和 SortDialog“onCreate() 方法中出现此错误。

因为他们都在调用同一行:

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

我猜解决方案是编辑 SMALI 类:AddToStageDialog、PickActivityDialog、AddDialog 和 SortDialog,以便它们使用仅将上下文作为参数的构造函数创建一个 AlertDialog.Builder。

IE

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

在我上面提到的对话框类中执行此操作,它将解决问题:)

于 2011-10-29T13:12:55.593 回答