Membuat Software Portable di GNU/Linux Menggunakan AppImage

AppImage merupakan salah satu solusi tertua untuk menjawab persoalan bagaimana mengemas perangkat lunak agar bisa langsung dijalankan pada banyak distro GNU/Linux. Jika Anda belum mengenal AppImage, bayangkan saja ia seperti portable software untuk dunia GNU/Linux. Kita tidak perlu memusingkan distro, dependencies atau package manager, cukup unduh software yang dikemas menjadi AppImage, jadikan executable dan kemudian jalankan. That's simple.

Meski telah lama beredar, dan bahkan menuai pujian dari tokoh sekaliber Linus Torvalds, popularitas AppImage tidak kunjung menanjak dan malah cenderung tenggelam tertelan riuhnya berita aplikasi sejenis; snaps dan flatpak.
Karenanya, dalam artikel kali ini saya akan mencoba mengangkat topik AppImage dengan bahasan bagaimana cara membuat berkas AppImage untuk Genymotion.
Sengaja saya pilih Genymotion sebagai contoh AppImage karena kebetulan kemarin baru saja menulis artikel bagaimana cara memasang Genymotion. Jadi, pastinya masih segar dalam ingatan.

Dokumentasi selengkapnya mengenai AppImage bisa dibaca di sini. Sementara jika Anda malas untuk membuat sendiri dan ingin langsung mencoba berkas AppImage yang sudah jadi, unduh koleksi berkas biner AppImage di repo bintray ini.

Membuat AppImage secara manual

Walau cara manual ini mungkin akan terasa memusingkan dan merepotkan, namun saya sangat menyarankan Anda untuk mencobanya agar sedikit-banyak bisa lebih memahami seluk-beluk AppImage.

  • Unduh berkas Genymotion. Untuk uraian yang terperinci, silakan baca artikel Menjalankan Aplikasi Android di Linux Menggunakan Genymotion.

  • Unduh appimagetool, sebuah perkakas untuk membuat berkas AppImage, dari repo AppImageKit. Sesuaikan dengan arsitektur sistem operasi yang Anda gunakan. Dicontohkan mengunduh versi 64 bit.

    wget -c https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage --trust-server-names -O appimagetool-x86_64.AppImage
    

    Untuk arsitektur lain, silakan lihat di laman https://github.com/AppImage/AppImageKit/releases.
    Jika telah terunduh, jadikan berkas appimagetool-x86_64.AppImage ini executable.

    sudo chmod +x appimagetool-x86_64.AppImage
    
  • Buat sebuah folder AppDir, misal nama folder-nya adalah Genymotion.AppDir.

    mkdir Genymotion.AppDir
    
  • Masuk ke dalam folder AppDir yang baru dibuat tadi.

    cd Genymotion.AppDir
    
  • Uraikan berkas biner Genymotion hasil unduhan. Misal nama berkasnya adalah genymotion-2.11.0-linux_x64.bin, yang terletak di $HOME/Downloads.

    yes | bash $HOME/Downloads/genymotion-2.11.0-linux_x64.bin -d opt/genymotion
    
  • Buat berkas desktop launcher.

    nano genymotion.desktop
    

    Dan kemudian isikan kode berikut:

    [Desktop Entry]
    Type=Application
    Version=1.0
    Name=Genymotion
    Comment=Virtual environment for Android.
    Exec=/opt/genymobile/genymotion/genymotion
    Icon=genymotion
    Terminal=false
    Categories=Development;
    
  • Unduh berkas AppRun dari repo AppImageKit.

    wget -c https://github.com/AppImage/AppImageKit/releases/download/continuous/AppRun-x86_64 --trust-server-names -O AppRun
    
  • Jadikan berkas desktop launcher dan AppRun ini executable.

    sudo chmod +x genymotion.desktop AppRun
    
  • Salin ikon Genymotion.

    cp opt/genymobile/genymotion/icons/icon.png genymotion.png
    
  • Buat symbolic link dari biner Genymotion ke /usr/bin.

    ln -s ../../opt/genymobile/genymotion/genymotion usr/bin/genymotion
    
  • Saatnya menjadikan folder Genymotion.AppDir ini sebuah berkas AppImage.
    Berpindahlah ke direktori tempat appimagetool-x86_64.AppImage berada.

    cd ..
    

    Kemudian jalankan perintah berikut untuk membangun AppImage.

    ./appimagetool-x86_64.AppImage Genymotion.AppDir
    

    Jika proses build berjalan lancar tanpa kendala, berkas AppImage yang dihasilkan akan bisa ditemukan pada direktori yang sama dengan perkakas appimagetool-x86_64.AppImage berada. Pada contoh kali ini, berkas yang berhasil dibangun bernama Genymotion-x86_64.AppImage.

Selamat! Anda telah berhasil menjadikan Genymotion portable. Emm, tidak benar-benar portable sih, karena ia memerlukan VirtualBox terpasang pada sistem.
Untuk menjalankannya, cukup jadikan ia executable dan kemudian klik ganda seperti umumnya menjalankan aplikasi GUI.

Membuat AppImage dengan bantuan skrip

Jadi, Anda telah mencoba membuat berkas AppImage secara manual dan lumayan memahami cara kerja AppImage. Namun cara manual dirasa lumayan bertele-tele dan membuang waktu jika melakukannya berulang-kali.
Jangan khawatir, menurut wiki AppImage, ada banyak cara untuk membangun AppImage. Salah satunya, yang ternyata belum ada di wiki tersebut, adalah dengan menggunakan skrip pkg2appimage dari repo AppImages.

pkg2appimage akan membangun berkas AppImage berdasarkan "resep" yang ditulis dalam berkas yaml.
Kita bisa mendapatkan banyak berkas resep dari dalam folder recipes repo AppImages tadi. Namun sayangnya, dalam repo tersebut tidak ada resep untuk Genymotion. Jadi, ya terpaksa kita harus menulis resepnya sendiri.

Sayangnya saya belum menemukan dokumentasi yang memadai mengenai skema penulisan berkas resep AppImage, jadi satu-satunya cara yang bisa dilakukan untuk belajar membuat berkas resep yang baru adalah dengan mengamati resep-resep yang ada di repo AppImages tadi.
Untungnya, aturan penulisan berkas resep AppImage cukup sederhana dan bisa dengan relatif mudah dipahami.

Langkah membuat AppImage Genymotion secara manual yang diterangkan pada paragraf terdahulu bisa kita buatkan resepnya seperti berikut:

app: Genymotion

ingredients:
  script:
    - GENYVER='2.11.0'
    - wget -c "https://dl.genymotion.com/releases/genymotion-$GENYVER/genymotion-$GENYVER-linux_x64.bin"
    - echo $GENYVER > VERSION

script:
  - GENYDIR='opt/genymobile'
  - install -d $GENYDIR
  - cp ../genymotion-*.bin .
  - yes | bash genymotion-*.bin -d $GENYDIR
  - cp opt/genymobile/genymotion/icons/icon.png genymotion.png
  - ln -s ../../opt/genymobile/genymotion/genymotion usr/bin/genymotion
  - cat > genymotion.desktop <<EOF
  - [Desktop Entry]
  - Type=Application
  - Version=1.0
  - Name=Genymotion
  - Comment=Virtual environment for Android.
  - Exec=/opt/genymobile/genymotion/genymotion
  - Icon=genymotion
  - Terminal=false
  - Categories=Development;
  - EOF

Seperti bisa dilihat, susunan berkas resep tampak cukup sederhana dan relatif mudah dimengerti tanpa perlu banyak penjelasan.

  • Baris app adalah untuk menyatakan nama berkas AppImage.
  • Baris ingredients adalah tempat untuk mendaftar "bahan-bahan" atau source yang akan digunakan pada proses build.
  • Baris script paling bawah adalah daftar perintah yang akan dijalankan pkg2appimage dalam proses build.
    Aturan penulisan di bagian script ini sama saja halnya dengan penulisan skrip bash, yang membedakan hanyalah tiap baris mesti diawali tanda sambung (hyphen) diikuti spasi.

Untuk membuat AppImage berdasarkan resep, jalankan perintah dengan format pkg2appimage [RESEP]. Misalnya jika resep di atas kita simpan menjadi berkas Genymotion.yml, maka perintah untuk membangun AppImage-nya menjadi seperti berikut:

pkg2appimage Genymotion.yml

Tiada lagi yang perlu dilakukan selain menunggu hingga proses build selesai. Jika proses build berhasil, berkas biner AppImage yang dihasilkan akan bisa ditemukan di folder out pada direktori dimana kita menjalankan skrip.

Akhir kata, jika Anda senang mencoba-coba program namun segan untuk mengotori sistem, ingin memasang program yang tidak ada dalam lumbung paket distro yang dipakai, atau ingin program yang Anda buat bisa dicicipi banyak calon user tanpa perlu membuat beragam jenis paket yang berbeda antar distro, maka AppImage bisa menjadi solusi.
Lain halnya dengan Snap atau Flatpak yang dukungannya terbatas pada distro tertentu, AppImage bisa berjalan di hampir semua distro. Ia juga tidak memiliki dependensi khusus, jadi yang diperlukan untuk menjalankan AppImage hanyalah mengunduh program yang dikemas dengan AppImage dan kemudian menjadikannya executable.