3.2
Format Keluaran
Hasil pemindaian selalu bermuara pada satu berkas yang dibuka sekali di APKLeaks.__init__. Dua argumen menentukan bentuknya: -o/--output untuk menetapkan path, dan --json untuk memilih format JSON ketimbang teks biasa apkleaks/cli.py:25-281. Karena tempfile dan json sudah diimpor di modul utama, penamaan berkas dan serialisasi tidak butuh modul lain.
Pemilihan berkas dan mode buka
Saat args.output is None, constructor membuat berkas sementara lewat tempfile.mkstemp dengan awalan apkleaks- dan akhiran .json atau .txt mengikuti nilai self.json; elemen kedua dari pasangan yang dikembalikan mkstemp dipakai sebagai path. Bila -o diisi, path itu dipakai apa adanya. Berkas langsung dibuka dengan mode "w" untuk JSON dan "a" untuk teks apkleaks/apkleaks.py:30-342.
graph TD
A["args.output"] -->|"None"| B["tempfile.mkstemp prefix 'apkleaks-' suffix '.json' atau '.txt'"]
A -->|"path eksplisit"| C["output = args.output"]
B --> D["fileout = open output mode 'w' bila json, 'a' bila teks"]
C --> D
D --> E["scanning: out_json['package'] dan out_json['results'] = []"]
E --> F["extract: tulis '[name]' dan '- match' ke berkas hanya bila bukan json"]
F --> G{"cleanup: self.scanned?"}
G -->|"True, json"| H["tulis json.dumps indent=4 lalu close"]
G -->|"True, teks"| I["close, isi berkas dipertahankan"]
G -->|"False"| J["close lalu os.remove output"]
style B fill:#f59e0b,color:#000
style D fill:#f59e0b,color:#000
style H fill:#336791,color:#fff
style I fill:#2d7d46,color:#fff
style J fill:#dc2626,color:#fff
%% fig: Penentuan path dan nasib berkas keluaran
%% desc: Diagram menunjukkan bagaimana output dan mode buka dipilih dari argumen, lalu bagaimana cleanup mempertahankan atau menghapus berkas.⚠️ Mode teks memakai
"a". Bila-omenunjuk berkas yang sudah ada, hasil baru ditambahkan ke isi lama, bukan menimpanya. Mode JSON memakai"w"sehingga berkas lama ditimpa.
⚠️ Tanpa
-o, berkas acak hasilmkstempberada di direktori temp sistem, bukan di direktori kerja. Path lengkapnya hanya diketahui dari pesan penutup di stdout.
Format teks
Pada mode teks, extract menulis tiga jenis baris ke self.fileout: baris judul [name], satu baris - <secret> untuk setiap match, lalu satu baris kosong sebagai pemisah antar bagian. Semua penulisan itu dijaga oleh if self.json is False; judul juga dicetak ke stdout dengan awalan baris baru, sedangkan ke berkas tanpa baris baru apkleaks/apkleaks.py:100-1153. README hanya menyebut perilaku umum ini tanpa mendefinisikan tata letaknya: hasil disimpan otomatis dalam format teks, dan --json diperlukan untuk format JSON README.md:79-844.
| Baris | Isi | Ditulis oleh |
|---|---|---|
[name] | nama pola, misalnya LinkFinder | extract saat len(matches) terpenuhi |
- <secret> | satu match hasil util.finder | extract per elemen matches |
| baris kosong | pemisah antar nama pola | extract setelah loop |
Struktur JSON
Mode JSON tidak menulis apa pun selama pemindaian. Dokumen dibentuk di self.out_json sejak scanning: kunci package diisi self.apk.package, lalu results disiapkan sebagai list kosong apkleaks/apkleaks.py:121-1225. Setiap nama pola yang punya match menambahkan satu objek {"name": name, "matches": matches} ke list tersebut apkleaks/apkleaks.py:100-1153. Serialisasi baru terjadi sekali di cleanup lewat json.dumps(self.out_json, indent=4) apkleaks/apkleaks.py:140-1496.
| Field | Tipe | Sumber nilai |
|---|---|---|
package | string | self.apk.package dari pyaxmlparser |
results | array objek | akumulasi pemanggilan extract |
results[].name | string | nama kunci di config/regexes.json |
results[].matches | array string | nilai matches yang diterima extract |
⚠️ Pada mode teks,
extractmelewati entriLinkFinderyang cocok dengan regex MIME/kelas dan memotong tanda kutip di ujung match. Pemotongan itu tidak menyentuh listmatchesyang masuk keout_json, sehingga isiresults[].matchesdi JSON dapat berbeda dari baris- <secret>di berkas teks apkleaks/apkleaks.py:100-1153.
Berkas yang tidak dipertahankan
Flag self.scanned hanya menjadi True ketika extract menerima minimal satu match. Bila tidak ada temuan sama sekali, cleanup menutup berkas lalu menghapusnya dengan os.remove(self.output) dan mencetak ** Done with nothing. ¯\_(ツ)_/¯. Bila ada temuan, berkas ditutup dan path-nya dilaporkan lewat pesan ** Results saved into '<path>'. apkleaks/apkleaks.py:140-1496. Karena penghapusan terjadi di cleanup yang dipanggil dari blok finally, berkas sementara juga hilang ketika pemindaian gagal di tengah jalan.
self.scanned | Format | Tindakan cleanup | Pesan penutup |
|---|---|---|---|
True | JSON | tulis json.dumps(indent=4), close | ** Results saved into '<path>'. |
True | teks | close tanpa penulisan tambahan | ** Results saved into '<path>'. |
False | apa pun | close lalu os.remove(self.output) | ** Done with nothing. ¯\_(ツ)_/¯ |