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

什么是';android.security.MessageDigest'';?,android,Android,数千名客户中有一位报告我的一个应用程序出现错误。错误是: java.lang.NoClassDefFoundError - android.security.MessageDigest 我在应用程序中不使用该类/方法。谷歌地图键必须是正常的,因为有成千上万的人在用相同的版本运行相同的应用程序。这是stacktrace: java.lang.NoClassDefFoundError: android.security.MessageDigest at com.google.android.map

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

java.lang.NoClassDefFoundError - android.security.MessageDigest
我在应用程序中不使用该类/方法。谷歌地图键必须是正常的,因为有成千上万的人在用相同的版本运行相同的应用程序。这是stacktrace:

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)
这是什么


提前感谢。

MessageDigest类是一个帮助类,用于使用MD5或SHA-1等常用方法对密钥进行编码/解码

看起来android.security.MessageDigest类已从Honeycom和更高版本的android中删除,必须由java.security.MessageDigest()替换


尝试下载最新版本的Google Maps API,并将targetSDK设置为可用的最高版本(从今天起应为16/Jelly Bean)重新构建应用程序

我花了一些时间研究这个问题,我正在记录我在这里的发现,希望它能为其他人省去一些麻烦

该错误是由于设备制造商或ROM创建者使用旧的地图库和新版本的Android造成的。通常情况下,这是孤立的模糊平板电脑,但理论上它可以出现在其他情况下。可以使用以下步骤在模拟器中重新创建此问题:

  • 为包含Google API的旧API(10或更少)创建并加载仿真器
  • 从emulator中提取maps jar:
    adb pull/system/framework/com.google.android.maps.jar
    完成此操作后,可以关闭模拟器
  • 为新API(11或更高版本)创建并加载模拟器,其中包括Google API
  • 在模拟器中重新安装/system,以便您可以对其进行写入:
    adb-Remount
  • 将提取的maps jar放入新的模拟器:
    adb push/com.google.android.maps.jar/system/framework
  • 重新启动模拟器。这应该可以通过adb重启来实现,但这只是挂起了模拟器。相反,您需要终止具有相同效果的特定进程。在Eclipse/DDMS中,它将被称为
    system\u process
    ,您可以在那里杀死它。或者,您可以运行以下命令:
    adb shell ps | grep system | u server | awk'{print$2}'| xargs adb shell kill
  • 重新启动后,您可以像往常一样使用仿真器。运行任何嵌入谷歌地图的应用程序都将失败
  • 这个过程不是永久性的。重新启动仿真器会将其恢复到正常工作状态


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

    我找到了简单的解决方法!只需在src目录包android\security中创建,并将MessageDigest.java放入其中

    package android.security;
    
    import java.security.NoSuchAlgorithmException;
    
    public class MessageDigest
    {
        private java.security.MessageDigest instance;
    
        public MessageDigest() {}
    
        private MessageDigest(java.security.MessageDigest instance)
        {
            this.instance = instance;
        }
    
        public static MessageDigest getInstance(String algorithm) throws NoSuchAlgorithmException
        {
            if (algorithm == null) return null;
    
            try
            {
                if (algorithm.equals("SHA-1"))
                    return (MessageDigest) Class.forName("android.security.Sha1MessageDigest").newInstance();
                else if (algorithm.equals("MD5"))
                    return (MessageDigest) Class.forName("android.security.Md5MessageDigest").newInstance();
            }
            catch (Exception e) {}
    
            return new MessageDigest(java.security.MessageDigest.getInstance(algorithm));
        }
    
        public void update(byte[] input)
        {
            instance.update(input);
        }
    
        public byte[] digest()
        {
            return instance.digest();
        }
    
        public byte[] digest(byte[] input)
        {
            return instance.digest(input);
        }
    }
    

    这是可行的,但可能会累积其他异常,因为地图库不匹配android版本

    谢谢。在4.x设备上,同样的应用程序工作得非常完美,在2.x设备上也是如此。谷歌是否删除了3.x中的API调用,并将其重新添加到4.x中?哇!那会很奇怪。我最好的猜测是直接联系谷歌,获得官方信息。我确实拥有一台2.3.7和一台4.0.3的设备,这两款设备都可以使用。我可以肯定这一点。错误来自开发人员控制台中的未知客户跟踪。我通常都会检查它们——即使是源代码之外的代码。我将您的答案标记为ok,因为您将我指向了正确的位置。如果针对API 16,问题是否已解决?我只是从一些使用“奇怪设备”(至少不是普通设备)的用户那里得到了这个错误。ATROPLUS、Scroll engage、Fly touch……我将目标api设置为17,但在一些设备上仍然收到这个异常!我同意这个解释。我只有“不太标准”的问题设备。这个解决方法实际上是有效的,而且是最非侵入性的。我还没有看到它的任何副作用。如果我遇到任何问题,我会告诉你。谢谢你的建议!!!!!