Cachette met des médias de côté pendant qu'il y a du réseau, pour les lire quand il n'y en a plus. - Lecture audio et vidéo en arrière-plan (Media3 MediaSessionService) - Mise en cache explicite, reprise automatique après coupure (WorkManager) - Sources : appareil (MediaStore), lien direct, flux RSS de podcast - Catalogues libres de droits : Internet Archive et LibriVox - Parcours d'une source avec sélection multiple et téléchargement en lot - Interface Jetpack Compose Material 3, thèmes clair et sombre - Makefile catégorisé, publication Gitea déléguée à BorisSkill Le fichier VERSION est la source unique de la version : versionCode en est déduit et la publication s'y réfère.
123 lines
4.4 KiB
Makefile
123 lines
4.4 KiB
Makefile
.DEFAULT_GOAL := help
|
||
|
||
# --- Outillage -------------------------------------------------------------
|
||
# Le SDK et adb sont rarement dans le PATH : on les retrouve sans les figer.
|
||
ANDROID_SDK ?= $(HOME)/Android/Sdk
|
||
ADB ?= $(shell command -v adb 2>/dev/null || echo $(ANDROID_SDK)/platform-tools/adb)
|
||
GRADLE := ./gradlew
|
||
|
||
VERSION := $(shell tr -d '[:space:]' < VERSION)
|
||
|
||
APPLICATION_ID := fr.tuxgyver.cachette
|
||
LAUNCH_ACTIVITY := $(APPLICATION_ID)/.MainActivity
|
||
DEBUG_APK := app/build/outputs/apk/debug/app-debug.apk
|
||
# Le nom de l'APK de release dépend de la signature (app-release.apk contre
|
||
# app-release-unsigned.apk) : on liste le répertoire au lieu de deviner.
|
||
RELEASE_DIR := app/build/outputs/apk/release
|
||
SIGNED_APK := $(RELEASE_DIR)/app-release.apk
|
||
OUTPUT_APK := Cachette-$(VERSION).apk
|
||
|
||
# --- Publication -----------------------------------------------------------
|
||
# Déléguée au script de BorisSkill, qui sait déjà tout faire : résolution du
|
||
# jeton ($GITEA_TOKEN, .gitea-token, ~/.config/gitea/token, ~/.git-credentials),
|
||
# déduction de l'hôte, du propriétaire et du dépôt depuis le remote 'origin',
|
||
# création et poussée du tag, extraction des notes depuis le CHANGELOG.
|
||
GITEA_RELEASE ?= $(HOME)/.claude/skills/BorisSkill/scripts/gitea_release.sh
|
||
|
||
##@ 🔨 Construction
|
||
|
||
.PHONY: build
|
||
build: ## Construit l'APK de debug
|
||
$(GRADLE) :app:assembleDebug
|
||
@echo "→ $(DEBUG_APK)"
|
||
|
||
.PHONY: release
|
||
release: ## Construit l'APK de release (signé si keystore.properties existe)
|
||
@test -f keystore.properties || echo "⚠️ keystore.properties absent : l'APK produit sera non signé"
|
||
$(GRADLE) :app:assembleRelease
|
||
@if [ -f $(SIGNED_APK) ]; then \
|
||
cp $(SIGNED_APK) $(OUTPUT_APK); \
|
||
echo "→ $(OUTPUT_APK)"; \
|
||
else \
|
||
ls -1 $(RELEASE_DIR)/*.apk 2>/dev/null | sed 's/^/→ /'; \
|
||
echo " (non signé : non publiable, voir keystore.properties)"; \
|
||
fi
|
||
|
||
.PHONY: apk
|
||
apk: ## Affiche le chemin et la taille des APK construits
|
||
@ls -lh $(DEBUG_APK) 2>/dev/null || echo "APK de debug : pas encore construit (make build)"
|
||
@ls -lh $(RELEASE_DIR)/*.apk 2>/dev/null || echo "APK de release : pas encore construit (make release)"
|
||
|
||
.PHONY: clean
|
||
clean: ## Supprime les artefacts de build
|
||
$(GRADLE) clean
|
||
|
||
##@ 🚀 Déploiement
|
||
|
||
.PHONY: install
|
||
install: ## Installe l'APK de debug sur l'appareil connecté
|
||
$(GRADLE) :app:installDebug
|
||
|
||
.PHONY: run
|
||
run: install ## Installe puis lance l'application
|
||
$(ADB) shell am start -n $(LAUNCH_ACTIVITY)
|
||
|
||
.PHONY: uninstall
|
||
uninstall: ## Désinstalle l'application de l'appareil connecté
|
||
$(ADB) uninstall $(APPLICATION_ID)
|
||
|
||
##@ 🧪 Qualité
|
||
|
||
.PHONY: lint
|
||
lint: ## Analyse Android Lint (rapport dans app/build/reports/lint-results-debug.html)
|
||
$(GRADLE) :app:lintDebug
|
||
|
||
##@ 🐞 Diagnostic
|
||
|
||
.PHONY: devices
|
||
devices: ## Liste les appareils et émulateurs connectés
|
||
$(ADB) devices -l
|
||
|
||
.PHONY: logcat
|
||
logcat: ## Suit les journaux de l'application (Ctrl+C pour arrêter)
|
||
$(ADB) logcat --pid=$$($(ADB) shell pidof $(APPLICATION_ID))
|
||
|
||
.PHONY: crash
|
||
crash: ## Affiche la dernière trace de plantage éventuelle
|
||
@$(ADB) logcat -d -v brief | grep -A 30 -E "FATAL EXCEPTION" | tail -40 || echo "Aucun plantage enregistré"
|
||
|
||
##@ 📤 Publication
|
||
|
||
.PHONY: publish
|
||
publish: _check-apk _check-release-script ## Publie l'APK signé en release Gitea (tag + notes + asset)
|
||
bash $(GITEA_RELEASE) --version $(VERSION) --asset $(OUTPUT_APK)
|
||
|
||
.PHONY: publish-dry
|
||
publish-dry: _check-apk _check-release-script ## Simule la publication sans rien envoyer
|
||
bash $(GITEA_RELEASE) --version $(VERSION) --asset $(OUTPUT_APK) --dry-run
|
||
|
||
.PHONY: deploy
|
||
deploy: release publish ## Construit l'APK signé puis le publie
|
||
|
||
.PHONY: _check-release-script
|
||
_check-release-script:
|
||
@test -f $(GITEA_RELEASE) || \
|
||
{ echo "❌ Script de publication introuvable : $(GITEA_RELEASE)"; \
|
||
echo " Surchargez le chemin : make publish GITEA_RELEASE=/chemin/gitea_release.sh"; exit 1; }
|
||
|
||
.PHONY: _check-apk
|
||
_check-apk:
|
||
@test -f $(OUTPUT_APK) || \
|
||
{ echo "❌ $(OUTPUT_APK) introuvable — lancez d'abord 'make release' (signature requise)."; exit 1; }
|
||
@test $(OUTPUT_APK) -nt VERSION || \
|
||
{ echo "❌ $(OUTPUT_APK) est plus ancien que VERSION — relancez 'make release'."; exit 1; }
|
||
|
||
##@ ℹ️ Aide
|
||
|
||
.PHONY: help
|
||
help: ## Affiche cette aide
|
||
@awk 'BEGIN {FS = ":.*?## "} \
|
||
/^[a-zA-Z0-9_.-]+:.*?##/ { printf " \033[36m%-20s\033[0m %s\n", $$1, $$2 } \
|
||
/^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) }' $(MAKEFILE_LIST)
|
||
@echo ""
|