
Kisah ini adalah tentang pendekatan non-standar untuk pengembangan aplikasi Android. Satu hal untuk menginstal Android Studio dan menulis "Halo, Dunia" di Jawa atau Kotlin. Tetapi saya akan menunjukkan bagaimana tugas yang sama dapat dilakukan secara berbeda.
Kami mengingatkan Anda: untuk semua pembaca "Habr" - diskon 10.000 rubel saat mendaftar untuk kursus Skillbox apa pun menggunakan kode promo "Habr".
Skillbox merekomendasikan: Kursus pendidikan online "Pengembang Java Profesi" .
Bagaimana cara kerja ponsel cerdas saya dengan OS Android?
Pertama, sedikit latar belakang. Suatu malam seorang teman bernama Ariella memanggil saya. Dia bertanya kepada saya: "Dengar, bagaimana cara kerja smartphone saya? Apa yang ada di dalamnya? Bagaimana energi listrik dan satuan dan nol biasa membuat semuanya berfungsi? "
Teman saya bukan pemula dalam pengembangan, dia menciptakan beberapa proyek di Arduino, yang terdiri dari perangkat lunak dan perangkat keras. Mungkin itu sebabnya dia ingin tahu lebih banyak. Saya berhasil menjawab dengan bantuan pengetahuan yang diperoleh di salah satu kursus ilmu komputer yang diambil di universitas.
Kemudian kami bekerja bersama selama beberapa minggu, karena Ariella ingin mengetahui bagaimana batu bata teknologi elektronik bekerja, yaitu elemen semikonduktor, termasuk transistor. Selanjutnya, kami pergi ke tingkat yang lebih tinggi: Saya menunjukkan kepadanya cara membuat gerbang logika, misalnya, NAND (logis DAN) ditambah NOR (logis OR) menggunakan kombinasi transistor tertentu.
Kami menyelidiki unsur-unsur logis dari berbagai jenis, menggabungkannya untuk melakukan perhitungan (misalnya, menambahkan dua angka biner) dan sel memori (pemicu). Ketika semuanya menjadi jelas, mereka mulai mengembangkan prosesor sederhana (imajiner), di mana ada dua register tujuan umum dan dua instruksi sederhana (menambahkan register ini). Kami bahkan menulis sebuah program sederhana yang mengalikan dua angka ini.
Omong-omong, jika Anda tertarik pada topik ini, maka baca instruksi untuk membuat komputer 8-bit dari awal. Ini menjelaskan hampir semuanya, dari dasar-dasarnya. Saya berharap saya membacanya lebih awal!
Halo Android!
Setelah menyelesaikan semua tahapan penelitian, saya merasa bahwa Ariella memiliki pengetahuan yang cukup untuk memahami cara kerja prosesor smartphone. Ponsel cerdasnya adalah Galaxy S6 Edge, yang basisnya adalah arsitektur ARM (seperti, pada sebagian besar ponsel cerdas). Kami memutuskan untuk menulis aplikasi "Hello, World" untuk Android, tetapi dalam bahasa assembly.
.text .globl _start _start: mov %r0, $1 // file descriptor number 1 (stdout) ldr %r1, =message mov %r2, $message_len mov %r7, $4 // syscall 4 (write) swi $0 mov %r0, $0 // exit status 0 (ok) mov %r7, $1 // syscall 1 (exit) swi $0 .data message: .ascii "Hello, World\n" message_len = . - message
Jika Anda belum pernah menemukan kode assembler sebelumnya, blok ini mungkin membuat Anda takut. Tapi tidak apa-apa, mari kita parsing kode bersama.
Jadi, program kami terdiri dari dua bagian. Yang pertama adalah teks dengan instruksi kode mesin, dan yang kedua adalah variabel, baris, dan informasi lainnya (dimulai dengan baris 15). Bagian .text biasanya hanya-baca, dan .data juga dapat ditulis.
Pada baris 2, kita mendefinisikan fungsi global yang disebut _start. Ini adalah titik masuk ke aplikasi. OS mulai menjalankan kode dari titik ini. Definisi fungsi dinyatakan pada baris 4.
Selain itu, fungsinya melakukan dua hal lagi. Di baris 5β9, pesan ditampilkan di layar, di baris 11β13, program berakhir. Bahkan jika Anda menghapus baris 11β13, program akan mengeluarkan baris βHello, Worldβ dan keluar. Namun, hasilnya tidak akan benar, karena program akan berakhir dengan kesalahan. Tanpa baris 11-13, aplikasi akan mencoba menjalankan instruksi yang tidak valid.
Pencetakan ditampilkan menggunakan fungsi sistem "Panggilan sistem" dari sistem operasi. Dalam aplikasi, kita memanggil fungsi write (). Kami menunjukkannya ketika kami memuat nilai 4 ke dalam register prosesor dengan nama r7 (baris 8). Selanjutnya, swi $ = 0 instruksi (baris 9) dieksekusi, di mana ada transisi langsung ke kernel Linux, yang merupakan dasar dari Android.
Adapun parameter untuk panggilan sistem, mereka dikirim melalui register lain. Sebagai contoh, r0 menunjukkan jumlah deskriptor file yang perlu kita cetak. Kami menempatkan nilai 1 di sana (baris 5), menunjukkan output standar (stdout), yaitu, output ke layar.
r1 menunjukkan alamat memori dari data yang ingin kita tulis, jadi kita hanya memuat alamat string "Hello, World" (baris 6) ke dalam area ini, dan register r2 menunjukkan berapa banyak byte yang ingin kita tulis. Dalam program kami, diset ke message_len (baris 7), dihitung pada baris 18 menggunakan sintaks khusus: simbol titik menunjukkan alamat memori saat ini. Karena alasan ini. - pesan menunjukkan alamat memori saat ini dikurangi alamat pesan. Yah, karena kita mendeklarasikan message_len segera setelah pesan, semua ini dihitung sebagai panjang pesan.
Jika Anda menulis kode untuk baris 5β9 menggunakan C, Anda mendapatkan yang berikut:
#define message "Hello, World\n" write(1, message, strlen(message));
Mematikan program sedikit lebih mudah. Untuk melakukan ini, kita cukup mendaftarkan kode keluar di register r0 (baris 11), setelah itu kita menambahkan nilai 1, yang merupakan nomor dari panggilan fungsi sistem keluar (), ke r7 (baris 12), lalu panggil kernel lagi (baris 13).
Daftar lengkap panggilan sistem Android dan nomornya dapat ditemukan dalam
kode sumber
sistem operasi . Ada juga implementasi dari
write () dan
exit () yang memanggil fungsi sistem yang sesuai.
Menyatukan program
Untuk mengkompilasi proyek kami, Anda memerlukan Android NDK (Native Development Kit). Ini berisi sekumpulan kompiler dan alat bantu bangun untuk platform ARM. Anda dapat mengunduhnya dari situs resmi, menginstalnya, misalnya, melalui Android Studio.

Setelah NDK diinstal, kita perlu file arm-linux-androideabi-as, ini assembler untuk ARM. Jika Anda mengunduh melalui Android Studio, maka cari di folder Android SDK. Biasanya lokasinya
ndk-bundle \ toolchains \ arm-linux-androideabi-4.9 \ prebuilt \ windows-x86_64 \ bin.Setelah assembler ditemukan, simpan apa yang tertulis dalam file bernama hello.s, dan kemudian jalankan perintah berikut untuk mengubahnya menjadi kode mesin:
arm-linux-androideabi-as -o hello.o hello.sOperasi ini membuat file objek ELF yang disebut hello.o. Untuk mengonversinya menjadi file biner yang dapat berfungsi pada perangkat Anda, hubungi tautan:
arm-linux-androideabi-ld -o hello hello.oSekarang kami memiliki file halo yang berisi program yang siap digunakan.
Luncurkan aplikasi di perangkat Anda
Aplikasi Android biasanya didistribusikan dalam format .apk. Ini adalah jenis khusus dari file terkompresi yang mencakup kelas Java (ya, Anda dapat menulis dengan C / C ++, tetapi Java harus menjadi titik masuk).
Untuk menghindari masalah saat memulai aplikasi, adb digunakan dalam contoh, yang memungkinkan kami untuk menyalinnya ke folder sementara perangkat Android kami. Setelah itu, kami meluncurkan adb shell untuk meluncurkan aplikasi dan mengevaluasi hasilnya:
adb push hello / data / local / tmp / hello
adb shell chmod + x / data / lokal / tmp / haloDan akhirnya, jalankan aplikasi:
adb shell / data / local / tmp / helloApa yang kamu tulis
Sekarang Anda memiliki lingkungan kerja yang mirip dengan yang dimiliki Ariella. Dia menghabiskan beberapa hari mempelajari assembler ARM, kemudian datang dengan proyek sederhana - ini adalah game Sven Boom (variasi Fizz Buzz yang berasal dari Israel). Pemain menghitung secara bergantian dan setiap kali angka dibagi 7 atau berisi angka 7, mereka harus mengatakan "booming" (karena itulah nama permainan).
Perlu dicatat bahwa program game bukanlah tugas yang mudah. Ariella menulis seluruh metode yang menampilkan angka, satu digit pada satu waktu. Karena dia menulis semuanya dalam assembler tanpa memanggil fungsi standar perpustakaan C, butuh beberapa hari untuk menyelesaikannya.
Program Ariella pertama untuk Adnroid tersedia di
sini . By the way, beberapa pengidentifikasi kode dalam aplikasi sebenarnya kata-kata Ibrani (misalnya, _sifra_ahrona).
Menulis aplikasi Android dalam assembler adalah cara yang baik untuk mengenal arsitektur ARM dengan lebih baik, dan juga untuk lebih memahami dapur bagian dalam gadget yang Anda gunakan setiap hari. Saya sarankan Anda melakukan ini dengan cermat dan mencoba membuat aplikasi assembler kecil untuk perangkat Anda. Ini bisa berupa permainan sederhana atau yang lainnya.
Skillbox merekomendasikan: