google / android-fhir

The Android FHIR SDK is a set of Kotlin libraries for building offline-capable, mobile-first healthcare applications using the HL7® FHIR® standard on Android.
https://google.github.io/android-fhir/
Apache License 2.0
465 stars 246 forks source link

HAPI FHIR structure lib cannot be used on Android SDK version 19 (kitkat) #55

Closed jingtang10 closed 3 years ago

jingtang10 commented 4 years ago

See issue #49.

While running master on API level 19, there's this error:

05-15 12:09:05.044 3357-3357/com.google.fhirengine.example E/AndroidRuntime: FATAL EXCEPTION: main Process: com.google.fhirengine.example, PID: 3357 java.lang.VerifyError: org/apache/log4j/config/PropertySetter at org.apache.log4j.PropertyConfigurator.parseAppender(PropertyConfigurator.java:805) at org.apache.log4j.PropertyConfigurator.parseCategory(PropertyConfigurator.java:768) at org.apache.log4j.PropertyConfigurator.configureRootCategory(PropertyConfigurator.java:648) at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:514) at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:580) at org.apache.log4j.helpers.OptionConverter.selectAndConfigure(OptionConverter.java:526) at org.apache.log4j.LogManager.(LogManager.java:127) at org.slf4j.impl.Log4jLoggerFactory.(Log4jLoggerFactory.java:66) at org.slf4j.impl.StaticLoggerBinder.(StaticLoggerBinder.java:72) at org.slf4j.impl.StaticLoggerBinder.(StaticLoggerBinder.java:45) at org.slf4j.LoggerFactory.bind(LoggerFactory.java:150) at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:124) at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:412) at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:357) at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:383) at ca.uhn.fhir.context.FhirContext.(FhirContext.java:80) at com.google.fhirengine.resource.ResourceModule.getFhirContext(ResourceModule.java:29) at com.google.fhirengine.resource.ResourceModule_GetFhirContextFactory.proxyGetFhirContext(ResourceModule_GetFhirContextFactory.java:27) at com.google.fhirengine.DaggerFhirEngineComponent.getIParser(DaggerFhirEngineComponent.java:34) at com.google.fhirengine.DaggerFhirEngineComponent.getDatabaseImpl(DaggerFhirEngineComponent.java:38) at com.google.fhirengine.DaggerFhirEngineComponent.getFhirEngineImpl(DaggerFhirEngineComponent.java:62) at com.google.fhirengine.DaggerFhirEngineComponent.getFhirEngine(DaggerFhirEngineComponent.java:75) at com.google.fhirengine.example.MainActivity.onCreate(MainActivity.java:95) at android.app.Activity.performCreate(Activity.java:5231) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245) at android.app.ActivityThread.access$800(ActivityThread.java:135) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) at android.os.Handler.dispatchMessage(Handler.java:102) 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 dalvik.system.NativeStart.main(Native Method)

which is an issue due to missing java libraries on Android which are used by HAPI FHIR.

Potentially investigate: https://stackoverflow.com/questions/30185857/apache-log4j-in-android-gives-exception-java-lang-verifyerror-org-apache-log4j

yigit commented 4 years ago

i have a similar problem but API 23:

java.lang.NoClassDefFoundError: ca.uhn.fhir.context.-$$Lambda$ModelScanner$g2HuBd2f0zYe41e1hQElhipLfVk
at ca.uhn.fhir.context.ModelScanner.init(ModelScanner.java:108)
at ca.uhn.fhir.context.ModelScanner.<init>(ModelScanner.java:65)
at ca.uhn.fhir.context.FhirContext.scanResourceTypes(FhirContext.java:783)
at ca.uhn.fhir.context.FhirContext.validateInitialized(FhirContext.java:896)
at ca.uhn.fhir.context.FhirContext.getResourceDefinition(FhirContext.java:427)
at ca.uhn.fhir.parser.BaseParser.encodeResourceToWriter(BaseParser.java:408)
at ca.uhn.fhir.parser.BaseParser.encodeResourceToWriter(BaseParser.java:395)
at ca.uhn.fhir.parser.BaseParser.encodeResourceToString(BaseParser.java:384)
at com.google.fhirengine.db.impl.Dao.insert(RoomResourceDb.kt:68)

Seems like the library uses the stream APIs which cannot be used on android. Not sure if there is some configuration to fix these, at least i would expect build to fail when this happens :/.

yigit commented 4 years ago

https://github.com/jamesagnew/hapi-fhir/issues/722#issuecomment-573449132

jingtang10 commented 4 years ago

I think the stream API can be desugared if you're on Android Studio 4.0 beta. Are you on AS 4.0 beta?

jingtang10 commented 4 years ago

We have some documentation: https://github.com/jingtang10/fhir-engine#requirements And this is the feature we rely on: https://developer.android.com/studio/preview/features#j8-desugar

yigit commented 4 years ago

oh i couldn't find that :facepalm: . I think we need to enable coreLibraryDesugaring. i'll try w/ that later and also try to add an api 21 test target

jingtang10 commented 3 years ago

We have established the min API level 21 for the SDK. This item is obsolete.