Struktur aplikasi macOS
(eclecticlight.co)- Aplikasi macOS memiliki komponen yang lebih kompleks daripada program baris perintah, dan mengelola sumber daya antarmuka seperti jendela dan menu dalam struktur terpisah
- Pada Classic Mac OS, kode eksekusi dan sumber daya disimpan di resource fork file, tetapi sejak Mac OS X beralih ke struktur bundle
- Bundle aplikasi berpusat pada direktori Contents, dan terdiri dari subfolder seperti MacOS·Resources·Frameworks serta file inti seperti Info.plist
- Setelah itu, elemen seperti code signing, tanda terima App Store, dan notarization ditambahkan, sehingga strukturnya berkembang untuk memperkuat keamanan dan integritas
- Struktur mandiri (app bundle) ini menjadi fondasi utama yang menyederhanakan instalasi, pembaruan, dan penghapusan, sekaligus meningkatkan keamanan dan efisiensi pemeliharaan
Struktur aplikasi di Classic Mac OS
- Pada Mac OS awal, resource UI seperti jendela dan menu dipisahkan dari file eksekusi dan disimpan di resource fork
- Sebagai contoh, resource milik QuarkXPress 4.11 ditampilkan di ResEdit
- Kode eksekusi disertakan dalam resource CODE, dan informasi type serta creator file juga disimpan agar dapat dikenali oleh Finder
Struktur bundle di Mac OS X
- Mac OS X memperkenalkan struktur bundle yang berasal dari NeXTSTEP
- Aplikasi berbentuk direktori dengan ekstensi
.app, dan di dalamnya terdapat folder Contents - Folder MacOS berisi file eksekusi aplikasi GUI dan alat baris perintah
- Folder Resources menyimpan file resource seperti ikon aplikasi dan komponen GUI
- Sebagian aplikasi menyertakan folder Frameworks untuk menanamkan dylib (dynamic library)
- Aplikasi berbentuk direktori dengan ekstensi
- File Info.plist bersifat wajib, dan mendefinisikan nama file eksekusi, ikon, versi minimum macOS, jenis dokumen, nomor versi, dan lain-lain
- File PkgInfo mempertahankan informasi type/creator dari Classic Mac OS, tetapi tidak wajib
- Saat aplikasi dijalankan, launchd memulai kode eksekusi, sementara LaunchServices dan RunningBoard menjalankan prosedur inisialisasi berdasarkan informasi di Info.plist
Keamanan dan perluasan di macOS
- Sejak Mac OS X 10.5 Leopard (2007), code signing diperkenalkan dan folder
_CodeSignatureditambahkan- File CodeResources memuat hash direktori kode (CDHash) untuk memverifikasi integritas aplikasi
- Aplikasi yang didistribusikan lewat App Store menyertakan tanda terima toko di folder
_MASReceipt - Sejak 2018, notarization diperkenalkan, sehingga ticket yang diterbitkan Apple dapat di-staple ke bundle melalui file CodeResources
- Bundle aplikasi modern menyertakan sendiri komponen yang dahulu diinstal di folder sistem
- Folder Library: LaunchDaemons, LoginItems, dan lain-lain
- Folder XPCServices: layanan eksekusi terpisah yang digunakan aplikasi
- Folder Plugins / Extensions: mencakup fitur ekstensi aplikasi dan App Intents
- Sebagian aplikasi juga memiliki file version.plist
Keunggulan bundle aplikasi
- Dengan mengintegrasikan semua komponen ke dalam bundle, instalasi, pembaruan, dan penghapusan menjadi lebih mudah
- Kemungkinan ada komponen yang hilang berkurang, dan keamanan diperkuat melalui perlindungan tanda tangan dan notarization
- Aplikasi App Store juga menyertakan tanda terima dan ticket notarization untuk memastikan keandalan
- Tidak ada perbedaan struktur antara arsitektur Intel dan Arm; file eksekusi Mach-O disimpan dalam bentuk binary universal (fat) yang memuat kode untuk kedua platform
- Di dalam file yang sama juga terdapat signature untuk masing-masing arsitektur
Gambaran visual struktur aplikasi
- Dalam diagram, kuning pucat menunjukkan komponen yang wajib atau ada di hampir semua aplikasi
- Hijau menunjukkan item yang hanya ada pada aplikasi yang didistribusikan melalui App Store, sedangkan biru berarti ticket notarization opsional
- Selain itu, elemen tambahan seperti workflow Automator dan skrip dapat disertakan
- Secara keseluruhan, aplikasi macOS telah berevolusi menuju struktur mandiri yang berfokus pada keamanan
1 komentar
Komentar Hacker News
Bagian yang ditandai biru adalah notarisation ticket (tiket notarisasi), yang pada praktiknya bukan sesuatu yang opsional
Aplikasi yang tidak dinotarisasi terlalu merepotkan dari sudut pandang pengguna, jadi pada akhirnya harus membayar biaya pendaftaran pengembang Apple sebesar $99 per tahun
Jika hanya build dan menjalankannya untuk penggunaan pribadi, tidak masalah, tetapi untuk distribusi, macOS akan menampilkan peringatan sehingga aplikasi terlihat seperti rusak
Dulu masih bisa dijalankan dengan klik kanan, tetapi sekarang harus masuk sampai ke pengaturan sistem untuk mengizinkannya
Tangkapan layar terkait bisa dilihat di dokumen dukungan Apple dan berita pengembang
Saya suka filosofi keamanan Apple, tetapi saya pikir sistem notarisasi untuk aplikasi di luar App Store merugikan semua pihak
Saya tidak bisa menemukan contoh nyata di mana notarisasi benar-benar mencegah masalah keamanan
Saya pikir notarisasi macOS itu merepotkan, tetapi setelah mencoba distribusi Windows, ternyata itu lebih parah
Untuk mendapatkan kepercayaan Windows Defender, Anda harus membeli sertifikat, dan baik perusahaan maupun individu harus melalui verifikasi identitas yang mendalam
Penandatanganan harus dilakukan dengan token perangkat keras, jadi hanya satu orang yang bisa mendistribusikan rilis
Selain itu, otoritas sertifikat bisa mengunci kunci secara sewenang-wenang, jadi akan sangat buruk jika itu terjadi saat Anda perlu merilis patch keamanan
Dalam hal ini, ekosistem macOS terasa jauh lebih baik
Saya sedang mengembangkan bahasa pemrograman yang dikompilasi ke beberapa platform, dan penandatanganan serta notarisasi sama sekali tidak cocok dengan proses ini
Sistem penandatanganan seperti ini hanyalah alat kontrol, dan berisiko disalahgunakan seperti pada kasus Epic
Jika biner yang tidak ditandatangani tidak bisa dijalankan secara wajar, saya menganggap platform itu tertutup dan tidak mendukungnya
Platform tertutup seperti iOS atau Android sampai batas tertentu bisa digantikan dengan PWA
Hanya saja, kepercayaan saya bahwa Google akan terus mengizinkan aplikasi bertanda tangan sendiri sudah melemah
Saya hanya tahu dua kasus di mana Apple mencabut sertifikat aplikasi di luar App Store
Salah satunya adalah Research App milik Facebook, dan yang lainnya Screenwise Meter milik Google
Keduanya adalah aplikasi yang pada dasarnya bersifat spyware yang menargetkan remaja, dan pencabutan sertifikat itu sampai melumpuhkan alat internal
Setelah itu, Screenwise Meter tampaknya kembali masuk ke App Store
Artikel terkait: Wired, EFF
Sekitar setengah isi folder aplikasi saya tidak dinotarisasi, dan pada praktiknya tidak ada masalah berarti
Setelah notarisasi, stapled ticket (tiket terlampir) bersifat opsional
Jika tiket tidak dilampirkan, pengguna harus memeriksa status notarisasi melalui koneksi internet
Saat mengembangkan AppBundler.jl, saya punya banyak keluhan soal struktur aplikasi macOS
Pemaksaan struktur folder Frameworks memang terlihat rapi, tetapi pada praktiknya membundel jadi merepotkan sehingga saya menyiasatinya dengan folder Libraries
Masalah terbesar adalah penandatanganan kode — rasanya boros harus menempelkan tanda tangan ke semua biner
Sulit dipahami mengapa ini dibuat begitu rumit, padahal cukup mengumpulkan hash file lalu menandatanganinya sekali saja
Selain itu, entitlements yang hanya ditempelkan pada biner launcher juga tidak efisien
Karena standar notarisasi makin diperketat seiring waktu, aplikasi bisa saja tiba-tiba tidak lolos di kemudian hari
Saya mendaftar ke Apple Developer Program untuk menandatangani dan menotarisasi aplikasi Tauri, tetapi sudah gagal selama 3 minggu
Karena tidak punya Mac, saya mencoba lewat GitHub Actions, tetapi katanya notarisasi pertama memang sering memakan waktu lama
Saya sudah menghabiskan hampir $100 biaya GitHub, tetapi notarisasinya masih juga belum selesai
Tim dukungan Apple menolak membantu karena saya tidak punya Mac dan menggunakan Tauri
Proses autentikasi API notarisasi juga seperti mimpi buruk — saya harus membuat JWT dengan PKCS8, tetapi dokumentasinya nyaris tidak ada, jadi saya terpaksa menulis program Node sendiri
Ini adalah pengalaman pengembang (DX) terburuk yang pernah saya alami
Mencoba menyelesaikan ini tanpa perangkat keras Apple disebut sebagai buang-buang waktu
Saat melihat tangkapan layar OS pertama, hati saya langsung ciut
Dulu itu UI yang praktis dan rapi, tetapi sekarang ruang hanya terbuang untuk sudut membulat dan ikon seperti gelembung
Meski begitu, kualitas perangkat keras Mac bagus, jadi saya tetap tidak bisa pindah ke ThinkPad
Sudut membulat justru adalah fitur yang lebih baik untuk penglihatan manusia
Ada penelitian yang menyebut sudut tajam menyebabkan kelelahan visual
Tulisan terkait: Round Rects Are Everywhere
Saya juga tidak terlalu suka macOS terbaru, tetapi tangkapan layar itu juga tidak sempurna
Terlalu banyak garis dan kurang warna, sehingga perhatian mata terpecah
Secara pribadi, saya merasa Aqua UI era Leopard punya keseimbangan yang bagus antara kepadatan informasi dan kedalaman visual
Jika dilihat dari rasio piksel, UI lama justru memakan lebih banyak ruang
Berdasarkan resolusi 5K, MacBook Pro modern lebih efisien
Mac klasik juga sebenarnya sudah punya sedikit sudut membulat
Referensi: Infinite Mac
Komputer bukan hanya alat kerja, tetapi juga alat untuk kesenangan
Hanya saja, UI masa kini terasa sudah terlalu jauh dari kepraktisan
Sebagian besar layar dipenuhi informasi tak berguna seperti 101101, jadi sulit menyebutnya praktis
Pernyataan bahwa launchd adalah pihak yang menjalankan alat baris perintah di macOS itu keliru
Pada kenyataannya, seperti sistem UNIX lain, proses dijalankan dari shell dengan fork/spawn
Sistem bundle NeXTSTEP menjadi inspirasi bagi desain file JAR Java
Pada Mac OS klasik, aplikasi Power Mac menyimpan kode PPC di data fork
Hal yang sama berlaku untuk biner CFM-68K, dan resource CODE hanya dipakai oleh kode 68K yang lebih lama
Saya punya kenangan menyenangkan saat dulu memodifikasi aplikasi dengan ResEdit
Ledakan birokrasi seperti pada diagram terakhir bukan pertanda baik
Itu semakin mengurangi alasan untuk “upgrade” ke macOS 26
Struktur saat ini memang “standar” macOS, tetapi bukan satu-satunya cara
Jika RPATH diatur dengan baik, library bisa ditempatkan di subfolder arbitrer dan tetap lolos notarisasi
Misalnya, jalur AppName.App/Contents/Libraries juga berfungsi
Namun, manfaat praktis dari cara ini hampir tidak ada, dan dari sekitar 100 aplikasi di sistem saya, tidak ada satu pun yang memakai folder /Libraries
Alih-alih .dylib, harus memakai format .framework, dan ini adalah aturan yang tidak terdokumentasi
Saat pengajuan, ini bisa terdeteksi otomatis dan menyebabkan penolakan