Задать вопрос
@allresize

Как «На лету» добавить клик id в готовый апк, который будет скачиваться с сайта?

Я хочу получать на сервере 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()
  • Вопрос задан
  • 92 просмотра
Подписаться 1 Средний Комментировать
Решения вопроса 1
@devgor
так как используется файл в assets, то пересборка apk не требуется. в приведенном коде файл вообще декодируется аж до smali. так что необходимо просто переписать файл assets/clickid.txt в архиве и подписать apk, что должно быть кратно быстрее
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
AlexNest
@AlexNest Куратор тега Python
Работаю с Python/Django
Я бы собирал apk в фоне с помощью celery и отдавал ссылку на него уже по завершению.
upd.:
Как «На лету» добавить клик id в готовый апк, который будет скачиваться с сайта?

Немного дополню. При каждой сборке apk подписывается. Добавить в готовый apk что-то можно (это обычный ZIP-архив), но тогда подпись станет недействительной.
Реально ли переподписать такой APK я не знаю, т.к. с андроид-разработкой "на вы". Если да - это вполне себе альтернативный, более быстрый вариант.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы