GNU/Linux >> Belajar Linux >  >> Ubuntu

Membangun Aplikasi Linux Cross-Distribution dengan Flatpak

Fragmentasi telah menjadi masalah selama beberapa waktu di ekosistem Linux. Berbagai distribusi ada saat ini, dengan manajer paket mereka sendiri dan gagasan mereka sendiri tentang apa yang terdiri dari "sistem dasar". Ini membosankan bagi developer aplikasi — setelah membuat paket khusus distribusi dan memelihara repositori, mereka harus memperbaiki bug khusus distribusi yang mungkin muncul. Selain itu, tidak seperti platform seluler seperti iOS dan Android, aplikasi Linux berjalan tanpa kotak pasir dengan akses ke semua fungsi pada sistem dasar.

Untuk mengatasi masalah ini, berbagai solusi telah diusulkan. Dalam artikel ini, kita akan melihat Flatpak — cara untuk mendistribusikan aplikasi dan menjalankannya di sandbox terbatas.

Apa itu Flatpak?

Flatpak adalah teknologi untuk membangun, mendistribusikan, menginstal dan menjalankan aplikasi, terutama ditujukan untuk desktop Linux. Ini memungkinkan aplikasi untuk menggabungkan dependensi dan mengirimkan dengan runtime, sehingga aplikasi tidak berakhir tergantung pada kebiasaan distribusi tertentu. Selain itu, ini meningkatkan keamanan aplikasi Linux dengan mengisolasinya ke dalam kotak pasir.

Arsitektur aplikasi Flatpak adalah seperti yang ditunjukkan pada diagram di bawah ini:

Setiap aplikasi Flatpak didukung oleh "runtime", yang berisi dependensi dasar yang digunakan oleh aplikasi. Runtime ini dibagikan di antara aplikasi. Beberapa runtime, dan bahkan versi berbeda dari runtime yang sama dapat hidup berdampingan pada sistem pada waktu yang sama. Dengan cara ini, aplikasi memiliki sistem dasar yang cukup konsisten untuk diandalkan.

Untuk membangun aplikasi untuk runtime ini, runtime khusus yang disebut SDK (Software Development Kits) disediakan. Mereka berisi alat seperti kompiler dan header pengembangan. Jika aplikasi Anda bergantung pada pustaka yang tidak dibundel dalam waktu proses, Anda harus mengompilasinya dengan SDK, bersama dengan aplikasi Anda.

Selain itu, ada "ekstensi", yang merupakan add-on opsional untuk runtime dan aplikasi. Mereka paling sering digunakan untuk memisahkan terjemahan dan informasi debug dari runtime atau aplikasi asli.

Salah satu tujuan Flatpak adalah untuk meningkatkan keamanan aplikasi dengan mengisolasinya satu sama lain. Secara default, Flatpak menyediakan akses yang sangat terbatas ke sumber daya sistem host. Kecuali jika diminta secara eksplisit, aplikasi tidak diizinkan untuk menggunakan jaringan, mengakses file pada sistem dasar, atau berbicara dengan layanan seperti X, DBus, atau Pulseaudio. Selain itu, "portal" memungkinkan akses selektif ke sumber daya melalui API tingkat tinggi.

Instalasi, perintah Flatpak, dan konvensi penamaan

Flatpak tersedia di repositori sebagian besar distribusi. Di Arch Linux dan Fedora, Anda harus menginstal flatpak paket untuk menginstal flatpak perintah, yang membantu Anda menginstal dan membangun aplikasi.

sudo dnf install flatpak # Fedora
sudo pacman -S flatpak # Arch

Pengguna Ubuntu tidak memilikinya di repositori default, jadi menginstalnya sedikit lebih rumit. Pertama, Anda harus menambahkan PPA ini ke sistem Anda:

sudo add-apt-repository ppa:alexlarsson/flatpak

Kemudian, Anda dapat menginstal paket dengan:

sudo apt update
sudo apt install flatpak

Sedangkan flatpak perintah pasti dapat membantu Anda membangun aplikasi, itu bukan cara yang paling nyaman. Ada alat lain, bernama flatpak-builder , yang memungkinkan Anda membuat aplikasi Flatpak dari file JSON. (Kami akan membahas alat ini nanti di artikel ini.)  Anda dapat memasang alat ini dengan:

sudo dnf install flatpak-builder # Fedora
sudo pacman -S flatpak-builder # Arch
sudo apt install flatpak-builder # Ubuntu

Sekarang, untuk menginstal aplikasi atau runtime, Anda harus menambahkan repositori ke daftar remote Flatpak. Remote ini dapat di-host di direktori lokal, atau online. Waktu proses/aplikasi diidentifikasi menggunakan alamat DNS terbalik, seperti com.booleanworld.foo . Dalam beberapa keadaan, Anda mungkin juga perlu menentukan arsitektur dan "cabang" runtime. Ini dilakukan dengan bantuan triplet yang dipisahkan garis miring, seperti com.booleanworld.foo/x86_64/1.3 .



flatpak perintah biasanya menambahkan perangkat lunak dan repositori untuk semua pengguna. Namun, ini tidak cocok untuk mencoba berbagai hal, jadi kami akan menggunakan --user tandai untuk membatasi perubahan tersebut hanya untuk pengguna saat ini.

Sekarang setelah kita memiliki dasar-dasarnya, kita akan melihat beberapa teori dalam membangun aplikasi Flatpak.

Struktur aplikasi Flatpak

Saat Anda menggabungkan aplikasi dengan Flatpak, struktur direktori berikut akan dibuat secara otomatis:

  • metadata :File ini berisi informasi tentang SDK dan waktu proses aplikasi akan berjalan, serta daftar sumber daya sistem dasar yang perlu diakses aplikasi.
  • files :Direktori ini berisi file yang membentuk aplikasi, termasuk data aplikasi apa pun. bin subdirektori di sini berisi executable aplikasi.
  • export :Direktori ini berisi file apa pun yang perlu diakses oleh sistem dasar. Contohnya termasuk data AppStream, .desktop file dan ikon aplikasi. File apa pun yang Anda taruh di sini harus diawali dengan pengenal. Misalnya, file desktop mungkin memiliki nama com.booleanworld.foo.desktop .

Meskipun Anda dapat membangun struktur ini dengan tangan, ini tidak perlu. Flatpak memiliki alat untuk membantu Anda membuat struktur ini secara otomatis, dan memerlukan konfigurasi yang sangat sedikit jika Anda memiliki proyek berbasis alat otomatis. Dengan proyek berbasis non-autotools, Anda biasanya perlu mengatur direktori "awalan" ke /app untuk menyiapkan dan menjalankannya.

Prasyarat

Bagian artikel berikut memiliki beberapa contoh pembuatan aplikasi Flatpak. Seperti yang telah kami sebutkan sebelumnya, aplikasi memerlukan runtime untuk dijalankan dan SDK untuk proses build. Jadi, langkah pertama adalah menambahkan repositori dari mana mereka tersedia. Kami akan menambahkan repositori yang tersedia di sdk.gnome.org untuk kami gunakan.

flatpak remote-add --from gnome https://sdk.gnome.org/gnome.flatpakrepo --user

Untuk membuat contoh di bawah, kita memerlukan dua runtime: org.freedesktop.Platform dan org.gnome.Platform , dan dua SDK: org.freedesktop.Sdk dan org.gnome.Sdk . Di sini, kami telah menggunakan versi 1.6 dan 3.24 dari Freedesktop dan Gnome runtime/SDK.

flatpak install --user gnome org.freedesktop.Platform/x86_64/1.6
                             org.freedesktop.Sdk/x86_64/1.6
                             org.gnome.Plaform/x86_64/3.24
                             org.gnome.Sdk/x86_64/3.24

Selanjutnya, periksa repositori flatpak-resources, yang berisi semua sumber daya yang diperlukan untuk mengikuti artikel ini.

git clone https://github.com/boolean-world/flatpak-resources
cd flatpak-resources

Kita akan melihat dua contoh membangun aplikasi di bagian berikut.

Membangun “anak kucing”, “kucing” yang ringan

Di bagian ini, kita akan belajar bagaimana membangun aplikasi Flatpak dasar. Aplikasi ini adalah versi kecil dari cat perintah, bernama kitten .

Pertama, Anda harus membuat struktur direktori yang telah kita bahas sebelumnya. build-init perintah dapat melakukan ini untuk Anda. Anda perlu memberikan direktori build, nama aplikasi Anda, dan SDK serta runtime untuk digunakan (dalam urutan itu). Anda juga dapat menambahkan "nama cabang" opsional, tetapi kami akan mengabaikannya dalam contoh ini.

flatpak build-init kitten-build com.booleanworld.kitten
                                org.freedesktop.Sdk
                                org.freedesktop.Platform

Seperti yang kami sebutkan sebelumnya, direktori awalan aplikasi Flatpak adalah /app , dan Anda perlu membuat bin direktori di dalamnya. Saat Anda ingin menjalankan perintah di dalam direktori build, gunakan build perintah:

flatpak build kitten-build mkdir -p /app/bin

Langkah selanjutnya adalah mengkompilasi kitten.c dengan gcc :

flatpak build kitten-build gcc kitten.c -o /app/bin/kitten

Kemudian, Anda dapat menyelesaikan build dengan build-finish . Perintahnya adalah kitten , dan perlu mengakses sistem file host (sehingga Anda dapat melihat file apa pun di sistem host). Jadi, Anda dapat menyelesaikan pembangunan dengan set parameter tersebut:

flatpak build-finish kitten-build --filesystem=host --command=kitten

Sekarang, jika Anda ingin menguji aplikasi, Anda harus menginstalnya. Langkah pertama adalah mengekspor aplikasi ke repositori lokal. Dalam contoh kita, folder repositori adalah my-repo :

flatpak build-export my-repo kitten-build

Selanjutnya kita akan menambahkan repositori dengan nama test-repo . Karena kami tidak menggunakan tanda tangan GPG, kami akan memberi tahu Flatpak dengan --no-gpg-verify beralih.



flatpak remote-add --user --no-gpg-verify test-repo my-repo

Terakhir, Anda dapat menginstalnya dengan:

flatpak install --user test-repo com.booleanworld.kitten

Sekarang, Anda dapat menguji apakah itu berfungsi dengan menjalankannya seperti ini:

flatpak run com.booleanworld.kitten ~/.bashrc

Jika Anda telah mengikuti semua langkah dengan benar sejauh ini, ini akan menampilkan konten .bashrc . Anda berkas:

Selamat atas pembuatan aplikasi Flatpak pertama Anda!

Langkah-langkahnya sejauh ini cukup sederhana, tetapi build-finish perintah memerlukan diskusi lebih lanjut. Inilah yang akan kita lakukan di bagian selanjutnya.

Tinjauan lebih dalam tentang perintah “build-finish”

Salah satu tujuan utama Flatpak adalah untuk aplikasi kotak pasir dan hanya menyediakan akses minimal ke sumber daya sistem host. Pada contoh sebelumnya, kami mengizinkan aplikasi “kitten” untuk mengakses file apa pun di sistem dengan build-finish . Sakelar yang dapat Anda gunakan untuk mengizinkan akses ke berbagai sumber tercantum di bawah ini:

  • --filesystem={path}

Switch ini memungkinkan akses ke jalur tertentu pada sistem. Anda dapat memberikan jalur tertentu (seperti /usr/share ). home memungkinkan akses ke direktori home pengguna, dan host memungkinkan akses ke semua file pada sistem. Selain itu, Anda juga dapat membuat jalur hanya-baca dengan :ro . Misalnya, --filesystem=/usr/share:ro --filesystem=home memungkinkan akses hanya-baca ke /usr/share dan akses baca-tulis ke direktori home pengguna.

  • --share={type}

Switch ini memungkinkan akses ke sumber daya tertentu. Jenis yang paling umum digunakan adalah ipc dan network , yang memungkinkan IPC dan akses jaringan. Di sebagian besar aplikasi GUI, --share=ipc digunakan agar memori bersama X berfungsi, yang meningkatkan kinerja.

  • --socket={type}

Switch ini memungkinkan Anda menggunakan soket tertentu. Jenis soket yang paling sering diakses adalah x11 , wayland dan pulseaudio . Dua yang pertama digunakan oleh aplikasi untuk merender elemen GUI, dan yang terakhir digunakan untuk memutar audio melalui daemon Pulseaudio.

  • --device={device}

Ini memungkinkan aplikasi mengakses beberapa perangkat secara selektif. Paling sering, dri digunakan di sini agar aplikasi dapat menggunakan rendering OpenGL.

  • --talk-name={name} dan --system-talk-name={name}

Switch ini memungkinkan aplikasi untuk berbicara dengan layanan bernama melalui bus sesi dan bus sistem DBus.

  • --env={varname}={value}

env switch memungkinkan Anda untuk mengekspor variabel lingkungan. {varname} adalah nama variabel, yang disetel ke {value} given yang diberikan .

Jika aplikasi memerlukan akses ke dconf, Anda harus menggunakan sakelar berikut:

--filesystem=xdg-run/dconf
--filesystem=~/.config/dconf:ro
--talk-name=ca.desrt.dconf
--env=DCONF_USER_CONFIG_DIR=.config/dconf

Kita akan melihat contoh praktis yang melibatkan sakelar ini di bagian selanjutnya.

Membangun aplikasi secara otomatis:flatpak-builder

Meskipun langkah-langkah yang terlibat dalam membangun aplikasi Flatpak cukup sederhana, masih membosankan untuk membangunnya selangkah demi selangkah. flatpak-builder adalah alat yang memungkinkan Anda membangun aplikasi secara deklaratif dengan manifes JSON. Selama kode sumber ditata sesuai dengan "API build", pembangun dapat mengkompilasi dan menginstal aplikasi dari arsip sumber. Sebagian besar perangkat lunak berbasis autotools sudah sesuai dengan API, jadi biasanya tidak diperlukan konfigurasi lebih lanjut.

File manifes tipikal biasanya terlihat seperti ini:

{
  "app-id": "com.booleanworld.kitten",
  "runtime": "org.freedesktop.Platform",
  "runtime-version": "1.6",
  "sdk": "org.freedesktop.Sdk",
  "command": "kitten",
  "finish-args": [
     "--filesystem=host"
  ],
  "modules": [
    {
      "name": "kitten",
      "sources": [
        {
          "type": "archive",
          "url": "https://opensource.example.com/kitten-0.0.1.tar.gz",
          "sha256": "38ecfd39b76a2505376f5a57ebcc7b19d35efaf9f8c724a24382c45aa1378018"
        }
      ]
    }
  ]
}

Seperti yang Anda lihat, file ini berisi informasi yang sama yang telah kami tentukan sebelumnya dengan berbagai perintah. Selain itu, berisi daftar modul untuk membangun. Dalam contoh di atas, hanya ada satu modul. Jika Anda memiliki aplikasi kompleks yang bergantung pada banyak modul, Anda harus membuat daftar semuanya. Misalnya, gnome-calculator bergantung pada mpc dan mpfr, dan manifesnya terlihat seperti ini.

Jenis sumber yang berbeda didukung. Jenis sumber populer lainnya adalah git , dan Anda harus memberikan URL repositori dan secara opsional, cabang yang harus diperiksa.

Manifes sangat kuat, dan mendukung pengaturan CFLAGS/CXXFLAGS, mengganti nama file untuk ekspor, dan menghapus file yang tidak perlu. Di bagian selanjutnya, kita akan menganalisis aplikasi praktis, dan mempelajari cara mengemasnya untuk Flatpak.

Contoh nyata:kemasan galculator

Di bagian ini, kita akan mengambil galculator, aplikasi kalkulator sederhana dan membuatnya dengan flatpak-builder . Kita perlu melakukan sedikit analisis untuk mengetahui file mana yang perlu diganti namanya atau dihapus. Jadi, sebagai langkah awal, kami akan melakukan tes instalasi. Kemudian, kita dapat membuat manifes sesuai kebutuhan.

Karena galculator adalah aplikasi GTK, kami akan menggunakan runtime dan SDK Gnome. Anda harus menginstalnya sekarang jika Anda belum melakukannya. Selain itu, Anda harus mengunduh arsip sumber dari sini. (Kami telah menggunakan versi 2.1.4, yang merupakan versi terbaru pada saat penulisan ini.)

Menemukan file yang harus diekspor/dihapus

Setelah mengunduh dan mengekstrak arsip sumber, Anda harus mencoba membuatnya menggunakan SDK. SDK Gnome juga berisi alat seperti bash, sehingga Anda dapat memulainya dengan menggunakan:

flatpak run --command=bash --filesystem=host --devel org.gnome.Sdk/x86_64/3.24

Sekarang, pindah ke direktori sumber galculator dan gunakan mantra biasa untuk membangunnya. Kami akan mengatur direktori awalan kami ke ~/galculator-test .

./configure --prefix=$HOME/galculator-test
make install

Sekarang, Anda dapat menjelajahi file di galculator-test direktori. Seperti yang mungkin Anda ketahui, file berikut perlu diekspor:

  • Informasi AppStream di share/appdata/galculator.appdata.xml
  • Ikon di share/icons
  • Entri desktop di share/applications/galculator.desktop

Sayangnya, mereka tidak diawali dengan nama aplikasi. Jadi, Anda harus mengganti namanya dengan properti berikut di manifes:

{
	"rename-appdata-file": "galculator.appdata.xml",
	"rename-icon": "galculator",
	"rename-desktop-file": "galculator.desktop"
}

Setelah file-file ini diganti namanya, flatpak-builder akan secara otomatis mengekspornya. Setelah paket Flatpak dibuat, ini akan membantu dalam membuat entri menu pada sistem dasar.

Selain itu, share/man dan share/pixmaps direktori tidak diperlukan, jadi Anda dapat menghapusnya dengan:

{
    "cleanup": [
        "/share/man",
        "/share/pixmaps"
    ]
}

Mengonfigurasi kotak pasir

Karena ini adalah aplikasi GTK, Anda harus mengizinkannya mengakses X11 dan Wayland, dan berbagi mekanisme IPC. Anda juga harus mengizinkannya menggunakan rendering OpenGL. Selain itu, galculator membutuhkan akses ke dconf, dan Anda harus menambahkan entri yang telah kita bahas sebelumnya. Sakelar, yang akan diteruskan ke build-finish tercantum dalam finish-args properti dalam manifes:

{
    "finish-args": [
        "--share=ipc",
        "--socket=x11",
        "--socket=wayland",
        "--device=dri",
        "--filesystem=xdg-run/dconf",
        "--filesystem=~/.config/dconf:ro",
        "--talk-name=ca.desrt.dconf",
        "--env=DCONF_USER_CONFIG_DIR=.config/dconf"
    ]
}

Melengkapi manifes

Pada titik ini, Anda telah mengonfigurasi sebagian besar bagian penting dari manifes. Mengonfigurasi sisanya seharusnya cukup mudah, dan manifes terakhir yang kami gunakan ada di sini. Kami telah menambahkan satu set build-options , yang menyetel CFLAGS dan CXXFLAGS ke -O3 .

Membangun dan menguji aplikasi

Akhirnya, kita bisa membangun aplikasi. Cukup jalankan flatpak-builder dengan direktori build dan manifes. Dalam contoh ini, galculator adalah direktori build dan org.mnim.galculator.json adalah file manifes.

flatpak-builder galculator org.mnim.galculator.json

Selanjutnya, ekspor ke repositori seperti yang kita lakukan sebelumnya:

flatpak build-export my-repo galculator

Sekarang, Anda dapat menguji aplikasi dengan menginstalnya:

flatpak install --user test-repo org.mnim.galculator

Aplikasi segera diinstal, dan Anda bahkan mendapatkan entri desktop seperti aplikasi biasa! Anda dapat meluncurkannya dari entri menu, atau menjalankannya dengan flatpak run seperti yang kita lakukan sebelumnya.

Mendistribusikan aplikasi

Sekarang setelah Anda membangun aplikasi, bagaimana cara Anda mendistribusikannya? Cara termudah untuk melakukannya adalah dengan mentransfer direktori repositori di server, dan menyajikannya melalui web. Kemudian, Anda dapat meminta pengguna untuk menambahkan repositori Anda ke daftar mereka, dan menginstal aplikasi dengan cara itu.

Banyak orang lebih suka menginstal perangkat lunak yang ditandatangani dengan GPG, karena ini membuktikan bahwa aplikasi tersebut memang berasal dari pengelola aslinya. Anda dapat membuat kunci GPG dengan mudah dengan gpg2 perintah:

gpg2 --quick-key-gen [email protected]

Pastikan untuk mencatat ID kunci karena Anda akan membutuhkannya nanti. Dalam contoh kita, kita akan menganggap bahwa ID kuncinya adalah A318C188C20D410A .

Kemudian, Anda dapat membuat repositori bertanda GPG saat menjalankan build-export seperti ini:

flatpak build-export my-repo galculator --gpg-sign=A318C188C20D410A

Jika Anda memiliki repositori yang belum ditandatangani, Anda dapat menandatanganinya seperti ini:

flatpak build-sign my-repo --gpg-sign=A318C188C20D410A
flatpak build-update-repo my-repo --gpg-sign=A318C188C20D410A

Saat Anda ingin memublikasikan repositori, pastikan untuk memberikan salinan kunci publik kepada pengguna. Untuk mengekspor kunci publik Anda, jalankan:

gpg2 --export A318C188C20D410A > public.gpg

Anda harus mempublikasikan kunci ini di situs web Anda. Ketika pengguna Anda ingin menambahkan repositori Anda, mereka harus mengunduh kunci publik. Jika pengguna mengunduh kunci bernama public.gpg , mereka sekarang dapat menambahkan repositori dengan menjalankan:

flatpak remote-add --gpg-import=public.gpg test-repo https://software.example.com/repo/

Namun, metode ini sangat merepotkan bagi pengguna. Untungnya, Anda dapat menyederhanakan prosesnya dengan membuat file flatpakref dan flatpakrepo, yang dibahas secara rinci dalam dokumentasi.

Kesimpulan

Dalam artikel ini, kita telah mempelajari tentang Flatpak, dan bagaimana Anda dapat mendistribusikan perangkat lunak menggunakan teknologi baru ini. Ini lebih berorientasi pada keamanan dan menampilkan kemampuan integrasi dan pembaruan yang lebih baik dibandingkan dengan metode tradisional seperti AppImage.

Jika Anda tertarik untuk membaca lebih lanjut tentang topik ini, dokumentasi developer dan flatpak-manifest halaman manual adalah tempat yang baik untuk memulai. Jika Anda ingin membaca contoh yang lebih kompleks dari file manifes/flatpakref, lihat repositori Gnome-apps dan contoh Flathub.


Ubuntu
  1. Flatpak di Linux:Apa Itu dan Bagaimana Menginstal Aplikasi dengannya

  2. Cara memulai aplikasi startup dengan penundaan di Linux

  3. Bisakah Anda mengembangkan aplikasi Linux dengan Xamarin?

  1. Instal aplikasi di Linux dengan Flatpak

  2. Instal Linux dengan LVM

  3. Ganti du dengan debu di Linux

  1. Aplikasi Foto Terbaik Untuk Linux

  2. Perintah Sumber Linux dengan Contoh

  3. Perintah wc Linux dengan Contoh