JakeWharton / mosaic

Build terminal UI in Kotlin using Jetpack Compose
Apache License 2.0
1.89k stars 57 forks source link

Android compatible? #456

Closed WildOrangutan closed 1 month ago

WildOrangutan commented 1 month ago

Hey,

just wondering if this library is compatible with Android.

If I try to run it, I get following error:

FATAL EXCEPTION: main
   Process: com.wildorangutan.terminal, PID: 17472
   java.lang.NoClassDefFoundError: Failed resolution of: Ljava/lang/management/ManagementFactory;
    at com.github.ajalt.mordant.internal.MppInternal_jvmKt.runningInIdeaJavaAgent(MppInternal.jvm.kt:51)
    at com.github.ajalt.mordant.terminal.TerminalDetection.isIntellijRunActionConsole(TerminalDetection.kt:196)
    at com.github.ajalt.mordant.terminal.TerminalDetection.detectTerminal(TerminalDetection.kt:16)
    at com.github.ajalt.mordant.terminal.StdoutTerminalInterface.<init>(StdoutTerminalInterface.kt:17)
    at com.github.ajalt.mordant.terminal.Terminal.<init>(Terminal.kt:52)
    at com.github.ajalt.mordant.terminal.Terminal.<init>(Terminal.kt:41)
    at com.jakewharton.mosaic.MosaicKt$runMosaic$2.invokeSuspend(mosaic.kt:59)
    at com.jakewharton.mosaic.MosaicKt$runMosaic$2.invoke(Unknown Source:8)
    at com.jakewharton.mosaic.MosaicKt$runMosaic$2.invoke(Unknown Source:4)
    at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:61)
    at kotlinx.coroutines.CoroutineScopeKt.coroutineScope(CoroutineScope.kt:261)
    at com.jakewharton.mosaic.MosaicKt.runMosaic(mosaic.kt:58)
    at com.jakewharton.mosaic.BlockingKt$runMosaicBlocking$1.invokeSuspend(blocking.kt:7)
    at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
    at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:104)
    at kotlinx.coroutines.EventLoopImplBase.processNextEvent(EventLoop.common.kt:277)
    at kotlinx.coroutines.BlockingCoroutine.joinBlocking(Builders.kt:95)
    at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking(Builders.kt:69)
    at kotlinx.coroutines.BuildersKt.runBlocking(Unknown Source:1)
    at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking$default(Builders.kt:48)
    at kotlinx.coroutines.BuildersKt.runBlocking$default(Unknown Source:1)
    at com.jakewharton.mosaic.BlockingKt.runMosaicBlocking(blocking.kt:6)
    at com.wildorangutan.terminal.MainActivity.onCreate(MainActivity.kt:26)
    at android.app.Activity.performCreate(Activity.java:7802)
    at android.app.Activity.performCreate(Activity.java:7791)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
    at android.os.Handler.dispatchMessage(Handler.java:107)
    at android.os.Looper.loop(Looper.java:214)
    at android.app.ActivityThread.main(ActivityThread.java:7356)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
   Caused by: java.lang.ClassNotFoundException: Didn't find class "java.lang.management.ManagementFactory" on path: DexPathList[[zip file "/data/app/com.wildorangutan.terminal-h7GSZKxm7dgXCj29ApIpUw==/base.apk"],nativeLibraryDirectories=[/data/app/com.wildorangutan.terminal-h7GSZKxm7dgXCj29ApIpUw==/lib/x86, /system/lib, /system/product/lib]]
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:196)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
    at com.github.ajalt.mordant.internal.MppInternal_jvmKt.runningInIdeaJavaAgent(MppInternal.jvm.kt:51) 
    at com.github.ajalt.mordant.terminal.TerminalDetection.isIntellijRunActionConsole(TerminalDetection.kt:196) 
    at com.github.ajalt.mordant.terminal.TerminalDetection.detectTerminal(TerminalDetection.kt:16) 
    at com.github.ajalt.mordant.terminal.StdoutTerminalInterface.<init>(StdoutTerminalInterface.kt:17) 
    at com.github.ajalt.mordant.terminal.Terminal.<init>(Terminal.kt:52) 
    at com.github.ajalt.mordant.terminal.Terminal.<init>(Terminal.kt:41) 
    at com.jakewharton.mosaic.MosaicKt$runMosaic$2.invokeSuspend(mosaic.kt:59) 
    at com.jakewharton.mosaic.MosaicKt$runMosaic$2.invoke(Unknown Source:8) 
    at com.jakewharton.mosaic.MosaicKt$runMosaic$2.invoke(Unknown Source:4) 
    at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:61) 
    at kotlinx.coroutines.CoroutineScopeKt.coroutineScope(CoroutineScope.kt:261) 
    at com.jakewharton.mosaic.MosaicKt.runMosaic(mosaic.kt:58) 
    at com.jakewharton.mosaic.BlockingKt$runMosaicBlocking$1.invokeSuspend(blocking.kt:7) 
    at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) 
    at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:104) 
    at kotlinx.coroutines.EventLoopImplBase.processNextEvent(EventLoop.common.kt:277) 
    at kotlinx.coroutines.BlockingCoroutine.joinBlocking(Builders.kt:95) 
    at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking(Builders.kt:69) 
    at kotlinx.coroutines.BuildersKt.runBlocking(Unknown Source:1) 
    at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking$default(Builders.kt:48) 
    at kotlinx.coroutines.BuildersKt.runBlocking$default(Unknown Source:1) 
    at com.jakewharton.mosaic.BlockingKt.runMosaicBlocking(blocking.kt:6) 
    at com.wildorangutan.terminal.MainActivity.onCreate(MainActivity.kt:26) 
    at android.app.Activity.performCreate(Activity.java:7802) 
    at android.app.Activity.performCreate(Activity.java:7791) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409) 
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016) 
    at android.os.Handler.dispatchMessage(Handler.java:107) 
    at android.os.Looper.loop(Looper.java:214) 
    at android.app.ActivityThread.main(ActivityThread.java:7356) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) 
JakeWharton commented 1 month ago

No. We currently target the JVM and native for use on a computer. Where would you render the terminal output on Android?

WildOrangutan commented 1 month ago

My idea was to use this library only for rendering UI. I don't actually need anything terminal related, such as output.

JakeWharton commented 1 month ago

The toolkit in this repo only targets terminals for rendering. If you want to build Android you should probably use regular Compose UI.