Добавление workflow для сборки apk
This commit is contained in:
@@ -0,0 +1,65 @@
|
|||||||
|
name: Сборка мода
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
#schedule: # раз в 36 часов
|
||||||
|
# - cron: "0 0 */3 * *" # каждые 3 дня в 00:00
|
||||||
|
# - cron: "0 12 */3 * *" # каждые 3 дня в 12:00
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Download APK
|
||||||
|
run: |
|
||||||
|
curl -L -o app.apk "https://mirror-dl.anixart-app.com/anixart-beta.apk"
|
||||||
|
|
||||||
|
- name: Ensure aapt is installed
|
||||||
|
run: |
|
||||||
|
if ! command -v aapt &> /dev/null; then
|
||||||
|
echo "aapt не найден, устанавливаем..."
|
||||||
|
sudo apt-get update && sudo apt-get install -y --no-install-recommends android-sdk-build-tools
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Export secrets
|
||||||
|
env:
|
||||||
|
KEYSTORE: ${{ secrets.KEYSTORE }}
|
||||||
|
KEYSTORE_PASS: ${{ secrets.KEYSTORE_PASS }}
|
||||||
|
run: |
|
||||||
|
# Export so later steps can reference them
|
||||||
|
echo "$KEYSTORE" | base64 -d > keystore.jks
|
||||||
|
echo "$KEYSTORE_PASS" > keystore.pass
|
||||||
|
|
||||||
|
- name: Build APK
|
||||||
|
id: build
|
||||||
|
run: |
|
||||||
|
mkdir original
|
||||||
|
mv app.apk original/
|
||||||
|
python ./main.py -f
|
||||||
|
|
||||||
|
- name: Read title from report.log
|
||||||
|
id: get_title
|
||||||
|
run: |
|
||||||
|
TITLE=$(head -n 1 modified/report.log)
|
||||||
|
echo "title=${TITLE}" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
- name: Setup go
|
||||||
|
if: steps.build.outputs.BUILD_EXIT == '0'
|
||||||
|
uses: actions/setup-go@v4
|
||||||
|
with:
|
||||||
|
go-version: '>=1.20'
|
||||||
|
|
||||||
|
- name: Make release
|
||||||
|
if: steps.build.outputs.BUILD_EXIT == '0'
|
||||||
|
uses: https://gitea.com/actions/release-action@main
|
||||||
|
with:
|
||||||
|
title: ${{ steps.get_title.outputs.title }}
|
||||||
|
body_path: modified/report.log
|
||||||
|
draft: true
|
||||||
|
api_key: '${{secrets.RELEASE_TOKEN}}'
|
||||||
|
files: |-
|
||||||
|
modified/**-mod.apk
|
||||||
|
modified/report.log
|
||||||
@@ -1,7 +1,9 @@
|
|||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
import json
|
import json
|
||||||
|
import yaml
|
||||||
import requests
|
import requests
|
||||||
|
import argparse
|
||||||
import colorama
|
import colorama
|
||||||
import importlib
|
import importlib
|
||||||
import traceback
|
import traceback
|
||||||
@@ -141,6 +143,13 @@ def compile_apk(apk: str):
|
|||||||
stdout=subprocess.DEVNULL,
|
stdout=subprocess.DEVNULL,
|
||||||
stderr=subprocess.PIPE,
|
stderr=subprocess.PIPE,
|
||||||
)
|
)
|
||||||
|
title = "anixart mod "
|
||||||
|
with open('./decompiled/apktool.yml') as f:
|
||||||
|
package = yaml.safe_load(f)
|
||||||
|
title += ' '.join([f'{k}: {v}' for k, v in package['versionInfo'].items()])
|
||||||
|
with open("./modified/report.log", "w") as log_file:
|
||||||
|
log_file.write(title+'\n')
|
||||||
|
log_file.write("\n".join([f"{patch.name}: {'applied' if patch.applied else 'failed'}" for patch in patches]))
|
||||||
except subprocess.CalledProcessError as e:
|
except subprocess.CalledProcessError as e:
|
||||||
print("Ошибка при выполнении команды:")
|
print("Ошибка при выполнении команды:")
|
||||||
print(e.stderr)
|
print(e.stderr)
|
||||||
@@ -167,39 +176,55 @@ class Patch:
|
|||||||
traceback.print_exc()
|
traceback.print_exc()
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
parser = argparse.ArgumentParser(
|
||||||
|
description="Автоматический патчер anixart"
|
||||||
|
)
|
||||||
|
|
||||||
conf = init()
|
parser.add_argument("-v", "--verbose",
|
||||||
apk = select_apk()
|
action="store_true",
|
||||||
patch = decompile_apk(apk)
|
help="Выводить подробные сообщения")
|
||||||
|
|
||||||
patches = []
|
parser.add_argument("-f", "--force",
|
||||||
for filename in os.listdir("patches/"):
|
action="store_true",
|
||||||
if filename.endswith(".py") and filename != "__init__.py" and not filename.startswith("todo_"):
|
help="Принудительно собрать APK")
|
||||||
module_name = filename[:-3]
|
|
||||||
module = importlib.import_module(f"patches.{module_name}")
|
|
||||||
patches.append(Patch(module_name, module))
|
|
||||||
|
|
||||||
patches.sort(key=lambda x: x.package.priority, reverse=True)
|
args = parser.parse_args()
|
||||||
|
|
||||||
for patch in tqdm(patches, colour="green", desc="Применение патчей"):
|
conf = init()
|
||||||
tqdm.write(f"Применение патча: {patch.name}")
|
apk = select_apk()
|
||||||
patch.apply(conf)
|
patch = decompile_apk(apk)
|
||||||
|
|
||||||
statuses = {}
|
if args.verbose: conf["verbose"] = True
|
||||||
for patch in patches:
|
|
||||||
statuses[patch.name] = patch.applied
|
|
||||||
marker = colorama.Fore.GREEN + "✔" if patch.applied else colorama.Fore.RED + "✘"
|
|
||||||
print(f"{marker}{colorama.Style.RESET_ALL} {patch.name}")
|
|
||||||
|
|
||||||
if all(statuses.values()):
|
patches = []
|
||||||
print(f"{colorama.Fore.GREEN}Все патчи успешно применены{colorama.Style.RESET_ALL}")
|
for filename in os.listdir("patches/"):
|
||||||
compile_apk(apk)
|
if filename.endswith(".py") and filename != "__init__.py" and not filename.startswith("todo_"):
|
||||||
elif any(statuses.values()):
|
module_name = filename[:-3]
|
||||||
print(f"{colorama.Fore.YELLOW}⚠{colorama.Style.RESET_ALL} Некоторые патчи не были успешно применены")
|
module = importlib.import_module(f"patches.{module_name}")
|
||||||
if input("Продолжить? (y/n): ").lower() == "y":
|
patches.append(Patch(module_name, module))
|
||||||
|
|
||||||
|
patches.sort(key=lambda x: x.package.priority, reverse=True)
|
||||||
|
|
||||||
|
for patch in tqdm(patches, colour="green", desc="Применение патчей"):
|
||||||
|
tqdm.write(f"Применение патча: {patch.name}")
|
||||||
|
patch.apply(conf)
|
||||||
|
|
||||||
|
statuses = {}
|
||||||
|
for patch in patches:
|
||||||
|
statuses[patch.name] = patch.applied
|
||||||
|
marker = colorama.Fore.GREEN + "✔" if patch.applied else colorama.Fore.RED + "✘"
|
||||||
|
print(f"{marker}{colorama.Style.RESET_ALL} {patch.name}")
|
||||||
|
|
||||||
|
if all(statuses.values()):
|
||||||
|
print(f"{colorama.Fore.GREEN}Все патчи успешно применены{colorama.Style.RESET_ALL}")
|
||||||
compile_apk(apk)
|
compile_apk(apk)
|
||||||
|
elif any(statuses.values()):
|
||||||
|
print(f"{colorama.Fore.YELLOW}⚠{colorama.Style.RESET_ALL} Некоторые патчи не были успешно применены")
|
||||||
|
if args.force or input("Продолжить? (y/n): ").lower() == "y":
|
||||||
|
compile_apk(apk)
|
||||||
|
else:
|
||||||
|
print(colorama.Fore.RED + "Операция отменена" + colorama.Style.RESET_ALL)
|
||||||
else:
|
else:
|
||||||
print(colorama.Fore.RED + "Операция отменена" + colorama.Style.RESET_ALL)
|
print(f"{colorama.Fore.RED}Ни один патч не был успешно применен{colorama.Style.RESET_ALL}")
|
||||||
else:
|
sys.exit(1)
|
||||||
print(f"{colorama.Fore.RED}Ни один патч не был успешно применен{colorama.Style.RESET_ALL}")
|
|
||||||
sys.exit(1)
|
|
||||||
|
|||||||
Reference in New Issue
Block a user