Сидел вот тут ковырялся, пересобирал и пердолился.
Подумал что стоит выложить, дабы другие пердолились поменьше.
Ниже описание, я его для себя писал и ещё ниже сам 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.keystorerelease.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.lovemake androidвыполнить сборкуapp.apk,app.abbmake appimageвыполнить сборкуapp.AppImage
Первый раз apk будет собираться долго, но все последующие уже быстро
так как компиляции уже не будет, а просто будут обновляться lua файлики
из проекта. Вроде всё.
Проблемы
make androidвалится с ошибкой Решения- Запускать
make androidещё раз и ещё раз. Бывает отпускает. - Грохнуть
javakillall 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



