~/test-project $ strace opencode ai 2>&1 | tail -n 100
futex(0x73faca7868, FUTEX_WAKE_PRIVATE, 2147483647) = 0
futex(0x73faca7868, FUTEX_WAKE_PRIVATE, 2147483647) = 0 futex(0x73faca7868, FUTEX_WAKE_PRIVATE, 2147483647) = 0
futex(0x73faca7868, FUTEX_WAKE_PRIVATE, 2147483647) = 0
futex(0x73faca7868, FUTEX_WAKE_PRIVATE, 2147483647) = 0
futex(0x73faca7868, FUTEX_WAKE_PRIVATE, 2147483647) = 0
futex(0x73faca7868, FUTEX_WAKE_PRIVATE, 2147483647) = 0 futex(0x73faca7868, FUTEX_WAKE_PRIVATE, 2147483647) = 0
futex(0x73faca7868, FUTEX_WAKE_PRIVATE, 2147483647) = 0 futex(0x73faca7868, FUTEX_WAKE_PRIVATE, 2147483647) = 0
futex(0x73faca7868, FUTEX_WAKE_PRIVATE, 2147483647) = 0 futex(0x73faca7868, FUTEX_WAKE_PRIVATE, 2147483647) = 0
futex(0x73faca7868, FUTEX_WAKE_PRIVATE, 2147483647) = 0 futex(0x73faca7868, FUTEX_WAKE_PRIVATE, 2147483647) = 0
futex(0x73faca7868, FUTEX_WAKE_PRIVATE, 2147483647) = 0 futex(0x73faca7868, FUTEX_WAKE_PRIVATE, 2147483647) = 0
futex(0x73faca7868, FUTEX_WAKE_PRIVATE, 2147483647) = 0 futex(0x73faca7868, FUTEX_WAKE_PRIVATE, 2147483647) = 0
futex(0x73faca7868, FUTEX_WAKE_PRIVATE, 2147483647) = 0 futex(0x73faca7868, FUTEX_WAKE_PRIVATE, 2147483647) = 0
futex(0x73faca7868, FUTEX_WAKE_PRIVATE, 2147483647) = 0 mprotect(0x73fbe02000, 4096, PROT_READ|PROT_WRITE) = 0
mprotect(0x73fbe02000, 4096, PROT_READ) = 0
mprotect(0x73fbe02000, 4096, PROT_READ|PROT_WRITE) = 0 mprotect(0x73fbe02000, 4096, PROT_READ) = 0
mprotect(0x73fbe02000, 4096, PROT_READ|PROT_WRITE) = 0
mprotect(0x73fbe02000, 4096, PROT_READ) = 0
futex(0x73faca43b0, FUTEX_WAKE_PRIVATE, 2147483647) = 0 openat(AT_FDCWD, "/proc/sys/vm/overcommit_memory", O_RDONLY) = -1 EACCES (Permission denied)
prctl(PR_GET_THP_DISABLE, 0x7fe3b48cf8, 0, 0, 0) = -1 EINVAL (Invalid argument)
prctl(PR_SET_THP_DISABLE, 549281107192, 0, 0, 0) = 0
mprotect(0x73f4e6a000, 409600, PROT_READ) = 0
mprotect(0x73fad90000, 409600, PROT_READ) = 0
mprotect(0x73f4dd6000, 409600, PROT_READ) = 0
mprotect(0x73f4d72000, 409600, PROT_READ) = 0
rt_sigaction(SIGPIPE, {sa_handler=0x73f7ebe280, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x73f8115d60}, NULL, 8) = 0
sigaltstack({ss_sp=0x73fabd200a, ss_flags=0, ss_size=524288}, NULL) = 0
rt_sigaction(SIGSEGV, {sa_handler=0x73f8115ef0, sa_mask=[], sa_flags=SA_RESTORER|SA_ONSTACK|SA_RESTART|SA_RESETHAND|SA_SIGINFO, sa_restorer=0x73f8115d60}, NULL, 8) = 0
rt_sigaction(SIGILL, {sa_handler=0x73f8115ef0, sa_mask=[], sa_flags=SA_RESTORER|SA_ONSTACK|SA_RESTART|SA_RESETHAND|SA_SIGINFO, sa_restorer=0x73f8115d60}, NULL, 8) = 0
rt_sigaction(SIGBUS, {sa_handler=0x73f8115ef0, sa_mask=[], sa_flags=SA_RESTORER|SA_ONSTACK|SA_RESTART|SA_RESETHAND|SA_SIGINFO, sa_restorer=0x73f8115d60}, NULL, 8) = 0
rt_sigaction(SIGFPE, {sa_handler=0x73f8115ef0, sa_mask=[], sa_flags=SA_RESTORER|SA_ONSTACK|SA_RESTART|SA_RESETHAND|SA_SIGINFO, sa_restorer=0x73f8115d60}, NULL, 8) = 0
rt_sigaction(SIGPIPE, {sa_handler=SIG_IGN, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x73f8115d60}, NULL, 8) = 0
rt_sigaction(SIGXFSZ, {sa_handler=SIG_IGN, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x73f8115d60}, NULL, 8) = 0
faccessat(AT_FDCWD, "/sys/devices/system/node/node1", R_OK) = -1 ENOENT (No such file or directory)
mmap(0x24be6000000, 1073741824, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = 0x7333e00000
munmap(0x7333e00000, 1073741824) = 0
mmap(NULL, 1107296256, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = 0x7331e00000
munmap(0x7331e00000, 2097152) = 0
munmap(0x7372000000, 31457280) = 0
openat(AT_FDCWD, "/proc/self/fd", O_RDONLY|O_CLOEXEC|O_DIRECTORY) = 3
getdents64(3, 0x73f4202840 /* 6 entries */, 4200) = 144
getdents64(3, 0x73f4202840 /* 0 entries */, 4200) = 0
close(3) = 0
ioctl(0, TCGETS, {c_iflag=ICRNL|IUTF8, c_oflag=NL0|CR0|TAB0|BS0|VT0|FF0|OPOST|ONLCR, c_cflag=B38400|CS8|CREAD, c_lflag=ISIG|ICANON|ECHO|ECHOE|ECHOK|IEXTEN|ECHOCTL|ECHOKE, ...}) = 0
ioctl(0, TCGETS, {c_iflag=ICRNL|IUTF8, c_oflag=NL0|CR0|TAB0|BS0|VT0|FF0|OPOST|ONLCR, c_cflag=B38400|CS8|CREAD, c_lflag=ISIG|ICANON|ECHO|ECHOE|ECHOK|IEXTEN|ECHOCTL|ECHOKE, ...}) = 0
ioctl(1, TCGETS, 0x7fe3b4a1d0) = -1 ENOTTY (Inappropriate ioctl for device)
ioctl(2, TCGETS, 0x7fe3b4a1d0) = -1 ENOTTY (Inappropriate ioctl for device)
rt_sigaction(SIGTERM, {sa_handler=0x73f7ae3774, sa_mask=[], sa_flags=SA_RESETHAND|0xffffffff00000000}, NULL, 8) = 0
rt_sigaction(SIGINT, {sa_handler=0x73f7ae3774, sa_mask=[], sa_flags=SA_RESETHAND|0xffffffff00000000}, NULL, 8) = 0
getrlimit(RLIMIT_STACK, {rlim_cur=8192*1024, rlim_max=RLIM64_INFINITY}) = 0
openat(AT_FDCWD, "/proc/self/stat", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
read(3, "23774 (linker64) R 23763 23763 1"..., 1024) = 317
close(3) = 0
openat(AT_FDCWD, "/proc/self/maps", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
read(3, "7332000000-7372000000 rw-p 00000"..., 1024) = 1024
read(3, "fd:00 4609 "..., 1024) = 1024
read(3, " [anon:linker_allo"..., 1024) = 1024
read(3, " [anon:.bss]\n"..., 1024) = 1024
read(3, "-p 00000000 00:00 0 "..., 1024) = 1024
read(3, "4cf9000-73f4cfa000 rw-p 00035000"..., 1024) = 1024
read(3, "opencode/opencode.bin\n73fabc0000"..., 1024) = 1024
read(3, " 0 \n73fad47000-73fad77000 r--s 0"..., 1024) = 1024
read(3, "0 r--p 00000000 00:00 0 "..., 1024) = 1024
read(3, "anon:.bss]\n7fe3b2a000-7fe3b4c000"..., 1024) = 92
close(3) = 0
gettid() = 23774
getrlimit(RLIMIT_STACK, {rlim_cur=8192*1024, rlim_max=RLIM64_INFINITY}) = 0
gettid() = 23774
openat(AT_FDCWD, "/proc/self/exe", O_RDONLY|O_NOCTTY|O_LARGEFILE|O_CLOEXEC) = 3
lseek(3, -4096, SEEK_END) = 1465328
read(3, "101\0__dl_$x.1\0__dl__ZZL26__andro"..., 4096) = 4096
close(3) = 0
getcwd("/data/data/com.termux/files/home/test-project", 4096) = 46
getrlimit(RLIMIT_NOFILE, {rlim_cur=32*1024, rlim_max=32*1024}) = 0
setrlimit(RLIMIT_NOFILE, {rlim_cur=160*1024, rlim_max=160*1024}) = -1 EPERM (Operation not permitted)
clock_gettime(CLOCK_BOOTTIME, {tv_sec=14215, tv_nsec=242920619}) = 0
clock_gettime(CLOCK_BOOTTIME, {tv_sec=14215, tv_nsec=243688328}) = 0
openat(AT_FDCWD, "/", O_RDONLY|O_CLOEXEC|O_DIRECTORY) = -1 EACCES (Permission denied)
openat(AT_FDCWD, "/data/", O_RDONLY|O_CLOEXEC|O_DIRECTORY) = -1 EACCES (Permission denied)
write(2, "error loading current directory\n", 32error loading current directory
) = 32
write(2, "error: An internal error occurre"..., 64error: An internal error occurred (CouldntReadCurrentDirectory)
) = 64
rt_sigprocmask(SIG_BLOCK, [TTOU RTMIN], [RTMIN], 8) = 0
ioctl(0, TCSETS, {c_iflag=ICRNL|IUTF8, c_oflag=NL0|CR0|TAB0|BS0|VT0|FF0|OPOST|ONLCR, c_cflag=B38400|CS8|CREAD, c_lflag=ISIG|ICANON|ECHO|ECHOE|ECHOK|IEXTEN|ECHOCTL|ECHOKE, ...}) = 0
rt_sigprocmask(SIG_UNBLOCK, [TTOU RT_1 RT_2 RT_3 RT_4 RT_5 RT_6 RT_7], [TTOU RTMIN], 8) = 0
exit_group(1) = ?
+++ exited with 1 +++
~/test-project $
OpenCode reports CouldntReadCurrentDirectory on Termux/Android. getcwd() appears to succeed, but it then attempts to open the / and /data directories, which are inaccessible due to the Android app sandbox (EACCES).
I tried two installation methods (option 1: manual standalone installation and option 3: dpkg), but both produce the same result.
Is this expected behavior on Android/Termux, or is it a bug?
Important strace result
Last 100 line strace result
Details