corona-warn-app / cwa-app-android

Native Android app using the Apple/Google exposure notification API. The CWA development ends on May 31, 2023. You still can warn other users until April 30, 2023. More information:
https://coronawarn.app/en/faq/#ramp_down
Apache License 2.0
2.44k stars 495 forks source link

Make app run on Android 5 Lollipop (sdkversion 21) #649

Closed messersm closed 4 years ago

messersm commented 4 years ago

Feature description

The Corona warning app should be able to run on Android 5 (Lollipop, skdversion 21).

Problem and motivation

According to the Android distribution chart in Android Studio Lollipop (5.1 and 5.2) is used by 9.2 percent. With a total market share of 75% and around 90% of the german population owning a smartphone the corona app is excluding approx. 5.163.571 people from using it (on Android alone).

Lollipop is used on smartphones, which where released 3-4 years ago. It's clear, that people, who buy used phones or keep phones longer (that is: people with not much money!) are the ones, who can't use the app.

I don't think this is acceptable given the fact, that the whole population should be protected.

Is this something you're interested in working on

Yes, I would be willing to work on this and already began, but I need help (and also, I'm neither experienced in writing Kotlin, nor with writing Android Apps, so if anyone else want's to jump in, please do!).

I was able to get the (debug) app build for sdkversion 21 by upgrading to androidx.security:security-crypto:1.1.0-alpha01.

You can take a look at this here: https://github.com/messersm/cwa-app-android/commit/ab555698e64ef613f9485a0886109d1cbc121fe0

However, the application crashes on start, with: java.lang.NoClassDefFoundError: Failed resolution of: Landroid/security/keystore/KeyGenParameterSpec$Builder; (Line 165). I guess, this has to do with the fact, that androidx.security:security-crypto:1.1.0-alpha01 doesn't use the keystore on lollipop (see here: https://developer.android.com/jetpack/androidx/releases/security#security-crypto-1.1.0-alpha01) and some libraries are loaded by name lookups (since the app did compile and install).

I/art     (28740): Late-enabling -Xcheck:jni
I/ActivityManager(  679): Start proc 28740:de.rki.coronawarnapp/u0a158 for activity de.rki.coronawarnapp/.ui.LauncherActivity
D/ADB_SERVICES(22522): Adding socket 14 pid 28740 to jdwp process list
W/ADB_SERVICES(22522): create_local_service_socket() name=jdwp:28740
W/ADB_SERVICES(22522): service_to_fd() name=jdwp:28740
W/ADB_SERVICES(22522): looking for pid 28740 in JDWP process list return fds0(22) fds1(23)
W/ADB_SERVICES(22522): LS(7): bound to 'jdwp:28740' via 22
W/ADB_SERVICES(22522): trying to write to JDWP socket=14 pid=28740 count=1 out_fds=23
I/libPerfService(  679): perfSetFavorPid - pid:28740, 7044
D/ActivityManager(  679): getContentProviderImpl: from caller=android.app.ApplicationThreadProxy@160c899d (pid=28740, userId=0) to get content provider settings cpr=ContentProviderRecord{24d9fc38 u0 com.android.providers.settings/.SettingsProvider}
V/SettingsInterface(28740): invalidate [system]: current 300 != cached 0
D/ActivityThread(28740): hoder:android.app.IActivityManager$ContentProviderHolder@393788a,provider,holder.Provider:android.content.ContentProviderProxy@39408efb
D/Proxy   (28740): setHttpRequestCheckHandler
D/ActivityThread(28740): installProvider: context.getPackageName()=de.rki.coronawarnapp
D/ActivityThread(28740): installProvider: context.getPackageName()=de.rki.coronawarnapp
D/ActivityManager(  679): publishContentProviders: from caller=android.app.ApplicationThreadProxy@a0afa0c (pid=28740)
E/SQLiteLog(28740): (283) recovered 27 frames from WAL file /data/data/de.rki.coronawarnapp/databases/androidx.work.workdb-wal
D/MPEG4Extractor(  179): chunk: styp @ 692874050, 0
D/MPEG4Extractor(  179): chunk: moof @ 692874078, 0
D/MPEG4Extractor(  179): chunk: mfhd @ 692874086, 1
D/OpenSSLLib(28740): OpensslErr:Module:13(114:155); file:external/openssl/crypto/asn1/asn1_lib.c ;Line:145;Function:ASN1_get_object
W/linker  (28740): libconscrypt_jni.so: unused DT entry: type 0x6ffffef5 arg 0x1edd8
W/linker  (28740): libconscrypt_jni.so: unused DT entry: type 0x6ffffffe arg 0x2c168
W/linker  (28740): libconscrypt_jni.so: unused DT entry: type 0x6fffffff arg 0x2
V/NativeCrypto(28740): Registering org/conscrypt/NativeCrypto's 286 native methods...
I/art     (28740): Rejecting re-init on previously-failed class java.lang.Class<org.conscrypt.Java7ExtendedSSLSession>
I/art     (28740): Rejecting re-init on previously-failed class java.lang.Class<org.conscrypt.Java7ExtendedSSLSession>
I/art     (28740): Rejecting re-init on previously-failed class java.lang.Class<org.conscrypt.Java8ExtendedSSLSession>
I/art     (28740): Rejecting re-init on previously-failed class java.lang.Class<org.conscrypt.Java8ExtendedSSLSession>
V/ActivityThread(28740): Handling launch of ActivityRecord{214b3b9a token=android.os.BinderProxy@c4d7ccb {de.rki.coronawarnapp/de.rki.coronawarnapp.ui.LauncherActivity}}
V/ActivityThread(28740): ActivityRecord{214b3b9a token=android.os.BinderProxy@c4d7ccb {de.rki.coronawarnapp/de.rki.coronawarnapp.ui.LauncherActivity}}: app=de.rki.coronawarnapp.CoronaWarnApplication@2d268845, appName=de.rki.coronawarnapp, pkg=de.rki.coronawarnapp, comp={de.rki.coronawarnapp/de.rki.coronawarnapp.ui.LauncherActivity}, dir=/data/app/de.rki.coronawarnapp-1/base.apk
D/FeatureProxyBase(28740): FeatureProxyBase class constructor
D/FeatureProxyBase(28740): getService(), serviceName = multiwindow_service_v1
I/art     (28740): Background sticky concurrent mark sweep GC freed 34440(1419KB) AllocSpace objects, 3(302KB) LOS objects, 10% free, 13MB/14MB, paused 6.850ms total 54.075ms
D/FeatureProxyBase(28740): FeatureProxyBase class constructor
D/FeatureProxyBase(28740): getService(), serviceName = multiwindow_service_v1
D/FeatureProxyBase(28740): FeatureProxyBase class constructor
D/FeatureProxyBase(28740): getService(), serviceName = multiwindow_service_v1
W/art     (28740): Before Android 4.1, method android.graphics.PorterDuffColorFilter androidx.vectordrawable.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
V/CoronaWarnApplication(28740): App foregrounded
D/AccessibilityManager(28740): setStateLocked: wasEnabled = false, mIsEnabled = false, wasTouchExplorationEnabled = false, mIsTouchExplorationEnabled = false, wasHighTextContrastEnabled = false, mIsHighTextContrastEnabled = false
D/AccessibilityManager(28740): java.lang.Throwable: setStateLocked
D/AccessibilityManager(28740):  at android.view.accessibility.AccessibilityManager.setStateLocked(AccessibilityManager.java:553)
D/AccessibilityManager(28740):  at android.view.accessibility.AccessibilityManager.tryConnectToServiceLocked(AccessibilityManager.java:636)
D/AccessibilityManager(28740):  at android.view.accessibility.AccessibilityManager.<init>(AccessibilityManager.java:226)
D/AccessibilityManager(28740):  at android.view.accessibility.AccessibilityManager.getInstance(AccessibilityManager.java:206)
D/AccessibilityManager(28740):  at android.view.View.setFlags(View.java:9843)
D/AccessibilityManager(28740):  at android.view.ViewGroup.initViewGroup(ViewGroup.java:536)
D/AccessibilityManager(28740):  at android.view.ViewGroup.<init>(ViewGroup.java:525)
D/AccessibilityManager(28740):  at android.view.ViewGroup.<init>(ViewGroup.java:520)
D/AccessibilityManager(28740):  at android.view.ViewGroup.<init>(ViewGroup.java:516)
D/AccessibilityManager(28740):  at android.view.ViewGroup.<init>(ViewGroup.java:512)
D/AccessibilityManager(28740):  at android.widget.FrameLayout.<init>(FrameLayout.java:119)
D/AccessibilityManager(28740):  at com.android.internal.policy.impl.PhoneWindow$DecorView.<init>(PhoneWindow.java:2326)
D/AccessibilityManager(28740):  at com.android.internal.policy.impl.PhoneWindow.generateDecor(PhoneWindow.java:3460)
D/AccessibilityManager(28740):  at com.android.internal.policy.impl.PhoneWindow.installDecor(PhoneWindow.java:3846)
D/AccessibilityManager(28740):  at com.android.internal.policy.impl.PhoneWindow.getDecorView(PhoneWindow.java:2042)
D/AccessibilityManager(28740):  at androidx.appcompat.app.AppCompatDelegateImpl.createSubDecor(AppCompatDelegateImpl.java:717)
D/AccessibilityManager(28740):  at androidx.appcompat.app.AppCompatDelegateImpl.ensureSubDecor(AppCompatDelegateImpl.java:659)
D/AccessibilityManager(28740):  at androidx.appcompat.app.AppCompatDelegateImpl.onPostCreate(AppCompatDelegateImpl.java:376)
D/AccessibilityManager(28740):  at androidx.appcompat.app.AppCompatActivity.onPostCreate(AppCompatActivity.java:118)
D/AccessibilityManager(28740):  at android.app.Instrumentation.callActivityOnPostCreate(Instrumentation.java:1194)
D/AccessibilityManager(28740):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2497)
D/AccessibilityManager(28740):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2601)
D/AccessibilityManager(28740):  at android.app.ActivityThread.access$800(ActivityThread.java:178)
D/AccessibilityManager(28740):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1470)
D/AccessibilityManager(28740):  at android.os.Handler.dispatchMessage(Handler.java:111)
D/AccessibilityManager(28740):  at android.os.Looper.loop(Looper.java:194)
D/AccessibilityManager(28740):  at android.app.ActivityThread.main(ActivityThread.java:5637)
D/AccessibilityManager(28740):  at java.lang.reflect.Method.invoke(Native Method)
D/AccessibilityManager(28740):  at java.lang.reflect.Method.invoke(Method.java:372)
D/AccessibilityManager(28740):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:960)
D/AccessibilityManager(28740):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
I/art     (28740): Rejecting re-init on previously-failed class java.lang.Class<androidx.core.view.ViewCompat$2>
I/art     (28740): Rejecting re-init on previously-failed class java.lang.Class<androidx.core.view.ViewCompat$2>
V/ActivityThread(28740): Performing resume of ActivityRecord{214b3b9a token=android.os.BinderProxy@c4d7ccb {de.rki.coronawarnapp/de.rki.coronawarnapp.ui.LauncherActivity}}
I/art     (28740): Background partial concurrent mark sweep GC freed 7909(468KB) AllocSpace objects, 2(541KB) LOS objects, 22% free, 13MB/17MB, paused 10.836ms total 73.570ms
D/ActivityThread(28740): ACT-AM_ON_RESUME_CALLED ActivityRecord{214b3b9a token=android.os.BinderProxy@c4d7ccb {de.rki.coronawarnapp/de.rki.coronawarnapp.ui.LauncherActivity}}
V/ActivityThread(28740): Resume ActivityRecord{214b3b9a token=android.os.BinderProxy@c4d7ccb {de.rki.coronawarnapp/de.rki.coronawarnapp.ui.LauncherActivity}} started activity: false, hideForNow: false, finished: false
V/PhoneWindow(28740): DecorView setVisiblity: visibility = 4 ,Parent =null, this =com.android.internal.policy.impl.PhoneWindow$DecorView{2a251d6d I.E..... R.....I. 0,0-0,0}
I/SurfaceFlinger(  165): EventThread Client Pid (28740) created
I/SurfaceFlinger(  165): EventThread Client Pid (28740) created
D/OpenGLRenderer(28740): initialize DisplayEventReceiver 0xb47ff168
D/OpenGLRenderer(28740): Use EGL_SWAP_BEHAVIOR_PRESERVED: false
D/GraphicBuffer(28740): register, handle(0xa1c10ca0) (w:1280 h:1600 s:1280 f:0x1 u:0x000100)
D/Atlas   (28740): Validating map...
I/okhttp.OkHttpClient(28740): --> GET https://svc90.main.px.t-online.de/version/v1/configuration/country/DE/app_config
I/okhttp.OkHttpClient(28740): --> END GET
D/ViewRootImpl(28740): hardware acceleration is enabled, this = ViewRoot{390aa035 de.rki.coronawarnapp/de.rki.coronawarnapp.ui.LauncherActivity,ident = 0}
V/ActivityThread(28740): Resuming ActivityRecord{214b3b9a token=android.os.BinderProxy@c4d7ccb {de.rki.coronawarnapp/de.rki.coronawarnapp.ui.LauncherActivity}} with isForward=true
D/FeatureProxyBase(28740): FeatureProxyBase class constructor
D/FeatureProxyBase(28740): getService(), serviceName = multiwindow_service_v1
V/PhoneWindow(28740): DecorView setVisiblity: visibility = 0 ,Parent =ViewRoot{390aa035 de.rki.coronawarnapp/de.rki.coronawarnapp.ui.LauncherActivity,ident = 0}, this =com.android.internal.policy.impl.PhoneWindow$DecorView{2a251d6d V.E..... R.....I. 0,0-0,0}
V/ActivityThread(28740): Scheduling idle handler for ActivityRecord{214b3b9a token=android.os.BinderProxy@c4d7ccb {de.rki.coronawarnapp/de.rki.coronawarnapp.ui.LauncherActivity}}
I/System.out(28740): [CDS][DNS] getAllByNameImpl netId = 0
D/libc-netbsd(28740): [getaddrinfo]: hostname=svc90.main.px.t-online.de; servname=(null); cache_mode=(null), netid=0; mark=0
D/libc-netbsd(28740): [getaddrinfo]: ai_addrlen=0; ai_canonname=(null); ai_flags=4; ai_family=0
D/libc-netbsd(28740): [getaddrinfo]: hostname=svc90.main.px.t-online.de; servname=(null); cache_mode=(null), netid=0; mark=0
D/libc-netbsd(28740): [getaddrinfo]: ai_addrlen=0; ai_canonname=(null); ai_flags=1024; ai_family=0
D/OpenGLRenderer(28740): CanvasContext() 0xb44971c0 initialize 0xb45cde08
E/[DRVB][EXT][UTIL](28740): disp_only_chk: DRVB CHECK DISP PROCESS DONE ! (2/0x47/0x48/0x46)
E/[DRVB][EXT][UTIL](28740): disp_only_chk: DRVB CHECK DISP PROCESS DONE ! (720/0/1)
E/[DRVB][EXT][UTIL](28740): disp_only_chk: DRVB CHECK0 PROCESS DONE ! STATUS (0x2000)
W/[DRVB]  (28740): sec_drv_base_check: DRVB PROCESS STATUS = 0x2000
V/InputMethodManager(28740): onWindowFocus: null softInputMode=288 first=true flags=#81812100
V/InputMethodManager(28740): START INPUT: com.android.internal.policy.impl.PhoneWindow$DecorView{2a251d6d V.E..... R.....ID 0,0-720,1280} ic=null tba=android.view.inputmethod.EditorInfo@2cd20ab1 controlFlags=#104
I/OpenGLRenderer(28740): Initialized EGL, version 1.4
I/OpenGLRenderer(28740): Get enable program binary service property (1)
I/OpenGLRenderer(28740): Initializing program atlas...
D/ProgramBinary/Service(28740): BpProgramBinaryService.getFileDescriptor
D/ProgramBinary/Service(28740): BpProgramBinaryService.getProgramMapLen
D/ProgramBinary/Service(28740): BpProgramBinaryService.getProgramMapArray
D/ProgramBinary/Service(28740): BpProgramBinaryService.getProgramBinaryLen
I/OpenGLRenderer(28740): Program binary detail: Binary length is 90540, program map length is 112.
I/OpenGLRenderer(28740): No need to use file discriptor anymore, close fd(48).
D/OpenGLRenderer(28740): TaskManager() 0xb45bbde0, cpu = 4, thread = 2
D/OpenGLRenderer(28740): Enabling debug mode 0
I/[MALI][Gralloc](28740): dlopen libsec_mem.so fail
D/Surface (28740): Surface::connect(this=0xb45cde00,api=1)
I/BufferQueueProducer(  165): [de.rki.coronawarnapp/de.rki.coronawarnapp.ui.LauncherActivity](this:0xb5c54400,id:11471,api:1,p:28740,c:165) connect(P): api=1 producer=(28740:de.rki.coronawarnapp) producerControlledByApp=true
I/BufferQueueProducer(  165): [de.rki.coronawarnapp/de.rki.coronawarnapp.ui.LauncherActivity](this:0xb5c54400,id:11471,api:1,p:28740,c:165) new GraphicBuffer needed
D/GraphicBuffer(28740): register, handle(0xa1c10fa0) (w:720 h:1280 s:720 f:0x1 u:0x000f02)
D/BufferQueueProducer(  165): [de.rki.coronawarnapp/de.rki.coronawarnapp.ui.LauncherActivity](this:0xb5c54400,id:11471,api:1,p:28740,c:165) cancelBuffer: slot 0
I/MaliEGL (28740): [Mali]window_type=1, is_framebuffer=0, errnum = 0
I/MaliEGL (28740): [Mali]surface->num_buffers=4, surface->num_frames=3, win_min_undequeued=1
I/MaliEGL (28740): [Mali]max_allowed_dequeued_buffers=3
D/Surface (28740): Surface::setBufferCount(this=0xb45cde00,bufferCount=4)
I/BufferQueueProducer(  165): [de.rki.coronawarnapp/de.rki.coronawarnapp.ui.LauncherActivity](this:0xb5c54400,id:11471,api:1,p:28740,c:165) setBufferCount: count = 4
I/BufferQueueConsumer(  165): [de.rki.coronawarnapp/de.rki.coronawarnapp.ui.LauncherActivity](this:0xb5c54400,id:11471,api:1,p:28740,c:165) getReleasedBuffers: returning mask 0xffffffffffffffff
D/GraphicBuffer(28740): unregister, handle(0xa1c10fa0) (w:720 h:1280 s:720 f:0x1 u:0x000f02)
I/BufferQueueProducer(  165): [de.rki.coronawarnapp/de.rki.coronawarnapp.ui.LauncherActivity](this:0xb5c54400,id:11471,api:1,p:28740,c:165) new GraphicBuffer needed
D/GraphicBuffer(28740): register, handle(0xa1c10fa0) (w:720 h:1280 s:720 f:0x1 u:0x000f02)
D/Surface (28740): Surface::allocateBuffers(this=0xb45cde00)
D/BufferQueueProducer(  165): [de.rki.coronawarnapp/de.rki.coronawarnapp.ui.LauncherActivity](this:0xb5c54400,id:11471,api:1,p:28740,c:165) allocateBuffers: allocating from 1 buffers up to 4 buffers
D/BufferQueueProducer(  165): [de.rki.coronawarnapp/de.rki.coronawarnapp.ui.LauncherActivity](this:0xb5c54400,id:11471,api:1,p:28740,c:165) allocateBuffers: allocating from 4 buffers up to 4 buffers
D/libc-netbsd(28740): getaddrinfo: svc90.main.px.t-online.de get result from proxy >>
I/System.out(28740): propertyValue:true
I/System.out(28740): [CDS]rx timeout:10000
I/System.out(28740): [socket][0] connection svc90.main.px.t-online.de/87.140.208.153:443;LocalPort=44658(10000)
I/System.out(28740): [CDS]connect[svc90.main.px.t-online.de/87.140.208.153:443] tm:10
D/Posix   (28740): [Posix_connect Debug]Process de.rki.coronawarnapp :443 
I/System.out(28740): [socket][/100.74.179.237:44658] connected
I/System.out(28740): [CDS]rx timeout:10000
I/okhttp.OkHttpClient(28740): <-- 200 OK https://svc90.main.px.t-online.de/version/v1/configuration/country/DE/app_config (1325ms)
I/okhttp.OkHttpClient(28740): Server: nginx
I/okhttp.OkHttpClient(28740): Date: Tue, 16 Jun 2020 12:24:15 GMT
I/okhttp.OkHttpClient(28740): Content-Type: application/octet-stream
I/okhttp.OkHttpClient(28740): Content-Length: 557
I/okhttp.OkHttpClient(28740): Connection: keep-alive
I/okhttp.OkHttpClient(28740): ETag: "e881f7ed16a56975ca1feca6534ac45a"
I/okhttp.OkHttpClient(28740): Last-Modified: Mon, 15 Jun 2020 17:18:17 GMT
I/okhttp.OkHttpClient(28740): Cache-Control: public,max-age=300
I/okhttp.OkHttpClient(28740): x-amz-meta-cwa-hash: b70a04b564e2374eabf6042b4cb24a01
I/okhttp.OkHttpClient(28740): Content-Security-Policy: default-src 'self' *.coronawarn.app; img-src 'self' *.coronawarn.app data:
I/okhttp.OkHttpClient(28740): X-Content-Type-Options: nosniff
I/okhttp.OkHttpClient(28740): X-Frame-Options: DENY
I/okhttp.OkHttpClient(28740): X-XSS-Protection: 1
I/okhttp.OkHttpClient(28740): Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
I/okhttp.OkHttpClient(28740): Accept-Ranges: bytes
I/okhttp.OkHttpClient(28740): <-- END HTTP (binary 557-byte body omitted)
V/ZipHelper(28740): read zip entry export.sig
V/ZipHelper(28740): read zip entry export.bin
E/AndroidRuntime(28740): FATAL EXCEPTION: main
E/AndroidRuntime(28740): Process: de.rki.coronawarnapp, PID: 28740
E/AndroidRuntime(28740): java.lang.NoClassDefFoundError: Failed resolution of: Landroid/security/keystore/KeyGenParameterSpec$Builder;
E/AndroidRuntime(28740):    at androidx.security.crypto.MasterKeys.createAES256GCMKeyGenParameterSpec(MasterKeys.java:72)
E/AndroidRuntime(28740):    at androidx.security.crypto.MasterKeys.<clinit>(MasterKeys.java:55)
E/AndroidRuntime(28740):    at de.rki.coronawarnapp.util.security.SecurityHelper.<clinit>(SecurityHelper.kt:43)
E/AndroidRuntime(28740):    at de.rki.coronawarnapp.util.security.VerificationKeys.hasInvalidSignature(VerificationKeys.kt:24)
E/AndroidRuntime(28740):    at de.rki.coronawarnapp.http.WebRequestBuilder$asyncGetApplicationConfigurationFromServer$2.invokeSuspend(WebRequestBuilder.kt:126)
E/AndroidRuntime(28740):    at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
E/AndroidRuntime(28740):    at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:56)
E/AndroidRuntime(28740):    at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:571)
E/AndroidRuntime(28740):    at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:738)
E/AndroidRuntime(28740):    at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:678)
E/AndroidRuntime(28740):    at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:665)
E/AndroidRuntime(28740): Caused by: java.lang.ClassNotFoundException: Didn't find class "android.security.keystore.KeyGenParameterSpec$Builder" on path: DexPathList[[zip file "/data/app/de.rki.coronawarnapp-1/base.apk"],nativeLibraryDirectories=[/data/app/de.rki.coronawarnapp-1/lib/arm, /vendor/lib, /system/lib]]
E/AndroidRuntime(28740):    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
E/AndroidRuntime(28740):    at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
E/AndroidRuntime(28740):    at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
E/AndroidRuntime(28740):    ... 11 more
E/AndroidRuntime(28740):    Suppressed: java.lang.ClassNotFoundException: android.security.keystore.KeyGenParameterSpec$Builder
E/AndroidRuntime(28740):        at java.lang.Class.classForName(Native Method)
E/AndroidRuntime(28740):        at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
E/AndroidRuntime(28740):        at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
E/AndroidRuntime(28740):        at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
E/AndroidRuntime(28740):        ... 12 more
E/AndroidRuntime(28740):    Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available
D/MPEG4Extractor(  179): chunk: trun @ 203228740, 2
D/AES     (  679):       pid : 28740
D/AEE/LIBAEE(  679): shell: raise_exp(4, 28740, -1361051648, de.rki.coronawarnapp, 0x0x9ebdc000, 0x0x0)
I/AEE/AED (28778): [OnPurpose Redunant in void preset_info(aed_report_record*, int, int)] pid: 28740, tid: -1361051648, name: UNKNOWN  >>> de.rki.coronawarnapp <<<
I/Process (28740): Sending signal. PID: 28740 SIG: 9
D/DisplayManagerService(  679): Display listener for pid 28740 died.
I/SurfaceFlinger(  165): EventThread Client Pid (28740) disconnected by (165)
I/SurfaceFlinger(  165): EventThread Client Pid (28740) disconnected by (165)
W/ADB_SERVICES(22522): terminating JDWP 28740 connection: Try again
D/ADB_SERVICES(22522): remove pid 28740 to jdwp process list
I/ActivityManager(  679): Process de.rki.coronawarnapp (pid 28740) has died
D/ActivityManager(  679): SVC-handleAppDiedLocked: app = ProcessRecord{356f533 28740:de.rki.coronawarnapp/u0a158}, app.pid = 28740
D/ActivityManager(  679): cleanUpApplicationRecord -- 28740
harambasicluka commented 4 years ago

Hi @messersm ,

thank's for your feedback, unfortunately that's not possible because of the min. version of the Exposure Notification API (page 3, on the bottom).

image

We would really like to increase the user base with such a change, but as I said it isn't technically possible.

Thanks, Luka

messersm commented 4 years ago

@harambasicluka Thanks for the quick feedback. It seems, there are questions about this requirement: https://github.com/google/exposure-notifications-android/issues/16

The code itself declares version 21 as the minimum: https://github.com/google/exposure-notifications-android/blob/master/app/build.gradle#L35

Could we please, if nothing else, keep this open? I don't think the last word is spoken on this one.

treysis commented 4 years ago

Latvia uses minSdk=21 so it should be possible?

https://play.google.com/store/apps/details?id=lv.spkc.gov.apturicovid

sdeff commented 4 years ago

I guess the Exposure Notifications API documentation has been updated recently:

[...] The framework works on some devices as low as version 5.0 (API level 21), so using this version is an option to increase the number of devices eligible. [...]

Maybe the minSdk version should be reconsidered?

treysis commented 4 years ago

Good find!