背景
最近,我更新了我的应用程序,出于某种原因,Proguard似乎破坏了我制作的代码,在一个非常特定的情况下导致崩溃,尽管我没有添加任何其他库。
我之所以如此确信这是Proguard的错,是因为当我在没有导出的情况下测试它时,它运行得很好。
问题
在看到崩溃报告的堆栈跟踪(并亲眼看到它确实发生了(之后,我运行了"proguardgui"工具,并选择使用映射文件进行回溯。
遗憾的是,它没有显示代码失败的真实位置,而是显示了完全相同的堆栈。我试图再次导出该项目,并使用它创建的新映射文件,但我仍然得到了相同的模糊堆栈跟踪。
不仅如此,异常本身也很有问题:java.lang.NoClassDefFoundError.
这是堆栈跟踪,尽管我认为它不可读:
java.lang.NoClassDefFoundError: com.lb.app_manager.utils.r
at com.lb.app_manager.utils.e.c(Unknown Source)
at com.lb.app_manager.activities.app_list_activity.AppListActivity.onContextItemSelected(Unknown Source)
at android.app.Activity.onMenuItemSelected(Activity.java:2620)
at android.support.v4.app.FragmentActivity.onMenuItemSelected(Unknown Source)
at com.actionbarsherlock.app.SherlockFragmentActivity.onMenuItemSelected(Unknown Source)
at com.android.internal.policy.impl.PhoneWindow$DialogMenuCallback.onMenuItemSelected(PhoneWindow.java:3864)
at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:735)
at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:152)
at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:874)
at com.android.internal.view.menu.MenuDialogHelper.onClick(MenuDialogHelper.java:167)
at com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:941)
at android.widget.AdapterView.performItemClick(AdapterView.java:299)
at android.widget.AbsListView.performItemClick(AbsListView.java:1113)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:2904)
at android.widget.AbsListView$3.run(AbsListView.java:3638)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5017)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:133)
at dalvik.system.NativeStart.main(Native Method)
当我选择共享一个应用程序时,就会发生这种情况,在很短的时间内,该应用程序应该在运行AsyncTask时显示一个进度对话框,然后显示一个您希望如何共享的对话框(就像播放商店链接的屏幕截图上一样,如果您看不到它,可以在这里使用(。
我尝试过的
我尝试在多个位置添加日志,发现AsyncTask运行良好,但它没有达到"onPostExecute"。我知道这一点,因为我已经把日志放在"doInBackground"的末尾和"onPostExecute"的开头。
更奇怪的是,当我删除了"onPostExecute"的大部分代码时,现在我只有这个:
protected void onPostExecute(final Void result)
{
Log.d("Applog","onPostExecute 0");
super.onPostExecute(result);
Log.d("Applog","onPostExecute 1");
progressDialog.dismiss();
}
它甚至没有通过这种方式到达第一行。
最后,我决定合并两个项目(我以前做过几个版本(,这样就不会有我做的任何Android库项目了。只有一个。
我还删除了一个似乎没有使用的库(Apache commons(,但我不敢相信这是问题的原因(因为我没有使用它(。
问题
为什么会出现这样的问题?
我该如何避免将来出现这样的问题?
NoClassDefFoundError通常指向构建过程中的一个问题:所需的某些类最终没有出现在应用程序中。
ProGuard在构建日志中打印出它读取的输入jar和写入的输出jar的信息。您也可以指定
-printconfiguration configuration.txt
以获得ProGuard使用的完整配置,包括输入和输出。这将帮助您查明是否存在所有预期的输入jar。
如果您正在使用Eclipse构建应用程序,则可能会遇到同步问题,该问题似乎是在尚未将所有编译的文件写入磁盘时运行ProGuard。这个神秘的问题已经被报道过几次了,但仍然没有得到解决。然后你应该试试Ant或Gradle。