Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

KOReader v2021.01 crashes on Boox Carta+ #7193

Closed
plague-doctor opened this issue Jan 24, 2021 · 19 comments · Fixed by #7202
Closed

KOReader v2021.01 crashes on Boox Carta+ #7193

plague-doctor opened this issue Jan 24, 2021 · 19 comments · Fixed by #7202

Comments

@plague-doctor
Copy link

  • KOReader version: koreader-android-arm-v2021.01
  • Device: C67ML Carta+

Issue

KOReader crashes when starting.

Steps to reproduce

  1. Install koreader-android-arm-v2021.01
  2. Start the app

Version koreader-android-arm-v2020.12 works with no problem.

@NiLuJe
Copy link
Member

NiLuJe commented Jan 24, 2021

Nightmode is enabled? If so, c.f., the tail end of #7187 ;).

if not, still going to need actual logs ^^.

@pazos
Copy link
Member

pazos commented Jan 24, 2021

pinging @plague-doctor ^^

@plague-doctor
Copy link
Author

I/ActivityManager(  337): START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 pkg=org.koreader.launcher cmp=org.koreader.launcher/.MainActivity} from pid 535
I/ActivityManager(  337): Start proc org.koreader.launcher for activity org.koreader.launcher/.MainActivity: pid=1281 uid=10039 gids={50039, 3003, 1028, 1015}
I/qtaguid (  337): Failed write_ctrl(s 1 10039) res=-1 errno=1
W/NetworkManagementSocketTagger(  337): setKernelCountSet(10039, 1) failed with errno -1
I/dalvikvm( 1281): Could not find method android.view.View.getRootWindowInsets, referenced from method org.koreader.launcher.MainActivity.onAttachedToWindow
W/dalvikvm( 1281): VFY: unable to resolve virtual method 1562: Landroid/view/View;.getRootWindowInsets ()Landroid/view/WindowInsets;
D/dalvikvm( 1281): VFY: replacing opcode 0x6e at 0x0024
I/dalvikvm( 1281): Could not find method android.app.NativeActivity.onRequestPermissionsResult, referenced from method org.koreader.launcher.MainActivity.onRequestPermissionsResult
W/dalvikvm( 1281): VFY: unable to resolve virtual method 222: Landroid/app/NativeActivity;.onRequestPermissionsResult (I[Ljava/lang/String;[I)V
D/dalvikvm( 1281): VFY: replacing opcode 0x6f at 0x0013
V/KOReader( 1281): Launching KOReader {
V/KOReader( 1281):   VM heap: 96MB
V/KOReader( 1281):   Flags: user
V/KOReader( 1281):   Paths: {
V/KOReader( 1281): 	Assets: /data/data/org.koreader.launcher/files
V/KOReader( 1281): 	Storage: /mnt/sdcard
V/KOReader( 1281):   }
V/KOReader( 1281): }
D/dalvikvm( 1281): Trying to load lib /data/app-lib/org.koreader.launcher-2/lib7z.so 0x421a6218
D/dalvikvm( 1281): Added shared lib /data/app-lib/org.koreader.launcher-2/lib7z.so 0x421a6218
D/dalvikvm( 1281): No JNI_OnLoad found in /data/app-lib/org.koreader.launcher-2/lib7z.so 0x421a6218, skipping init
I/KOReader( 1281): [EPDFactory]: Using Rockchip RK3026 EPD Controller
I/KOReader( 1281): [LightsFactory]: Using Generic Lights Controller
V/KOReader( 1281): [DeviceHelper] native orientation: portrait
D/AndroidRuntime( 1281): Shutting down VM
W/dalvikvm( 1281): threadid=1: thread exiting with uncaught exception (group=0x41f40930)
E/AndroidRuntime( 1281): FATAL EXCEPTION: main
E/AndroidRuntime( 1281): java.lang.RuntimeException: Unable to start activity ComponentInfo{org.koreader.launcher/org.koreader.launcher.MainActivity}: java.lang.IllegalArgumentException: Unable to load native library: /data/app-lib/org.koreader.launcher-2/libluajit-launcher.so
E/AndroidRuntime( 1281): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
E/AndroidRuntime( 1281): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
E/AndroidRuntime( 1281): 	at android.app.ActivityThread.access$600(ActivityThread.java:141)
E/AndroidRuntime( 1281): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
E/AndroidRuntime( 1281): 	at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 1281): 	at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime( 1281): 	at android.app.ActivityThread.main(ActivityThread.java:5041)
E/AndroidRuntime( 1281): 	at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 1281): 	at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime( 1281): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
E/AndroidRuntime( 1281): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
E/AndroidRuntime( 1281): 	at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime( 1281): Caused by: java.lang.IllegalArgumentException: Unable to load native library: /data/app-lib/org.koreader.launcher-2/libluajit-launcher.so
E/AndroidRuntime( 1281): 	at android.app.NativeActivity.onCreate(NativeActivity.java:193)
E/AndroidRuntime( 1281): 	at org.koreader.launcher.MainActivity.onCreate()
E/AndroidRuntime( 1281): 	at android.app.Activity.performCreate(Activity.java:5104)
E/AndroidRuntime( 1281): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
E/AndroidRuntime( 1281): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
E/AndroidRuntime( 1281): 	... 11 more
W/ActivityManager(  337):   Force finishing activity org.koreader.launcher/.MainActivity
W/ActivityManager(  337):   Force finishing activity com.onyx/.content.browser.activity.HomeActivity
I/ActivityManager(  337): START u0 {act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000000 cmp=com.onyx/.content.browser.activity.StartupActivity} from pid 0
D/dalvikvm(  337): GC_CONCURRENT freed 524K, 28% free 6518K/8940K, paused 21ms+12ms, total 160ms
D/dalvikvm(  535): GC_CONCURRENT freed 877K, 16% free 10322K/12168K, paused 4ms+9ms, total 83ms
D/dalvikvm(  535): WAIT_FOR_CONCURRENT_GC blocked 55ms
W/ActivityManager(  337): Activity pause timeout for ActivityRecord{424fb4a0 u0 org.koreader.launcher/.MainActivity}

@pazos
Copy link
Member

pazos commented Jan 24, 2021

@plague-doctor: thanks! is that Android 4.0/4.1?

@plague-doctor
Copy link
Author

Android 4.2.2 (kernel: 3.0.36+)

@pazos
Copy link
Member

pazos commented Jan 24, 2021

Cool! Now libluajit-launcher.so depends on libluajit.so and that's probably not loaded automatically on some systems.

It shouldn't hurt force-loading on init, using System.loadLibrary, which seems to work fine (at least for lib7z.so. I will build an APK with the change for you to test. Will ping you when uploaded.

@pazos
Copy link
Member

pazos commented Jan 24, 2021

@plague-doctor: https://www.dropbox.com/s/ust0rylaejkuqay/koreader-android-arm-v2020.12-129-ga5768c74_2021-01-24.apk?dl=0

Uninstall APK before installing this one, as signatures are different. Please report if it works or not (I hope it works, if not it will be pain 😭) Anyways, remember to uninstall the APK before installing again from github, for the same reason.

@NiLuJe
Copy link
Member

NiLuJe commented Jan 24, 2021

LuaJIT also requires libm, in case that matters for what you're trying ;).

@NiLuJe
Copy link
Member

NiLuJe commented Jan 24, 2021

@pazos: Would https://github.com/KeepSafe/ReLinker help in this context? (e.g., libluajit is currently a DT_NEEDED in libluajit-launcher, and that's broken only on the most broken of broken Android linkers ^^).

@plague-doctor
Copy link
Author

nope - doesn't work:

D/dalvikvm( 1379): Trying to load lib /data/app-lib/org.koreader.launcher-1/libluajit-launcher.so 0x41bfb2a8
E/dalvikvm( 1379): dlopen("/data/app-lib/org.koreader.launcher-1/libluajit-launcher.so") failed: Cannot load library: soinfo_link_image(linker.cpp:1635): could not load library "libluajit.so" needed by "libluajit-launcher.so"; caused by load_library(linker.cpp:745): library "libluajit.so" not found
D/AndroidRuntime( 1379): Shutting down VM
W/dalvikvm( 1379): threadid=1: thread exiting with uncaught exception (group=0x41996930)
E/AndroidRuntime( 1379): FATAL EXCEPTION: main
E/AndroidRuntime( 1379): java.lang.UnsatisfiedLinkError: Cannot load library: soinfo_link_image(linker.cpp:1635): could not load library "libluajit.so" needed by "libluajit-launcher.so"; caused by load_library(linker.cpp:745): library "libluajit.so" not found
E/AndroidRuntime( 1379): 	at java.lang.Runtime.loadLibrary(Runtime.java:371)
E/AndroidRuntime( 1379): 	at java.lang.System.loadLibrary(System.java:521)
E/AndroidRuntime( 1379): 	at org.koreader.launcher.MainActivity.<init>()
E/AndroidRuntime( 1379): 	at java.lang.Class.newInstanceImpl(Native Method)
E/AndroidRuntime( 1379): 	at java.lang.Class.newInstance(Class.java:1319)
E/AndroidRuntime( 1379): 	at android.app.Instrumentation.newActivity(Instrumentation.java:1054)
E/AndroidRuntime( 1379): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2097)
E/AndroidRuntime( 1379): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
E/AndroidRuntime( 1379): 	at android.app.ActivityThread.access$600(ActivityThread.java:141)
E/AndroidRuntime( 1379): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
E/AndroidRuntime( 1379): 	at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 1379): 	at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime( 1379): 	at android.app.ActivityThread.main(ActivityThread.java:5041)
E/AndroidRuntime( 1379): 	at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 1379): 	at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime( 1379): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
E/AndroidRuntime( 1379): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
E/AndroidRuntime( 1379): 	at dalvik.system.NativeStart.main(Native Method)
W/ActivityManager(  341):   Force finishing activity org.koreader.launcher/.MainActivity
W/ActivityManager(  341):   Force finishing activity com.onyx/.content.browser.activity.HomeActivity
I/ActivityManager(  341): START u0 {act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000000 cmp=com.onyx/.content.browser.activity.StartupActivity} from pid 0
D/dalvikvm(  537): GC_CONCURRENT freed 2811K, 26% free 9852K/13276K, paused 3ms+13ms, total 121ms
D/dalvikvm(  537): GC_FOR_ALLOC freed 2425K, 32% free 9154K/13276K, paused 65ms, total 65ms
W/ActivityManager(  341): Activity pause timeout for ActivityRecord{420cff68 u0 org.koreader.launcher/.MainActivity}
D/dalvikvm(  663): GC_CONCURRENT freed 459K, 17% free 2603K/3120K, paused 2ms+3ms, total 55ms
I/ActivityManager(  341): START u0 {cmp=com.onyx/.content.browser.activity.HomeActivity} from pid 537
W/Resources(  537): Converting to int: TypedValue{t=0x3/d=0xe1 "res/color/primary_text_device_default_light.xml" a=2 r=0x7f0e0077}

@pazos
Copy link
Member

pazos commented Jan 24, 2021

@NiLuJe:

the diff:

diff --git a/app/src/main/java/org/koreader/launcher/MainActivity.kt b/app/src/main/java/org/koreader/launcher/MainActivity.kt
index 768f2ed..0310025 100644
--- a/app/src/main/java/org/koreader/launcher/MainActivity.kt
+++ b/app/src/main/java/org/koreader/launcher/MainActivity.kt
@@ -65,7 +65,9 @@ class MainActivity : NativeActivity(), JNILuaInterface,
         }
     }
 
-
+    init {
+        System.loadLibrary("luajit-launcher")
+    }
 
     companion object {
         private const val TAG_MAIN = "MainActivity"

That happens before starting native code, so when https://android.googlesource.com/platform/frameworks/base.git/+/master/core/java/android/app/NativeActivity.java#170 happens the MainActivity classloader should be able to deal with the entry point dependencies automatically.

@NiLuJe
Copy link
Member

NiLuJe commented Jan 24, 2021

Yeah, that's definitely broken on some early, early Android linkers (either because of the dependency resolving issue, or, in the specific case of embedding an interpreted language or something fancy, because DT_NEEDED entries are not loaded in the global scope).

@pazos
Copy link
Member

pazos commented Jan 24, 2021

Well, the error is different. Probably is a matter of trying

diff --git a/app/src/main/java/org/koreader/launcher/MainActivity.kt b/app/src/main/java/org/koreader/launcher/MainActivity.kt
index 768f2ed..aa56169 100644
--- a/app/src/main/java/org/koreader/launcher/MainActivity.kt
+++ b/app/src/main/java/org/koreader/launcher/MainActivity.kt
@@ -65,7 +65,10 @@ class MainActivity : NativeActivity(), JNILuaInterface,
         }
     }
 
-
+    init {
+        System.loadLibrary("luajit")
+        System.loadLibrary("luajit-launcher")
+    }

Or, yep use ReLinker as NiLuJe said.

But I would try first to load luajit direclty and see if that works. libm is part of the public API? In that case is part of the classloader and shouldn't be a problem to load it.

@NiLuJe
Copy link
Member

NiLuJe commented Jan 24, 2021

Yeah, libm is also in the DT_NEEDED of both luajit-launcher & luajit, so, one would hope it "works", but, who knows ^^.

(At which point you can just add libm to the top of the loadLibrary pyramid manually, because the DT_NEEDED entries for what we care about here is pretty much set in stone).

@pazos
Copy link
Member

pazos commented Jan 24, 2021

Thanks to dropbox binary diffing here's the new test build: https://www.dropbox.com/s/ust0rylaejkuqay/koreader-android-arm-v2020.12-129-ga5768c74_2021-01-24.apk?dl=0

I do hope that, at least, it took 2 seconds to upload :p

@plague-doctor
Copy link
Author

👍 This version works fine :-)

@pazos
Copy link
Member

pazos commented Jan 25, 2021

This version works fine :-)

Great!!!

For the sake of completeness, does this version works too? https://www.dropbox.com/s/ust0rylaejkuqay/koreader-android-arm-v2020.12-129-ga5768c74_2021-01-24.apk?dl=0

diff --git a/app/src/main/java/org/koreader/launcher/MainActivity.kt b/app/src/main/java/org/koreader/launcher/MainActivity.kt
index 768f2ed..e3becb6 100644
--- a/app/src/main/java/org/koreader/launcher/MainActivity.kt
+++ b/app/src/main/java/org/koreader/launcher/MainActivity.kt
@@ -65,7 +65,9 @@ class MainActivity : NativeActivity(), JNILuaInterface,
         }
     }
 
-
+    init {
+        System.loadLibrary("luajit")
+    }
 
     companion object {
         private const val TAG_MAIN = "MainActivity"

Thanks for all your testing!

@pazos
Copy link
Member

pazos commented Jan 26, 2021

@plague-doctor ^^ 🥇

@plague-doctor
Copy link
Author

Sorry for a delay. Yep, this one works fine too. 🎉

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants