Mengapa saya tidak bisa menjalankan executable Android x86 di Linux

5

Saya mencoba untuk port aplikasi Android ke Linux (jangan tertawa :) dan saya telah menemukan masalah. Ketika mencoba mengeksekusi executable Android ( app_process) setelah menambahkan izin yang dapat dieksekusi ./app_processdengannya dikatakan tidak ada meskipun cat ./app_processberfungsi.

Juga di manajer file saya (File Pantheon) yang dapat dieksekusi menunjukkan ikon perpustakaan bersama.

Apakah ada cara untuk menjalankan ini di Linux.

Suici Doga
sumber
apa yang file app_processkembali?
Centimane
Dikatakan./app_process: symbolic link to 'app_process32'
Suici Doga
Juga file ./app_process32dikatakan./app_process32: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), stripped
Suici Doga
Jika itu adalah objek yang dibagikan, harus dimungkinkan untuk menjalankannya. Coba strace -f -e trace=open,read,stat ./app_process32dan kirim hasilnya (mungkin lama)
Centimane
@Dapat Dikatakan strace: exec: No such file or directory +++ exited with 1 +++ . File itu memang ada dan catberfungsi
Suici Doga

Jawaban:

10

Android dan Linux adalah dua sistem operasi yang berbeda . Anda tidak bisa hanya mengambil executable dari satu dan menjalankannya di sisi lain.

Rintangan pertama adalah kernel. Android dan Linux didasarkan pada kernel yang sama, tetapi mereka memiliki beberapa fitur berbeda. Secara khusus, Android menyediakan binder , yang hanya ada di kernel mainstream (yang ditemukan di distribusi Linux) sejak versi 3.19. Aplikasi kode asli murni mungkin tidak menggunakan binder tetapi sebagian besar aplikasi Java melakukannya.

Rintangan kedua adalah perpustakaan dinamis. Jika Anda memiliki executable yang terhubung secara dinamis, itu memanggil dynamic linker. Android dan Linux memiliki tautan dinamis yang berbeda, dan jika tautan dinamis tidak ada, Anda mendapatkan kesalahan yang sama seperti jika executable itu sendiri tidak ada .

Jika Anda menyalin tautan dinamis, dan file konfigurasi yang dibutuhkan, dan pustaka asli, maka Anda harus dapat menjalankan sebagian besar program asli. Anda harus menyalin sebagian besar /system, dan salinannya harus berada di /system.

Jika Anda ingin menjalankan aplikasi Java, ini lebih rumit. Anda memerlukan lingkungan runtime Java (Dalvik / ART), dan sebagian besar aplikasi memerlukan beberapa daemon Android juga (beberapa aplikasi kode asli juga memerlukan setan itu).

Hasilnya adalah bahwa sementara kedua sistem dapat hidup bersama pada satu kernel, ini perlu kernel yang cukup baru, atau kernel Android (kernel Android dapat menjalankan sebagian besar aplikasi Linux), dan kedua sistem operasi perlu diinstal - Anda tidak dapat menginstal jalankan saja satu aplikasi dari yang lain.

Saya tidak mengetahui adanya penginstal siap pakai untuk Android di atas Linux. Ada beberapa installer untuk sebaliknya, khususnya Linux pada Android .

Jika tujuannya adalah menjalankan aplikasi Android pada sistem Linux, maka cara termudah sejauh ini adalah menjalankannya di dalam emulator yang merupakan bagian dari alat pengembangan Android .

Gilles
sumber
Saya menyalin semuanya /systemdari Android x86 ISO
Suici Doga
Saya memiliki kernel3.19.0-59-generic
Suici Doga
Berlari /lib/ld-linux.so.2 ./app_process32memberi saya kesalahan segmentasi
Suici Doga
@SuiciDoga /lib/ld-linux.so/2adalah penghubung dinamis Linux. Anda perlu menggunakan tautan dinamis Android. Pada ARM itu /system/bin/linker, saya tidak tahu apakah x86 menggunakan nama yang sama.
Gilles
Bagaimana cara mengeksekusi yang dapat dieksekusi dengan linker Android. Android x86 memiliki file ini tetapi memiliki ikon perpustakaan yang sama
Suici Doga