数千名客户中有一个报告我的一个应用程序出现错误。错误是:
java.lang.NoClassDefFoundError - android.security.MessageDigest
我不在我的应用程序中使用该类/方法。 Google Mapkey 一定没问题,因为有成千上万的人在愉快地运行相同版本的相同应用程序。这是堆栈跟踪:
java.lang.NoClassDefFoundError: android.security.MessageDigest
at com.google.android.maps.KeyHelper.getSignatureFingerprint(KeyHelper.java:60)
at com.google.android.maps.MapActivity.createMap(MapActivity.java:552)
at com.google.android.maps.MapActivity.onCreate(MapActivity.java:422)
at xx.yyy.zzzz.MyMapActivity.onCreate(MyMapActivity.java:41)
at xx.yyy.zzzz.TheMap.onCreate(TheMap.java:89)
at android.app.Activity.performCreate(Activity.java:4465)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
at android.app.ActivityThread.access$600(ActivityThread.java:123)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4424)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)
这是什么?
提前致谢。
最佳答案
我花了一些时间研究这个问题,并记录了我在这里发现的内容,希望它可以为其他人省去一些麻烦。
该错误是由于设备制造商或 ROM 创建者在新版本的 Android 上使用较旧的 map 库造成的。通常,这与晦涩的平板电脑隔离,但理论上它可能会出现在其他情况下。可以使用以下步骤在模拟器中重现此问题:
- 为包含 Google API 的旧 API(10 或更少)创建和加载模拟器
- 从模拟器中提取 map jar:
adb pull /system/framework/com.google.android.maps.jar <destination_folder>
完成此操作后,您可以关闭模拟器。 - 为包含 Google API 的新 API(11 或更高版本)创建并加载模拟器
- 在模拟器中重新挂载/system 以便您可以对其进行写入:
adb remount
- 将提取的 map jar放入新模拟器:
adb push <destination_folder>/com.google.android.maps.jar /system/framework
- 重启模拟器。这应该可以通过
adb reboot
但这只是挂了模拟器。相反,您需要终止具有相同效果的特定进程。在 Eclipse/DDMS 中,它将被称为system_process
你可以在那里杀死它。或者,您可以运行以下命令:adb shell ps | grep system_server | awk '{print $2}' | xargs adb shell kill
- 重启后,您就可以像往常一样使用模拟器了。运行任何嵌入了 Google map 的应用都会失败。
此过程不是永久性的。重新启动模拟器会将其恢复到正常工作状态。
可以通过获取 KeyHelper.getSignatureFingerprint()
来检测此问题。通过反射和调用它在 map 库中的方法 - 传递 PackageManager
和你的包名作为参数。或者,您可以在 onCreate()
中捕获错误。而是加载一个新的 Activity 。
关于android - 什么是 'android.security.MessageDigest' '?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11407685/