3
Instalasi dan Dependensi
APKLeaks bisa dipasang lewat tiga jalur: paket PyPI, salinan source, atau image Docker. Ketiganya berujung pada kelas APKLeaks yang sama, sehingga hasil pemasangan hanya berbeda pada artefak yang tersedia di disk. Di samping paketnya sendiri, ada dua dependency yang menentukan apakah pemindaian bisa berjalan: pustaka Python pyaxmlparser dan binary jadx.
graph TD
pypi["pip3 install apkleaks"] --> ep["entry point apkleaks.cli:main"]
source["git clone + pip3 install -r requirements.txt"] --> tree["working tree: apkleaks.py, config/regexes.json"]
docker["docker pull dwisiswant0/apkleaks:latest"] --> image["image python:3-slim + openjdk-17-jre-headless + jadx 1.2.0"]
ep --> cls["APKLeaks.__init__"]
tree --> cls
image --> cls
req["requirements.txt: pyaxmlparser>=0.3.24"] --> cls
cls --> jadx["self.jadx"]
image -.->|"symlink /usr/local/bin/jadx"| jadx
cls --> apkinfo["apk_info() lewat pyaxmlparser.APK"]
style pypi fill:#2d7d46,color:#fff
style source fill:#2d7d46,color:#fff
style tree fill:#2d7d46,color:#fff
style ep fill:#2d7d46,color:#fff
style docker fill:#336791,color:#fff
style image fill:#336791,color:#fff
style req fill:#8b5cf6,color:#fff
style apkinfo fill:#8b5cf6,color:#fff
style cls fill:#f59e0b,color:#000
style jadx fill:#f59e0b,color:#000
%% fig: Tiga jalur pemasangan menuju satu kelas APKLeaks
%% desc: Setiap jalur pemasangan menyediakan paket apkleaks, konfigurasi pola, dan binary jadx dengan cara yang berbeda, lalu bertemu di APKLeaks.__init__.Jalur pemasangan
| Jalur | Perintah | Artefak yang muncul | Rujukan |
|---|---|---|---|
| PyPI | pip3 install apkleaks | paket apkleaks dan entry point apkleaks di PATH | README.md:27-311 |
| Source | git clone lalu pip3 install -r requirements.txt | working tree berisi apkleaks.py dan config/ | README.md:33-412 |
| Docker | docker pull dwisiswant0/apkleaks:latest | image dengan python:3-slim, JRE, dan jadx | README.md:43-493 |
Jalur PyPI mengandalkan metadata di pyproject.toml. Berkas itu menetapkan requires-python = ">=3.8" dan mendaftarkan entry point apkleaks = "apkleaks.cli:main", sehingga setelah pemasangan perintah apkleaks langsung tersedia di shell (pyproject.toml:13-174). Daftar dependency tidak ditulis manual di pyproject.toml; nilainya diambil dari requirements.txt lewat dynamic = ["dependencies", "version"] (pyproject.toml:22-245).
Pemasangan lewat PyPI juga harus membawa berkas pola default. Karena itu pyproject.toml menyertakan paket config* dan memasang *.json sebagai package data (pyproject.toml:26-306). Tanpa bagian ini, config/regexes.json tidak ikut terpasang. Peran berkas tersebut dijelaskan di Kustomisasi Pola Sendiri.
Jalur source hanya membutuhkan clone repository dan satu perintah pip3 install -r requirements.txt (README.md:33-412). Untuk pekerjaan yang berulang, Makefile menyediakan target venv dan setup yang membuat virtualenv lalu memasang requirements.txt beserta build dan twine (Makefile:16-25).
Jalur Docker berbeda karena semua dependency sistem sudah dipanggang di dalam image. Dockerfile memakai basis python:3-slim, memasang openjdk-17-jre-headless dan unzip, lalu mengunduh jadx-1.2.0.zip, mengekstraknya ke /opt/jadx, dan membuat symlink /usr/local/bin/jadx (Dockerfile:1-16). Sisa Dockerfile menyalin requirements.txt, menjalankan python -m ensurepip dan pip install -r requirements.txt, lalu menyalin seluruh konteks ke /app dengan ENTRYPOINT ["python", "/app/apkleaks.py"] (Dockerfile:18-25). Karena entry point berupa daftar argumen, opsi CLI Docker ditulis setelah nama image, seperti yang dicontohkan di Penggunaan CLI.
Dependensi Python
Hanya ada satu dependency Python yang dideklarasikan, yaitu pyaxmlparser>=0.3.24 (requirements.txt:17). Pustaka ini diimpor sebagai from pyaxmlparser import APK (apkleaks/apkleaks.py:198) dan dipakai oleh apk_info() yang mengembalikan APK(self.file) (apkleaks/apkleaks.py:41-429). Artinya, metadata APK seperti nama paket dan versi dibaca oleh pyaxmlparser, bukan oleh jadx.
Dependensi binary jadx
jadx adalah dependency yang tidak diselesaikan oleh pip. Pada __init__, APKLeaks mencari binary itu lewat shutil.which("jadx"); jika tidak ditemukan, ia memakai cadangan ../jadx/bin/jadx di luar direktori paket, dengan akhiran .bat bila os.name == "nt" (apkleaks/apkleaks.py:3610). README menegaskan bahwa jadx diunduh otomatis ketika tidak ada di sistem (README.md:51-5311).
stateDiagram-v2
[*] --> CekJadx
CekJadx --> JadxSiap: os.path.exists(self.jadx)
CekJadx --> Tanya: "Can't find jadx binary."
Tanya --> Unduh: jawaban yes atau y
Tanya --> Batal: jawaban no atau n
Unduh --> JadxSiap: dependencies() ekstrak jadx 1.2.0
Unduh --> Gagal: exception saat urlopen atau ZipFile
Batal --> [*]
Gagal --> [*]
JadxSiap --> [*]
style CekJadx fill:#f59e0b,color:#000
style Tanya fill:#f59e0b,color:#000
style Unduh fill:#8b5cf6,color:#fff
style JadxSiap fill:#2d7d46,color:#fff
style Batal fill:#dc2626,color:#fff
style Gagal fill:#dc2626,color:#fff
%% fig: Penyelesaian binary jadx di integrity()
%% desc: integrity() memeriksa keberadaan jadx, menawarkan unduhan lewat dependencies(), dan berhenti bila pengguna menolak atau unduhan gagal.Pemeriksaan itu terjadi di integrity() yang dipanggil main() sebelum decompile(). Bila os.path.exists(self.jadx) bernilai salah, APKLeaks mencetak Can't find jadx binary. lalu menanyakan Do you want to download jadx? (Y/n) dengan jawaban kosong dianggap yes (apkleaks/apkleaks.py:55-7712). Bila jawabannya negatif, program berhenti dengan pesan ** Aborted. (apkleaks/apkleaks.py:76-7713).
Pengunduhan ditangani dependencies(). Fungsi ini mengambil arsip dari URL rilis jadx-1.2.0.zip, mengekstraknya ke direktori jadx di sebelah paket, lalu menjalankan os.chmod(self.jadx, 33268) agar binary bisa dieksekusi; kegagalan apa pun dicetak sebagai peringatan lalu diakhiri sys.exit() (apkleaks/apkleaks.py:44-5314).
⚠️ Jalur source tidak menyertakan
jadx. Bila sistem belum punyajadxdiPATHdan pengguna menolak unduhan, proses berhenti diintegrity()sebelum APK pernah dibaca (apkleaks/apkleaks.py:55-7712). Jalur Docker tidak terkena masalah ini karena image sudah memasangjadxdan symlink-nya (Dockerfile:12-16).
Setelah jadx tersedia, decompile() menyusun argumen [self.jadx, self.file, "-d", self.tempdir] dan menambahkan isi --args bila diberikan (apkleaks/apkleaks.py:89-9815). Rincian opsi tersebut dibahas di Opsi CLI dan Argumen Disassembler.