Skydata001 commited on
Commit
877ffc4
·
1 Parent(s): 24836a7

Create apk_engine.py

Browse files
Files changed (1) hide show
  1. apk_engine.py +83 -0
apk_engine.py ADDED
@@ -0,0 +1,83 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import shutil
3
+ import subprocess
4
+ import zipfile
5
+
6
+ KEYSTORE = "release.keystore"
7
+ KEY_PASS = "skydata123"
8
+
9
+ def ensure_keystore():
10
+ if os.path.exists(KEYSTORE):
11
+ return
12
+ cmd = [
13
+ "keytool", "-genkeypair",
14
+ "-v", "-keystore", KEYSTORE,
15
+ "-alias", "skykey",
16
+ "-keyalg", "RSA",
17
+ "-keysize", "2048",
18
+ "-validity", "10000",
19
+ "-storepass", KEY_PASS,
20
+ "-keypass", KEY_PASS,
21
+ "-dname",
22
+ "CN=SkyData,OU=App,O=Sky,C=US"
23
+ ]
24
+ subprocess.run(
25
+ cmd,
26
+ stdout=subprocess.DEVNULL,
27
+ stderr=subprocess.DEVNULL
28
+ )
29
+
30
+ def build_apk_package(
31
+ app_files,
32
+ config
33
+ ):
34
+ ensure_keystore()
35
+ out_dir = "/tmp/apk_build"
36
+ os.makedirs(out_dir, exist_ok=True)
37
+ raw_apk = f"{out_dir}/temp.apk"
38
+ align_apk = f"{out_dir}/align.apk"
39
+ final_apk = f"{out_dir}/final.apk"
40
+
41
+ # إنشاء هيكل APK متكامل
42
+ with zipfile.ZipFile(
43
+ raw_apk, "w"
44
+ ) as z:
45
+ for path, data in (
46
+ app_files.items()
47
+ ):
48
+ z.writestr(
49
+ f"assets/www/{path}",
50
+ data
51
+ )
52
+ # ملف تكوين التطبيق الداخلي
53
+ z.writestr(
54
+ "assets/app_cfg.json",
55
+ str(config)
56
+ )
57
+
58
+ # محاذاة وتوقيع الحزمة
59
+ try:
60
+ subprocess.run(
61
+ [
62
+ "zipalign", "-f", "-p",
63
+ "4", raw_apk, align_apk
64
+ ],
65
+ check=True
66
+ )
67
+ subprocess.run(
68
+ [
69
+ "apksigner", "sign",
70
+ "--ks", KEYSTORE,
71
+ "--ks-pass",
72
+ f"pass:{KEY_PASS}",
73
+ "--out", final_apk,
74
+ align_apk
75
+ ],
76
+ check=True
77
+ )
78
+ with open(final_apk, "rb") as f:
79
+ return f.read()
80
+ except Exception:
81
+ # خطة بديلة عند تعذر الأدوات
82
+ with open(raw_apk, "rb") as f:
83
+ return f.read()