Сидел вот тут ковырялся, пересобирал и пердолился.
Подумал что стоит выложить, дабы другие пердолились поменьше.
Ниже описание, я его для себя писал и ещё ниже сам Makefile
.
Никаких изысков и красивостей. Собирает и ладно.
Кому надо под себя поправите, а кому не неадо, тому не надо.
- ИСПОЛЬЗОВАТЬ НА СВОЙ СТРАХ И РИСК, Я НЕ НЕСУ НИКАКОЙ ОТВЕТСТВЕННОСТИ
- ВСЁ ПРЕДОСТАВЛЯЕТСЯ КАК ЕСТЬ, ЛЮБЫЕ СОМНЕНИЯ ДОЛЖНЫ ВЕСТИ
- К ОТКАЗУ ОТ ИСПОЛЬЗОВАНИЯ, НЕ ПОНИМАЕШЬ ЧТО ЭТО, НЕ ТРОГАЙ
Love Distrib
Makefile
упрощающий создание готовых Love2D
сборок c включением вашего приложения
позволяет
- Собрать
apk
файл для Android - Собрать
love
файл для всех - Собрать
AppImage
файл для Linuxx86_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