From 1d4a6f971d8cd6f2b4f3148df3344d48f666a93a Mon Sep 17 00:00:00 2001 From: "jacob.eva" Date: Thu, 8 Aug 2024 15:13:39 +0100 Subject: [PATCH 1/7] Add signing keystore to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index d7d285d..e069988 100644 --- a/.gitignore +++ b/.gitignore @@ -32,3 +32,4 @@ dist docs/build sideband*.egg-info sbapp*.egg-info +key.keystore From 2468f2174a24df96896e993f4546606f73fec904 Mon Sep 17 00:00:00 2001 From: "jacob.eva" Date: Thu, 8 Aug 2024 15:14:43 +0100 Subject: [PATCH 2/7] Correct generated APK name --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 5b8cd31..5fd7907 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ apk: mkdir -p ./dist fetchapk: - cp ./sbapp/bin/sideband-*-release.apk ./dist/ + cp ./sbapp/bin/sideband-*-release-unsigned.apk ./dist/ install: make -C sbapp install From 2914026379c4b7fd4744b376258fef040690a4fc Mon Sep 17 00:00:00 2001 From: "jacob.eva" Date: Thu, 8 Aug 2024 15:15:58 +0100 Subject: [PATCH 3/7] Fix issues with environment not being activated --- sbapp/Makefile | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/sbapp/Makefile b/sbapp/Makefile index 7341ef2..c992834 100644 --- a/sbapp/Makefile +++ b/sbapp/Makefile @@ -1,6 +1,6 @@ all: prepare debug -prepare: activate cleanrns getrns +prepare: cleanrns getrns clean: @echo Cleaning... @@ -11,13 +11,10 @@ clean: -(rm ./bin -r) cleanlibs: - buildozer android clean + . venv/bin/activate; buildozer android clean cleanall: clean cleanlibs -activate: - (. venv/bin/activate) - pacthfiles: patchsdl injectxml patchsdl: @@ -42,7 +39,7 @@ injectxml: cp patches/p4a_build.py .buildozer/android/platform/build-arm64-v8a_armeabi-v7a/dists/sideband/build.py debug: - buildozer android debug + . venv/bin/activate; buildozer android debug prebake: ifneq (,$(wildcard .buildozer/android/platform/build-arm64-v8a_armeabi-v7a/dists/sideband/src/main/res/xml/device_filter.xml)) @@ -50,7 +47,7 @@ ifneq (,$(wildcard .buildozer/android/platform/build-arm64-v8a_armeabi-v7a/dists else @(echo Prebaking build before patching files...) @(sleep 2) - -(buildozer android release) + -(. venv/bin/activate; buildozer android release) @(echo Prebake finished, applying patches and rebuilding...) @(sleep 2) endif @@ -72,7 +69,7 @@ fetchshare: cp ../../dist_archive/Reticulum\ Manual.epub ./share/mirrors/Reticulum_Manual.epub release: - buildozer android release + . venv/bin/activate; buildozer android release postbuild: $(MAKE) cleanrns From f3995a3063f91fdb67eba3e50420e9e426f68393 Mon Sep 17 00:00:00 2001 From: "jacob.eva" Date: Thu, 8 Aug 2024 15:16:35 +0100 Subject: [PATCH 4/7] Create pkg and mirrors if the dirs don't exist --- sbapp/Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sbapp/Makefile b/sbapp/Makefile index c992834..a750259 100644 --- a/sbapp/Makefile +++ b/sbapp/Makefile @@ -55,6 +55,8 @@ endif fetchshare: -(rm ./share/pkg/*) -(rm ./share/mirrors/* -r) + if [ ! -d "./share/pkg" ]; then mkdir ./share/pkg; fi + if [ ! -d "./share/mirrors" ]; then mkdir ./share/mirrors; fi cp ../../dist_archive/rns-*-py3-none-any.whl ./share/pkg/ cp ../../dist_archive/rnspure-*-py3-none-any.whl ./share/pkg/ cp ../../dist_archive/lxmf-*-py3-none-any.whl ./share/pkg/ From ef38488ed141779832001d671807d8628b9c5ab5 Mon Sep 17 00:00:00 2001 From: "jacob.eva" Date: Thu, 8 Aug 2024 15:17:02 +0100 Subject: [PATCH 5/7] Don't fail on nonexistent directories --- sbapp/Makefile | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/sbapp/Makefile b/sbapp/Makefile index a750259..0b6b474 100644 --- a/sbapp/Makefile +++ b/sbapp/Makefile @@ -90,9 +90,11 @@ console: (adb logcat | grep "python\|sidebandservice") getrns: - (cp -rv ../../Reticulum/RNS ./;rm ./RNS/Utilities/RNS) + (cp -rv ../../Reticulum/RNS ./) + -(rm ./RNS/Utilities/RNS) -(rm ./RNS/__pycache__ -r) - (cp -rv ../../LXMF/LXMF ./;rm ./LXMF/Utilities/LXMF) + (cp -rv ../../LXMF/LXMF ./) + -(rm ./LXMF/Utilities/LXMF) -(rm ./LXMF/__pycache__ -r) cleanrns: From 6a187192a5f777aaf1e7510e63da975297a4fb6d Mon Sep 17 00:00:00 2001 From: "jacob.eva" Date: Thu, 8 Aug 2024 15:17:36 +0100 Subject: [PATCH 6/7] Fix AAR not being detected by Gradle --- sbapp/buildozer.spec | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sbapp/buildozer.spec b/sbapp/buildozer.spec index 3e08678..05a65c2 100644 --- a/sbapp/buildozer.spec +++ b/sbapp/buildozer.spec @@ -39,6 +39,8 @@ android.release_artifact = apk android.archs = arm64-v8a,armeabi-v7a #android.logcat_filters = *:S python:D +android.add_gradle_repositories = flatDir { dirs("../../../../../../patches") } + services = sidebandservice:services/sidebandservice.py:foreground android.whitelist = lib-dynload/termios.so android.manifest.intent_filters = patches/intent-filter.xml From 483dfd86530f97e19d26210554da4a987ae03bf4 Mon Sep 17 00:00:00 2001 From: "jacob.eva" Date: Thu, 8 Aug 2024 15:18:24 +0100 Subject: [PATCH 7/7] Add Dockerfile and targets for building in Docker --- Dockerfile | 65 ++++++++++++++++++++++++++++++++++++++++++++++ Makefile | 20 +++++++++++++- docker/dist_env | 2 ++ docker/init.gradle | 21 +++++++++++++++ 4 files changed, 107 insertions(+), 1 deletion(-) create mode 100644 Dockerfile create mode 100644 docker/dist_env create mode 100644 docker/init.gradle diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..52f1dca --- /dev/null +++ b/Dockerfile @@ -0,0 +1,65 @@ +FROM ubuntu:22.04 as build + +# Install dependencies +RUN DEBIAN_FRONTEND=noninteractive \ + apt-get update \ + && DEBIAN_FRONTEND=noninteractive apt-get install -y git libffi-dev python3-dev python3-virtualenv libssl-dev autoconf openjdk-17-jdk cmake libtool libssl-dev libncurses5-dev libsqlite3-dev libreadline-dev libtk8.6 libgdm-dev libdb4o-cil-dev libpcap-dev unzip zip wget apksigner \ + && apt-get install --reinstall python3 + +WORKDIR "/root" + +# Copy Sideband +COPY ./ Sideband/ + +# Copy gradle init file +COPY docker/init.gradle .gradle/ + +# Clone required repos +RUN git clone https://github.com/markqvist/Reticulum \ + && git clone https://github.com/markqvist/LXMF + +# Fetch files required for sideband local repository + +RUN mkdir dist_archive + +WORKDIR "dist_archive" + +# Get latest version of whl packages from PyPI +COPY docker/dist_env . + +RUN export PACKAGENAME=rns; . ./dist_env; wget --content-disposition -q ${DL_URL}; \ + export PACKAGENAME=rnspure; . ./dist_env; wget --content-disposition -q ${DL_URL}; \ + export PACKAGENAME=lxmf; . ./dist_env; wget --content-disposition -q ${DL_URL}; \ + export PACKAGENAME=nomadnet; . ./dist_env; wget --content-disposition -q ${DL_URL}; \ + export PACKAGENAME=rnsh; . ./dist_env; wget --content-disposition -q ${DL_URL}; \ + export PACKAGENAME=sbapp; . ./dist_env; wget --content-disposition -q ${DL_URL}; + +# Get latest RNode Firmware release +RUN export VERSION=$(wget -qO - https://api.github.com/repos/markqvist/RNode_Firmware/releases/latest | grep "zipball_url" | grep -oP "\d+\.\d+"); \ + wget -qO - https://api.github.com/repos/markqvist/RNode_Firmware/releases/latest \ + | grep "zipball_url" | cut -d : -f 2,3 \ + | tr -d \", | wget -qi - -O RNode_Firmware_${VERSION}_Source.zip + +# Get source for reticulum.network and unsigned.io sites +RUN git clone https://github.com/markqvist/reticulum_website reticulum.network \ + && cp reticulum.network/docs/manual/Reticulum\ Manual.pdf . \ + && cp reticulum.network/docs/manual/Reticulum\ Manual.epub . + +# A mirror can also be accessed at https://liberatedsystems.co.uk/unsigned_io_archive.zip if unsigned.io is down! +RUN wget -q https://unsigned.io/unsigned_io_archive.zip \ + && unzip -q unsigned_io_archive.zip -d unsigned.io && rm unsigned_io_archive.zip + + +WORKDIR "../Sideband/sbapp" + +# Set up virtual environment +RUN virtualenv venv + +RUN bash -c "source venv/bin/activate && pip install -U pip && pip install setuptools==60.5 wheel==0.30 buildozer cython" + +WORKDIR "../" + +RUN bash -c "make release" + +FROM scratch as artifact +COPY --from=build /root/Sideband/dist/* / diff --git a/Makefile b/Makefile index 5fd7907..63a0378 100644 --- a/Makefile +++ b/Makefile @@ -33,8 +33,26 @@ build_wheel: release: build_wheel apk fetchapk +release_docker: + -mkdir -p ./dist + @echo If you experience errors, please ensure you have docker-buildx installed on your system. + sudo docker build --target=artifact --output type=local,dest=./dist/ . + @echo Build successful. APK copied to ./dist directory. + $(MAKE) sign_release + +sign_release: + @echo This stage generates a keystore in the root directory of the repo and signs the APK with it. + @echo If a keystore already exists, it is reused. + @echo Please make sure you have apksigner and zipalign installed on your system before proceeding. + @echo Press enter to continue. + @read VOID + if [ ! -f "./key.keystore" ]; then keytool -genkey -v -keystore key.keystore -keyalg RSA -keysize 4096 -validity 10000 -alias app; fi + VERSION=$(shell ls ./dist/*.apk | cut -d\- -f 2 | head -n 1); \ + zipalign -p 4 ./dist/sideband-*-release-unsigned.apk ./dist/sideband-$$VERSION-release.apk; \ + apksigner sign --ks-key-alias app --ks key.keystore ./dist/sideband-$$VERSION-release.apk; \ + upload: @echo Ready to publish release, hit enter to continue @read VOID @echo Uploading to PyPi... - twine upload dist/sbapp-* \ No newline at end of file + twine upload dist/sbapp-* diff --git a/docker/dist_env b/docker/dist_env new file mode 100644 index 0000000..820b7ec --- /dev/null +++ b/docker/dist_env @@ -0,0 +1,2 @@ +export VERSION=$(wget -q https://pypi.org/pypi/${PACKAGENAME}/json -O - | grep -oP "\"version\":\"\d+\.\d+\.+\d+\"" -o | cut -d \" -f 4) +export DL_URL=$(wget -q https://pypi.org/pypi/${PACKAGENAME}/json -O - | grep -oP "\"url\":\".{1,150}${VERSION}-py\d-none-any.whl\"" | cut -d \" -f 4 | head -n -1) diff --git a/docker/init.gradle b/docker/init.gradle new file mode 100644 index 0000000..bf6e34d --- /dev/null +++ b/docker/init.gradle @@ -0,0 +1,21 @@ +// This is necessary to ensure that Sideband can be built on the +// correct API version. Else, the build will fail, with the build tools +// nagging us to upgrade the targetSdkVersion (doing so breaks the +// program currently). Yet another case of G**gle foolishness. This +// just bypasses the error and continues compiling regardless. + +apply plugin: DisableAbortOnError + +class DisableAbortOnError implements Plugin { + void apply (Gradle gradle) { + gradle.allprojects { project -> + afterEvaluate { + android { + lintOptions { + abortOnError = false + } + } + } + } + } +}