Я хочу получать на сервере post запрос с клик id, и выдавать ответом ссылку на готовый apk с прописанным кликid.
Моя попытка состояла в том, чтобы заранее хранить распакованный апк и добавлять ему в assets клик id. Но это получилось довольно долго. Собирается апк больше 60 секунд при том что это мини прилка одностраничная, когда я ожидал что это будет делаться за секунду.
def build_apk(clickid):
base_dir = os.path.dirname('/home/app_push_server/')
template_dir = os.path.join(base_dir, "apk_template")
keystore_path = os.path.join(base_dir, "/src/my-release-key.keystore")
apks_dir = os.path.join(base_dir, "static/apks")
alias = "mykey"
storepass = s.keypass
output_apk = os.path.join(apks_dir, f"{clickid}.apk")
# Временная папка
temp_dir = tempfile.mkdtemp(prefix=f"apk_{clickid}_")
apk_temp_build = os.path.join(temp_dir, "build")
# Копируем шаблон
shutil.copytree(template_dir, apk_temp_build)
# clickid.txt в assets
assets_path = os.path.join(apk_temp_build, "assets")
os.makedirs(assets_path, exist_ok=True)
with open(os.path.join(assets_path, "clickid.txt"), "w") as f:
f.write(clickid)
# Сборка APK
unsigned_apk = os.path.join(temp_dir, "unsigned.apk")
subprocess.run([
"apktool", "b", apk_temp_build, "-o", unsigned_apk
], check=True)
# Подпись
signed_apk = os.path.join(temp_dir, "signed.apk")
subprocess.run([
"apksigner", "sign",
"--ks", keystore_path,
"--ks-pass", f"pass:{storepass}",
"--key-pass", f"pass:{storepass}",
"--out", signed_apk,
unsigned_apk
], check=True)
subprocess.run([
"zipalign", "-v", "4", signed_apk, output_apk
], check=True)
shutil.rmtree(temp_dir)
print(f"✅ APK создан: {output_apk}")
return output_apk
def unpack_apk_template():
template_dir = os.path.expanduser("apk_template")
base_apk_path = "/home/app_push_server/app-debug.apk"
if os.path.exists(template_dir):
print(" Шаблон уже существует, пропускаем распаковку.")
return
subprocess.run(["apktool", "d", base_apk_path, "-o", template_dir], check=True)
print(f"✅ APK распакован в {template_dir}")
unpack_apk_template()