2.2
Siklus Hidup Objek APKLeaks
APKLeaks adalah objek berumur pendek. main() membuatnya satu kali lewat APKLeaks(args), menjalankan tiga fase di dalam blok try, lalu menaruh init.cleanup() di blok finally sehingga pembersihan tetap berjalan ketika salah satu fase memanggil sys.exit (apkleaks/cli.py:32-411). Seluruh atribut yang dipakai ketiga fase disiapkan di __init__ sebelum satu pun fase berjalan (apkleaks/apkleaks.py:26-382).
Status yang disimpan instance
Tabel berikut merangkum nilai awal setiap atribut dan bagian yang mengubahnya (apkleaks/apkleaks.py:26-382).
| Atribut | Nilai awal | Diubah oleh |
|---|---|---|
self.apk | None | integrity() mengisinya dengan self.apk_info() |
self.file | os.path.realpath(args.file) | tidak berubah |
self.json | args.json | tidak berubah |
self.disarg | args.args | tidak berubah |
self.prefix | "apkleaks-" | tidak berubah |
self.tempdir | tempfile.mkdtemp(prefix=self.prefix) | diisi hasil dekompilasi jadx |
self.main_dir | os.path.dirname(os.path.realpath(__file__)) | tidak berubah |
self.output | hasil tempfile.mkstemp(...) atau args.output | tidak berubah |
self.fileout | open(self.output, "w" if json else "a") | ditutup oleh cleanup() |
self.pattern | config/regexes.json atau args.pattern | tidak berubah |
self.jadx | which("jadx") atau binary bawaan paket | dependencies() mengatur izinnya lewat os.chmod |
self.out_json | {} | scanning() mengisi package dan results |
self.scanned | False | extract() menetapkan True |
Hanya dua atribut yang berganti makna selama objek hidup. self.apk bergerak dari None menjadi instance APK pyaxmlparser lewat apk_info() (apkleaks/apkleaks.py:41-423, apkleaks/apkleaks.py:804), sedangkan self.scanned bergerak dari False menjadi True begitu extract() menemukan setidaknya satu match (apkleaks/apkleaks.py:1155). self.out_json sudah memiliki kunci results sebelum pola pertama dipindai, sehingga extract() boleh langsung melakukan append (apkleaks/apkleaks.py:121-1226).
Perpindahan status
stateDiagram-v2
[*] --> Initialized
Initialized --> IntegrityCheck : main memanggil init.integrity
IntegrityCheck --> DownloadingJadx : jadx tidak ada dan pengguna menjawab y
DownloadingJadx --> IntegrityCheck : dependencies selesai
DownloadingJadx --> Aborted : exception saat unduh
IntegrityCheck --> Aborted : jawaban n atau berkas bukan APK valid
IntegrityCheck --> APKLoaded : self.apk = self.apk_info
APKLoaded --> Decompiled : decompile menulis ke self.tempdir
Decompiled --> Scanning : scanning dijalankan
Scanning --> Scanning : satu thread per pola menjalankan extract
Scanning --> Scanned : extract menetapkan self.scanned = True
Scanning --> Empty : tidak ada match
Scanned --> Cleanup : finally memanggil init.cleanup
Empty --> Cleanup : finally memanggil init.cleanup
Aborted --> Cleanup : finally memanggil init.cleanup
Cleanup --> [*]
classDef store fill:#336791,color:#fff
classDef careful fill:#f59e0b,color:#000
classDef derived fill:#8b5cf6,color:#fff
classDef ok fill:#2d7d46,color:#fff
classDef fail fill:#dc2626,color:#fff
class Initialized,Cleanup store
class IntegrityCheck,DownloadingJadx careful
class APKLoaded,Decompiled,Scanning derived
class Scanned ok
class Empty,Aborted fail
%% fig: Siklus hidup instance APKLeaks
%% desc: Objek berpindah dari inisialisasi ke pemeriksaan dependensi, dekompilasi, pemindaian, lalu cleanup pada setiap jalur keluar.Satu-satunya keadaan yang dapat berputar adalah IntegrityCheck. Bila self.jadx tidak ada, integrity() menanyakan unduhan, memanggil dependencies() yang mengambil jadx-1.2.0.zip, lalu memeriksa ulang berkas masukan sebelum memuat APK (apkleaks/apkleaks.py:55-877, apkleaks/apkleaks.py:44-538). Keadaan Aborted menampung tiga jalan keluar berbeda: jawaban n, berkas yang bukan APK valid, dan sys.exit dari dependencies() saat unduhan gagal — semuanya tetap melewati cleanup() (apkleaks/apkleaks.py:51-53, apkleaks/apkleaks.py:73-77, apkleaks/apkleaks.py:86-87).
scanning() menolak berjalan bila self.apk masih None, sehingga keadaan APKLoaded wajib dilalui sebelum Scanning (apkleaks/apkleaks.py:118-11912).
Metode dan efeknya pada objek
| Metode | Prasyarat | Efek pada objek | Rujukan |
|---|---|---|---|
integrity() | self.jadx dan self.file | mengisi self.apk atau menghentikan proses | apkleaks/apkleaks.py:55-877 |
dependencies() | dipanggil dari integrity() | mengekstrak jadx lalu os.chmod(self.jadx, 33268) | apkleaks/apkleaks.py:44-538 |
decompile() | self.jadx ada | menjalankan os.system dengan -d self.tempdir | apkleaks/apkleaks.py:89-9813 |
scanning() | self.apk tidak None | mengisi self.out_json dan memulai thread extract | apkleaks/apkleaks.py:117-13814 |
extract() | dipanggil dari thread | menulis self.fileout dan menetapkan self.scanned | apkleaks/apkleaks.py:100-11515 |
cleanup() | apa pun hasil fase sebelumnya | menghapus self.tempdir dan menutup self.fileout | apkleaks/apkleaks.py:140-14916 |
Rincian argumen jadx dan perilaku util.finder dibahas di Dekomplikasi dan jadx serta Mesin Pemindaian Pola.
Artefak sementara dan berkas keluaran
graph LR
init["APKLeaks.__init__()"] --> tempdir["self.tempdir: tempfile.mkdtemp"]
init --> fileout["self.fileout: open(self.output)"]
tempdir --> jadx["decompile(): jadx -d self.tempdir"]
jadx --> finder["util.finder() membaca tempdir"]
finder --> extract["extract() menulis hasil"]
fileout --> extract
extract --> flag["self.scanned = True"]
flag --> cleanup["cleanup()"]
cleanup --> rmtree["shutil.rmtree(self.tempdir)"]
cleanup --> saved["berkas hasil dipertahankan"]
cleanup --> removed["os.remove(self.output)"]
style init fill:#f59e0b,color:#000
style tempdir fill:#336791,color:#fff
style fileout fill:#336791,color:#fff
style jadx fill:#8b5cf6,color:#fff
style finder fill:#8b5cf6,color:#fff
style extract fill:#8b5cf6,color:#fff
style flag fill:#2d7d46,color:#fff
style saved fill:#2d7d46,color:#fff
style cleanup fill:#f59e0b,color:#000
style rmtree fill:#dc2626,color:#fff
style removed fill:#dc2626,color:#fff
%% fig: Artefak yang lahir dan berakhir dalam satu siklus
%% desc: Konstruktor mengalokasikan tempdir dan berkas keluaran, lalu cleanup menghapus tempdir selalu dan berkas keluaran hanya pada jalur tanpa hasil.self.tempdir dan self.output adalah dua artefak yang lahir di __init__. tempdir menjadi direktori -d bagi jadx dan target pembacaan util.finder, sementara self.output dibuka sekali sebagai self.fileout dengan mode w bila --json dipakai dan a bila tidak (apkleaks/apkleaks.py:31-3417, apkleaks/apkleaks.py:89-9813).
cleanup() selalu menjalankan shutil.rmtree(self.tempdir), lalu bercabang pada nilai self.scanned. Pada cabang True, self.out_json di-json.dumps bila --json aktif, self.fileout ditutup, dan lokasi hasil dicetak. Pada cabang False, self.fileout ditutup dan self.output dihapus (apkleaks/apkleaks.py:140-14916).
⚠️ Bila
self.scannedmasihFalse,os.remove(self.output)menghapus berkas keluaran. Karena berkas itu sudah dibuat di__init__lewattempfile.mkstempatau dibuka lewatopen(self.output, ...), berkas yang ditunjuk--outputdan dibuka dengan modeaakan ikut terhapus ketika pemindaian tidak menemukan apa pun (apkleaks/apkleaks.py:33-3418, apkleaks/apkleaks.py:146-14819).
⚠️
scanning()memanggilthread.start()untuk setiap pola tanpa pernahjoin, sehinggacleanup()dapat menghapusself.tempdirdan menutupself.fileoutselagi threadextractmasih berjalan (apkleaks/apkleaks.py:129-13020, apkleaks/apkleaks.py:140-14916).
Urutan fase beserta pola yang dijalankan tiap thread dijelaskan di Alur Pemindaian.