android - 什么是 'android.security.MessageDigest' '?

标签 android

数千名客户中有一个报告我的一个应用程序出现错误。错误是:

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 库造成的。通常,这与晦涩的平板电脑隔离,但理论上它可能会出现在其他情况下。可以使用以下步骤在模拟器中重现此问题:

  1. 为包含 Google API 的旧 API(10 或更少)创建和加载模拟器
  2. 从模拟器中提取 map jar: adb pull /system/framework/com.google.android.maps.jar <destination_folder> 完成此操作后,您可以关闭模​​拟器。
  3. 为包含 Google API 的新 API(11 或更高版本)创建并加载模拟器
  4. 在模拟器中重新挂载/system 以便您可以对其进行写入:adb remount
  5. 将提取的 map jar放入新模拟器:adb push <destination_folder>/com.google.android.maps.jar /system/framework
  6. 重启模拟器。这应该可以通过 adb reboot但这只是挂了模拟器。相反,您需要终止具有相同效果的特定进程。在 Eclipse/DDMS 中,它将被称为 system_process你可以在那里杀死它。或者,您可以运行以下命令:adb shell ps | grep system_server | awk '{print $2}' | xargs adb shell kill
  7. 重启后,您就可以像往常一样使用模拟器了。运行任何嵌入了 Google map 的应用都会失败。

此过程不是永久性的。重新启动模拟器会将其恢复到正常工作状态。

可以通过获取 KeyHelper.getSignatureFingerprint() 来检测此问题。通过反射和调用它在 map 库中的方法 - 传递 PackageManager和你的包名作为参数。或者,您可以在 onCreate() 中捕获错误。而是加载一个新的 Activity 。

关于android - 什么是 'android.security.MessageDigest' '?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11407685/

相关文章:

java - 当我从下一个选项卡返回时,我丢失了我的查看寻呼机数据

android release app bundle 构建缺少 native lib .so 文件

android - 为 Lollipop 之前的可绘制选择器设置主题

android - 如何不使用 androidX 破坏 fragment

android - Facebook Android SDK AppEvents 无法识别 Insights Dashboard 上的用户

android - 在多次点击后延迟一个 Intent ?

java - 启动时的 Android 警报对话框

android - 如何修复涉及线程的 Android 内存泄漏?

android - Android Activity 可以在 finish() 之后恢复吗?

android - 如何将 imageview scaletype 设置为 topCrop