smstuebe / xamarin-fingerprint

Xamarin and MvvMCross plugin for authenticate a user via fingerprint sensor
Microsoft Public License
494 stars 118 forks source link

Android crash on 1.4.6-beta3 or above #102

Closed Springham closed 3 years ago

Springham commented 6 years ago

Tried to upgrade to 1.4.6 but it fails on Android. My solution works on 1.4.6-beta2 but nothing above. I had a look at the commits but couldn't see anything that had been introduced that would affect this. Reproduced on the two devices tried.

The exceptions look to me like the fingerprint dialog is attempting and failing to get my app icon but I could be wrong.

Steps to reproduce

  1. Attempt to authenticate with an Android device setup with fingerprint

Expected behavior

It shouldn't crash

Actual behavior

It crashes

Crashlog

With adaptive icon:

Android.Views.InflateException: Binary XML file line #1: Binary XML file line #1: Error inflating class adaptive-icon ---> Android.Views.InflateException: Binary XML file line #1: Error inflating class adaptive-icon ---> Java.Lang.ClassNotFoundException: Didn't find class "android.view.adaptive-icon" on path: DexPathList[[zip file "/data/app/com.hrgworldwide.travelapp-9t1oSumR8d6eDS5fXozjrg==/base.apk"],nativeLibraryDirectories=[/data/app/com.hrgworldwide.travelapp-9t1oSumR8d6eDS5fXozjrg==/lib/arm64, /data/app/com.hrgworldwide.travelapp-9t1oSumR8d6eDS5fXozjrg==/base.apk!/lib/arm64-v8a, /system/lib64, /system/vendor/lib64]] at java.lang.ClassNotFoundException: Didn't find class "android.view.adaptive-icon" on path: DexPathList[[zip file "/data/app/com.hrgworldwide.travelapp-9t1oSumR8d6eDS5fXozjrg==/base.apk"],nativeLibraryDirectories=[/data/app/com.hrgworldwide.travelapp-9t1oSumR8d6eDS5fXozjrg==/lib/arm64, /data/app/com.hrgworldwide.travelapp-9t1oSumR8d6eDS5fXozjrg==/base.apk!/lib/arm64-v8a, /system/lib64, /system/vendor/lib64]] at at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:93) at at java.lang.ClassLoader.loadClass(ClassLoader.java:379) at at java.lang.ClassLoader.loadClass(ClassLoader.java:312) at at android.view.LayoutInflater.createView(LayoutInflater.java:606) at at android.view.LayoutInflater.onCreateView(LayoutInflater.java:703) at at com.android.internal.policy.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:68) at at android.view.LayoutInflater.onCreateView(LayoutInflater.java:720) at at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:788) at at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730) at at android.view.LayoutInflater.inflate(LayoutInflater.java:492) at at android.view.LayoutInflater.inflate(LayoutInflater.java:423) at at android.view.LayoutInflater.inflate(LayoutInflater.java:374) at at md500032558e65d65a9fc0bf95666812307.FingerprintDialogFragment.n_onCreateView(Native Method) at at md500032558e65d65a9fc0bf95666812307.FingerprintDialogFragment.onCreateView(FingerprintDialogFragment.java:76) at at android.app.Fragment.performCreateView(Fragment.java:2611) at at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1276) at at android.app.FragmentManagerImpl.addAddedFragments(FragmentManager.java:2421) at at android.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2200) at at android.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2154) at at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2055) at at android.app.FragmentManagerImpl$1.run(FragmentManager.java:718) at at android.os.Handler.handleCallback(Handler.java:789) at at android.os.Handler.dispatchMessage(Handler.java:98) at at android.os.Looper.loop(Looper.java:164) at at android.app.ActivityThread.main(ActivityThread.java:6938) at at java.lang.reflect.Method.invoke(Native Method) at at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327) at at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374) --- End of inner exception stack trace --- at android.view.InflateException: Binary XML file line #1: Error inflating class adaptive-icon at Caused by: java.lang.ClassNotFoundException: Didn't find class "android.view.adaptive-icon" on path: DexPathList[[zip file "/data/app/com.hrgworldwide.travelapp-9t1oSumR8d6eDS5fXozjrg==/base.apk"],nativeLibraryDirectories=[/data/app/com.hrgworldwide.travelapp-9t1oSumR8d6eDS5fXozjrg==/lib/arm64, /data/app/com.hrgworldwide.travelapp-9t1oSumR8d6eDS5fXozjrg==/base.apk!/lib/arm64-v8a, /system/lib64, /system/vendor/lib64]] at at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:93) at at java.lang.ClassLoader.loadClass(ClassLoader.java:379) at at java.lang.ClassLoader.loadClass(ClassLoader.java:312) at at android.view.LayoutInflater.createView(LayoutInflater.java:606) at at android.view.LayoutInflater.onCreateView(LayoutInflater.java:703) at at com.android.internal.policy.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:68) at at android.view.LayoutInflater.onCreateView(LayoutInflater.java:720) at at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:788) at at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730) at at android.view.LayoutInflater.inflate(LayoutInflater.java:492) at at android.view.LayoutInflater.inflate(LayoutInflater.java:423) at at android.view.LayoutInflater.inflate(LayoutInflater.java:374) at at md500032558e65d65a9fc0bf95666812307.FingerprintDialogFragment.n_onCreateView(Native Method) at at md500032558e65d65a9fc0bf95666812307.FingerprintDialogFragment.onCreateView(FingerprintDialogFragment.java:76) at at android.app.Fragment.performCreateView(Fragment.java:2611) at at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1276) at at android.app.FragmentManagerImpl.addAddedFragments(FragmentManager.java:2421) at at android.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2200) at at android.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2154) at at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2055) at at android.app.FragmentManagerImpl$1.run(FragmentManager.java:718) at at android.os.Handler.handleCallback(Handler.java:789) at at android.os.Handler.dispatchMessage(Handler.java:98) at at android.os.Looper.loop(Looper.java:164) at at android.app.ActivityThread.main(ActivityThread.java:6938) at at java.lang.reflect.Method.invoke(Native Method) at at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327) at at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374) --- End of inner exception stack trace --- at android.view.InflateException: Binary XML file line #1: Binary XML file line #1: Error inflating class adaptive-icon at Caused by: android.view.InflateException: Binary XML file line #1: Error inflating class adaptive-icon at Caused by: java.lang.ClassNotFoundException: Didn't find class "android.view.adaptive-icon" on path: DexPathList[[zip file "/data/app/com.hrgworldwide.travelapp-9t1oSumR8d6eDS5fXozjrg==/base.apk"],nativeLibraryDirectories=[/data/app/com.hrgworldwide.travelapp-9t1oSumR8d6eDS5fXozjrg==/lib/arm64, /data/app/com.hrgworldwide.travelapp-9t1oSumR8d6eDS5fXozjrg==/base.apk!/lib/arm64-v8a, /system/lib64, /system/vendor/lib64]] at at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:93) at at java.lang.ClassLoader.loadClass(ClassLoader.java:379) at at java.lang.ClassLoader.loadClass(ClassLoader.java:312) at at android.view.LayoutInflater.createView(LayoutInflater.java:606) at at android.view.LayoutInflater.onCreateView(LayoutInflater.java:703) at at com.android.internal.policy.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:68) at at android.view.LayoutInflater.onCreateView(LayoutInflater.java:720) at at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:788) at at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730) at at android.view.LayoutInflater.inflate(LayoutInflater.java:492) at at android.view.LayoutInflater.inflate(LayoutInflater.java:423) at at android.view.LayoutInflater.inflate(LayoutInflater.java:374) at at md500032558e65d65a9fc0bf95666812307.FingerprintDialogFragment.n_onCreateView(Native Method) at at md500032558e65d65a9fc0bf95666812307.FingerprintDialogFragment.onCreateView(FingerprintDialogFragment.java:76) at at android.app.Fragment.performCreateView(Fragment.java:2611) at at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1276) at at android.app.FragmentManagerImpl.addAddedFragments(FragmentManager.java:2421) at at android.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2200) at at android.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2154) at at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2055) at at android.app.FragmentManagerImpl$1.run(FragmentManager.java:718) at at android.os.Handler.handleCallback(Handler.java:789) at at android.os.Handler.dispatchMessage(Handler.java:98) at at android.os.Looper.loop(Looper.java:164) at at android.app.ActivityThread.main(ActivityThread.java:6938) at at java.lang.reflect.Method.invoke(Native Method) at at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327) at at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)

Without adaptive icon:

Android.Content.Res.Resources+NotFoundException: File res/mipmap-xxhdpi-v4/ic_launcher.png from xml type layout resource ID #0x7f030000 ---> Java.IO.FileNotFoundException: Corrupt XML binary file at java.io.FileNotFoundException: Corrupt XML binary file at at android.content.res.AssetManager.openXmlAssetNative(Native Method) at at android.content.res.AssetManager.openXmlBlockAsset(AssetManager.java:560) at at android.content.res.ResourcesImpl.loadXmlResourceParser(ResourcesImpl.java:1134) at at android.content.res.Resources.loadXmlResourceParser(Resources.java:2150) at at android.content.res.Resources.getLayout(Resources.java:1157) at at android.view.LayoutInflater.inflate(LayoutInflater.java:421) at at android.view.LayoutInflater.inflate(LayoutInflater.java:374) at at md500032558e65d65a9fc0bf95666812307.FingerprintDialogFragment.n_onCreateView(Native Method) at at md500032558e65d65a9fc0bf95666812307.FingerprintDialogFragment.onCreateView(FingerprintDialogFragment.java:76) at at android.app.Fragment.performCreateView(Fragment.java:2611) at at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1276) at at android.app.FragmentManagerImpl.addAddedFragments(FragmentManager.java:2421) at at android.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2200) at at android.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2154) at at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2055) at at android.app.FragmentManagerImpl$1.run(FragmentManager.java:718) at at android.os.Handler.handleCallback(Handler.java:789) at at android.os.Handler.dispatchMessage(Handler.java:98) at at android.os.Looper.loop(Looper.java:164) at at android.app.ActivityThread.main(ActivityThread.java:6938) at at java.lang.reflect.Method.invoke(Native Method) at at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327) at at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374) --- End of inner exception stack trace --- at android.content.res.Resources$NotFoundException: File res/mipmap-xxhdpi-v4/ic_launcher.png from xml type layout resource ID #0x7f030000 at at android.content.res.ResourcesImpl.loadXmlResourceParser(ResourcesImpl.java:1149) at at android.content.res.Resources.loadXmlResourceParser(Resources.java:2150) at at android.content.res.Resources.getLayout(Resources.java:1157) at at android.view.LayoutInflater.inflate(LayoutInflater.java:421) at at android.view.LayoutInflater.inflate(LayoutInflater.java:374) at at md500032558e65d65a9fc0bf95666812307.FingerprintDialogFragment.n_onCreateView(Native Method) at at md500032558e65d65a9fc0bf95666812307.FingerprintDialogFragment.onCreateView(FingerprintDialogFragment.java:76) at at android.app.Fragment.performCreateView(Fragment.java:2611) at at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1276) at at android.app.FragmentManagerImpl.addAddedFragments(FragmentManager.java:2421) at at android.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2200) at at android.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2154) at at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2055) at at android.app.FragmentManagerImpl$1.run(FragmentManager.java:718) at at android.os.Handler.handleCallback(Handler.java:789) at at android.os.Handler.dispatchMessage(Handler.java:98) at at android.os.Looper.loop(Looper.java:164) at at android.app.ActivityThread.main(ActivityThread.java:6938) at at java.lang.reflect.Method.invoke(Native Method) at at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327) at at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374) at Caused by: java.io.FileNotFoundException: Corrupt XML binary file at at android.content.res.AssetManager.openXmlAssetNative(Native Method) at at android.content.res.AssetManager.openXmlBlockAsset(AssetManager.java:560) at at android.content.res.ResourcesImpl.loadXmlResourceParser(ResourcesImpl.java:1134) at ... 20 more

Configuration

Version of the Plugin: 1.4.6-beta3 and above

Platform: Android 8.1, Android 7.0

Device: Samsung S8, Samsung S6

smsissuechecker commented 6 years ago

Hi @Springham,

I'm the friendly issue checker. Thanks for using the issue template :star2: I appreciate it very much. I'm sure, the maintainers of this repository will answer, soon.

smstuebe commented 6 years ago

Hmm this seems to be related to #67 and #84. I can't really reproduce this. Looks like something goes wrong in the packaging process :(

Springham commented 6 years ago

We're currently on 1.4.5. Upgrading to 1.4.6-beta2 is fine but when we upgrade to 1.4.6-beta3 we get this exception. The only thing I can see is that the package started targeting android 6.0. I wonder if that could cause this?

smstuebe commented 6 years ago

which commit do you refer to?

Springham commented 6 years ago

I was referring to commit: ac5fb49. There are only 2 commits that could have affected android as far as I can see, this one and cb186a9. One of these commits causes a crash in my solution for some reason.

Springham commented 6 years ago

Ok investigating a bit more, it works when I include a view called FingerprintDialog.axml in my resources and make it the same layout as the default one (https://github.com/smstuebe/xamarin-fingerprint/blob/e121c22b2e802644fea6aac391e83ef99fe1481b/src/Plugin.Fingerprint.Android/Resources/layout/FingerprintDialog.axml). For some reason there is an issue with the resources.

I've noticed in my build the following: /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/Android/Xamarin.Android.Common.targets(1419,2): warning XA0106: Skipping TravelApp.Droid.Resource.Drawable.fingerprint_white. Please check that your Nuget Package versions are compatible. /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/Android/Xamarin.Android.Common.targets(1419,2): warning XA0106: Skipping TravelApp.Droid.Resource.Id.fingerprint_btnCancel. Please check that your Nuget Package versions are compatible. /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/Android/Xamarin.Android.Common.targets(1419,2): warning XA0106: Skipping TravelApp.Droid.Resource.Id.fingerprint_btnFallback. Please check that your Nuget Package versions are compatible. /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/Android/Xamarin.Android.Common.targets(1419,2): warning XA0106: Skipping TravelApp.Droid.Resource.Id.fingerprint_imgFingerprint. Please check that your Nuget Package versions are compatible. /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/Android/Xamarin.Android.Common.targets(1419,2): warning XA0106: Skipping TravelApp.Droid.Resource.Id.fingerprint_txtHelp. Please check that your Nuget Package versions are compatible. /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/Android/Xamarin.Android.Common.targets(1419,2): warning XA0106: Skipping TravelApp.Droid.Resource.Id.fingerprint_txtReason. Please check that your Nuget Package versions are compatible. /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/Android/Xamarin.Android.Common.targets(1419,2): warning XA0106: Skipping TravelApp.Droid.Resource.Layout.FingerprintDialog. Please check that your Nuget Package versions are compatible.

Which I'm assuming is causing the problem. Not sure why this has suddenly started being an issue. Have you seen this issue before?

Springham commented 6 years ago

Nope, I'm wrong (something was cached). Only when I inherit from the FingerprintDialogFragment and override OnCreateView does it stop the crash. Strange stuff.

smstuebe commented 6 years ago

exactly... It feels not deterministic :( Sometimes I can reproduce it, sometimes not :/

Springham commented 6 years ago

I've had to rollback to 1.4.5 as we have a release coming up :(

If I upgrade from 1.4.6-beta2 to 1.4.6-beta3. Clear bin/obj. Fingerprint crashes. If I downgrade back to 1.4.6-beta2. Clear bin/obj. Fingerprint works as expected.

Something seems to have changed in that 1.4.6-beta3 release but I have no idea what!

I'm going to try upgrading again once we've gone to net standard and MvvmCross 6.x

RichardeButler commented 6 years ago

Upgraded VS 2017 Pro to netstandard 2.0.3. Installed 1.4.7. Getting the same Null exception as you guys when calling CrossFingerprint.Current.AuthenticateAsync();

{System.NullReferenceException: Object reference not set to an instance of an object. at ....LoginPage+d__10.MoveNext () [0x00018] in ..}

iOS is working.

Tried downgrading to 1.4.5 with no success. Any thoughts? When I upgrade netstandard, I upgraded a lot of packages. Not sure I want to back out the netstandard upgrade.