LINUX.ORG.RU

Makefile для сборки Love2d под Андроид/AppImage

 , , , ,


2

1

Сидел вот тут ковырялся, пересобирал и пердолился.
Подумал что стоит выложить, дабы другие пердолились поменьше.
Ниже описание, я его для себя писал и ещё ниже сам Makefile. Никаких изысков и красивостей. Собирает и ладно.
Кому надо под себя поправите, а кому не неадо, тому не надо.

- ИСПОЛЬЗОВАТЬ НА СВОЙ СТРАХ И РИСК, Я НЕ НЕСУ НИКАКОЙ ОТВЕТСТВЕННОСТИ
- ВСЁ ПРЕДОСТАВЛЯЕТСЯ КАК ЕСТЬ, ЛЮБЫЕ СОМНЕНИЯ ДОЛЖНЫ ВЕСТИ
- К ОТКАЗУ ОТ ИСПОЛЬЗОВАНИЯ, НЕ ПОНИМАЕШЬ ЧТО ЭТО, НЕ ТРОГАЙ

Love Distrib

Makefile упрощающий создание готовых Love2D сборок c включением вашего приложения позволяет

  • Собрать apk файл для Android
  • Собрать love файл для всех
  • Собрать AppImage файл для Linux x86_64

Положить Makefile в корень Love2D программы и отредактировать

  • app_name=имя программы
  • description=однострочное описание

Для Android дополнительно поправить

  • android_app_version_name=версия.приложения любая
  • android_app_version_code=число целое число

Важно android_app_version_code должно иметь значение
всегда увеличивающееся на 1 при каждой новой сборке, это
требуется для того чтобы при установке на Android apk
файла, уже установленное приложение обновлялось. Иначе
установка не произойдёт с выводом ошибки или вообще без неё.

Теперь однократно нужно развернуть зависимости для Android

  • make android-depends

Предполагается что sudo настроен, нужно установить java и
прочие мелочи, на запрос пароля ввести пароль для sudo затем
будут сгенерированны два ключа подписей и предварительно пароль

  • debug.keystore
  • release.keystore
  • .android_pass

На вопросы всякие можно просто нажимать ENTER, а когда спросят
всё ли верно Is CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown correct? написать yes и снова нажать ENTER. sdkmanager
тоже спросит, Review licenses that have not been accepted (y/N)?
согласны ли вы с условиями предоставления иструментов
для Android SDK/NDK тоже написать y и нажать ENTER
Ключи и пароль можно подменить на свои готовые
(только молю бога не совать основные ЗАТРЁТСЯ МОЖЕТ БЫТЬ!)
Пусть сгенерируется всё само. Суть в том что без подписей пакетов
Android просто молча не установит apk, просто не даст установить.

А вот теперь уже можно, редактировать свой код и пересобирать

  • make lovefile просто обычный app.love
  • make android выполнить сборку app.apk, app.abb
  • make appimage выполнить сборку app.AppImage

Первый раз apk будет собираться долго, но все последующие уже быстро
так как компиляции уже не будет, а просто будут обновляться lua файлики
из проекта. Вроде всё.


Проблемы

  • make android валится с ошибкой Решения
  • Запускать make android ещё раз и ещё раз. Бывает отпускает.
  • Грохнуть java killall java (там несколько процессов может быть) и ещё раз запустить make android
  • Удалить /.love-android-build-dir и заного выполнить
    • make android-depends подготовку зависимостей
    • make android попытку сборки apk

Нельзя отменять сборку через CTRL+C это сломает всё,
придётся вышеописанный квест пройти опять, с большой долей вероятности.
Перемудрёные механизмы системы сборки для Android дают о себе знать. :3

SRC=$(shell pwd)
app_name=appname
description=app short description
##########################################################
android_app_name=$(app_name) for Android
android_app_version_name=0.1
android_app_version_code=1
android_enableJetifier=true
android_useAndroidX=true
android_app_application_id=org.$(app_name).android
android_app_orientation=portrait
#########################################################
SECRET_PASSWORD_FOR_KEYGEN=$(HOME)/.android_pass
#########################################################
android_sign_release=true
##########################################################
DEVELOPMENT_ROOT_DIR=$(HOME)/.love-android-build-dir
DEVELOPMENT_KEYS_DIR=$(HOME)/.love-android-keys-dir
##########################################################
ANDROID_SDK_ROOT_DIR=$(DEVELOPMENT_ROOT_DIR)/ANDROID-SDK/
ANDROID_LOVE_ROOT_DIR=$(DEVELOPMENT_ROOT_DIR)/LOVE-ANDROID/
APPIMAGE_LOVE_ROOT_DIR=$(DEVELOPMENT_ROOT_DIR)/APPIMAGE/
##########################################################
PROPERTIES=$(ANDROID_LOVE_ROOT_DIR)/gradle.properties

all:
	echo "make android-depends - create depends for android apk build"
	echo "make android         - build android apk/aabb pakages"
	echo "make lovefile        - create portable app.love file"
	echo "make appimage        - create portable x86_64 executable file"

android-depends:
	$(MAKE) install-love-android;
	$(MAKE) install-system-depends;
	$(MAKE) install-android-sdk-ndk;
	$(MAKE) generate-android-debug-keys;
	$(MAKE) generate-android-release-keys;

android:
	$(MAKE) generate-android-properties;
	$(MAKE) generate-application-icons;
	$(MAKE) packeges-build;
	$(MAKE) packeges-copy;
ifeq ($(android_sign_release),true)

	$(MAKE) packeges-sign-release;
else
	$(MAKE) packeges-sign-debug;
endif
	$(MAKE) packeges-sign-verify;

lovefile:
	zip -9 -r $(app_name).love . -x Makefile -x ./*.apk -x ./*.aab -x ./*.AppImage


SRC_IMAGE_ICON="NONE"
ifneq ($(wildcard $(SRC)/icon.png),)
SRC_IMAGE_ICON=$(SRC)/icon.png
DST_IMAGE_PATH=$(ANDROID_LOVE_ROOT_DIR)/app/src/main/res/drawable
endif
ifneq ($(wildcard $(SRC)/assets/icon.png),)
SRC_IMAGE_ICON=$(SRC)/assets/icon.png
DST_IMAGE_PATH=$(ANDROID_LOVE_ROOT_DIR)/app/src/main/res/drawable
endif
ifneq ($(wildcard $(SRC)/assets/images/icon.png),)
SRC_IMAGE_ICON=$(SRC)/assets/images/icon.png
DST_IMAGE_PATH=$(ANDROID_LOVE_ROOT_DIR)/app/src/main/res/drawable
endif




appimage:lovefile
	mkdir -p $(APPIMAGE_LOVE_ROOT_DIR);
ifeq ($(wildcard $(APPIMAGE_LOVE_ROOT_DIR)/love-11.5-x86_64.AppImage),)
	wget https://github.com/love2d/love/releases/download/11.5/love-11.5-x86_64.AppImage -O $(APPIMAGE_LOVE_ROOT_DIR)/love-11.5-x86_64.AppImage
	wget https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage  -O $(APPIMAGE_LOVE_ROOT_DIR)/appimagetool-x86_64.AppImage
endif
	cd $(APPIMAGE_LOVE_ROOT_DIR);                       \
	-rm -rd squashfs-root;                              \
	chmod +x love-11.5-x86_64.AppImage;                 \
	chmod +x appimagetool-x86_64.AppImage;              \
	./love-11.5-x86_64.AppImage --appimage-extract;     \
	cat squashfs-root/bin/love $(SRC)/$(app_name).love > squashfs-root/bin/$(app_name); \
	rm  squashfs-root/bin/love;                         \
	chmod +x squashfs-root/bin/$(app_name);             \
	sed 's/love/$(app_name)/g' -i squashfs-root/AppRun; \
	convert $(SRC_IMAGE_ICON) -resize 256x256 squashfs-root/$(app_name).png;  \
	echo ""                                   > squashfs-root/love.desktop;   \
	echo "[Desktop Entry]"                   >> squashfs-root/love.desktop;   \
	echo "Name=$(app_name)"                  >> squashfs-root/love.desktop;   \
	echo "Comment=$(description)"            >> squashfs-root/love.desktop;   \
	echo "MimeType=application/x-love-game;" >> squashfs-root/love.desktop;   \
	echo "Exec=$(app_name) %f"               >> squashfs-root/love.desktop;   \
	echo "Type=Application"                  >> squashfs-root/love.desktop;   \
	echo "Categories=Game;"                  >> squashfs-root/love.desktop;   \
	echo "Terminal=false"                    >> squashfs-root/love.desktop;   \
	echo "Icon=/$(app_name)"                 >> squashfs-root/love.desktop;   \
	echo "NoDisplay=true"                    >> squashfs-root/love.desktop;   \
	./appimagetool-x86_64.AppImage squashfs-root $(SRC)/$(app_name).AppImage;



install-love-android:
	-`git clone --recurse-submodules https://github.com/love2d/love-android/ $(ANDROID_LOVE_ROOT_DIR)`

generate-android-properties:
	echo "" > $(PROPERTIES)
	echo "app.name=$(android_app_name)" >> $(PROPERTIES)
	echo "app.version_name=$(android_app_version_name)" >> $(PROPERTIES)
	echo "app.version_code=$(android_app_version_code)" >> $(PROPERTIES)
	echo "android.enableJetifier=$(android_enableJetifier)" >> $(PROPERTIES)
	echo "android.useAndroidX=$(android_useAndroidX)" >> $(PROPERTIES)
	echo "app.application_id=$(android_app_application_id)" >> $(PROPERTIES)
	echo "app.orientation=$(android_app_orientation)" >> $(PROPERTIES)

install-system-depends:
	sudo apt install imagemagick openjdk-17-jdk openjdk-17-jre-headless sdkmanager

install-android-sdk-ndk:
	mkdir -p $(ANDROID_SDK_ROOT_DIR);                \
	export ANDROID_SDK_ROOT=$(ANDROID_SDK_ROOT_DIR); \
	sdkmanager --install "platforms;android-33";    \
	sdkmanager --install "ndk;23.2.8568313";        \
	sdkmanager --install "platform-tools;33.0.0";   \
	sdkmanager --install "build-tools;33.0.0";      \
	sdkmanager --install "cmdline-tools;latest";    \
	sdkmanager --licenses;

generate-android-debug-keys:
	mkdir -p $(DEVELOPMENT_KEYS_DIR);
ifeq ($(wildcard $(SECRET_PASSWORD_FOR_KEYGEN)),"")
	uuidgen > $(SECRET_PASSWORD_FOR_KEYGEN)
endif
ifeq ($(wildcard $(DEVELOPMENT_KEYS_DIR)/debug.keystore),"")
	keytool -genkey  \
			-v -keystore $(DEVELOPMENT_KEYS_DIR)/debug.keystore \
			-storepass:file   $(SECRET_PASSWORD_FOR_KEYGEN)     \
			-alias debug      \
			-keyalg RSA       \
			-keysize 2048     \
			-validity 100000
endif

generate-android-release-keys:
	mkdir -p $(DEVELOPMENT_KEYS_DIR);
ifeq ($(wildcard $(SECRET_PASSWORD_FOR_KEYGEN)),"")
	uuidgen > $(SECRET_PASSWORD_FOR_KEYGEN)
endif
ifeq ("$(wildcard $(DEVELOPMENT_KEYS_DIR)/release.keystore)","")
	keytool -genkey  \
			-v -keystore $(DEVELOPMENT_KEYS_DIR)/release.keystore \
			-storepass:file  $(SECRET_PASSWORD_FOR_KEYGEN)        \
			-alias release    \
			-keyalg RSA       \
			-keysize 2048     \
			-validity 100000
endif

generate-application-icons:
ifneq ($(SRC_IMAGE_ICON),"NONE")
	convert $(SRC_IMAGE_ICON) -resize 72x72   $(DST_IMAGE_PATH)-hdpi/love.png
	convert $(SRC_IMAGE_ICON) -resize 48x48   $(DST_IMAGE_PATH)-mdpi/love.png
	convert $(SRC_IMAGE_ICON) -resize 96x96   $(DST_IMAGE_PATH)-xhdpi/love.png
	convert $(SRC_IMAGE_ICON) -resize 144x144 $(DST_IMAGE_PATH)-xxhdpi/love.png
	convert $(SRC_IMAGE_ICON) -resize 192x192 $(DST_IMAGE_PATH)-xxxhdpi/love.png
endif

packeges-build:
	rm $(SRC)/*.apk;                                                \
	rm $(SRC)/*.aab;                                                \
	rm $(SRC)/*.love;                                               \
	rm $(SRC)/*.AppImage;                                           \
	export ANDROID_SDK_ROOT=$(ANDROID_SDK_ROOT_DIR);                \
	export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64;            \
	cp /bin/python3 $(HOME)/.local/bin/python;                      \
	rm -rd $(ANDROID_LOVE_ROOT_DIR)/app/src/embed/assets;           \
	mkdir -p $(ANDROID_LOVE_ROOT_DIR)/app/src/embed/assets;         \
	cp -r $(SRC)/* $(ANDROID_LOVE_ROOT_DIR)/app/src/embed/assets;   \
	rm $(ANDROID_LOVE_ROOT_DIR)/app/src/embed/assets/Makefile;      \
	cp $(ANDROID_LOVE_ROOT_DIR)/license.txt $(ANDROID_LOVE_ROOT_DIR)/app/src/embed/assets/love-licenses.txt;\
	cd $(ANDROID_LOVE_ROOT_DIR);                                    \
	chmod +x gradlew;                                               \
	./gradlew assembleNormalRecord;                                 \
	./gradlew assembleEmbedNoRecordRelease;                         \
	./gradlew bundleEmbedNoRecordRelease;

packeges-copy:
	cp $(ANDROID_LOVE_ROOT_DIR)/app/build/outputs/apk/embedNoRecord/release/app-embed-noRecord-release-unsigned.apk $(SRC)/;
	cp $(ANDROID_LOVE_ROOT_DIR)/app/build/outputs/bundle/embedNoRecordRelease/app-embed-noRecord-release.aab $(SRC)/;
	cp $(ANDROID_LOVE_ROOT_DIR)/app/build/outputs/apk/normalRecord/release/app-normal-record-release-unsigned.apk $(SRC)/;

packeges-sign-debug:
	jarsigner -verbose -keystore $(DEVELOPMENT_KEYS_DIR)/debug.keystore -storepass:file  $(SECRET_PASSWORD_FOR_KEYGEN)  $(SRC)/app-embed-noRecord-release-unsigned.apk debug;
	jarsigner -verbose -keystore $(DEVELOPMENT_KEYS_DIR)/debug.keystore -storepass:file  $(SECRET_PASSWORD_FOR_KEYGEN)  $(SRC)/app-embed-noRecord-release.aab debug;
	jarsigner -verbose -keystore $(DEVELOPMENT_KEYS_DIR)/debug.keystore -storepass:file  $(SECRET_PASSWORD_FOR_KEYGEN)  $(SRC)/app-normal-record-release-unsigned.apk debug;

packeges-sign-release:
	jarsigner -verbose -keystore $(DEVELOPMENT_KEYS_DIR)/release.keystore -storepass:file  $(SECRET_PASSWORD_FOR_KEYGEN) $(SRC)/app-embed-noRecord-release-unsigned.apk release;
	jarsigner -verbose -keystore $(DEVELOPMENT_KEYS_DIR)/release.keystore -storepass:file  $(SECRET_PASSWORD_FOR_KEYGEN) $(SRC)/app-embed-noRecord-release.aab release;
	jarsigner -verbose -keystore $(DEVELOPMENT_KEYS_DIR)/release.keystore -storepass:file  $(SECRET_PASSWORD_FOR_KEYGEN) $(SRC)/app-normal-record-release-unsigned.apk release;

packeges-sign-verify:
	jarsigner -verify $(SRC)/app-embed-noRecord-release-unsigned.apk release;
	jarsigner -verify $(SRC)/app-embed-noRecord-release.aab release;
	jarsigner -verify $(SRC)/app-normal-record-release-unsigned.apk release;
.SILENT:all
★★★★★

Последнее исправление: LINUX-ORG-RU (всего исправлений: 6)