我正在制作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
在我上面提到的对话框类中这样做,它将解决问题:)