From 5f5efe31579110c3d91e9c4dad84e2deec70ec36 Mon Sep 17 00:00:00 2001 From: Jules Aguillon Date: Sun, 11 Apr 2021 21:02:03 +0200 Subject: [PATCH] Change build system to make The ant scripts included in the android SDK were removed recently. The alternative is Gradle. Gradle doesn't work well in this app because it's not possible to use Nix to pull dependencies. Gradle will try to patch the SDK. Also, it's very slow. It turns out the required build script is quite simple. --- .gitignore | 5 +- Makefile | 111 +++++++++++++++++++++++++++++++++++++++++++++ ant.properties | 23 ---------- build.xml | 92 ------------------------------------- project.properties | 14 ------ shell.nix | 6 +-- 6 files changed, 114 insertions(+), 137 deletions(-) create mode 100644 Makefile delete mode 100644 ant.properties delete mode 100644 build.xml delete mode 100644 project.properties diff --git a/.gitignore b/.gitignore index 7be3f9a..ea198f3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,2 @@ -local.properties -proguard-project.txt -bin/* -gen/* *.keystore +_build diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..66e251f --- /dev/null +++ b/Makefile @@ -0,0 +1,111 @@ +# Configuration + +PACKAGE_NAME = juloo.keyboard2 + +ANDROID_PLATFORM_VERSION = android-29 +JAVA_VERSION = 1.7 + +SRC_DIR = srcs +ASSETS_DIR = assets +RES_DIR = res + +EXTRA_JARS = + +# / + +debug: _build/$(PACKAGE_NAME).debug.apk +release: _build/$(PACKAGE_NAME).apk + +installd: _build/$(PACKAGE_NAME).debug.apk + adb install "$<" + +.PHONY: release debug installd + +$(shell mkdir -p _build) + +ifndef ANDROID_HOME +$(error ANDROID_HOME not set) +endif + +ANDROID_BUILD_TOOLS = $(lastword $(sort $(wildcard $(ANDROID_HOME)/build-tools/*))) +ANDROID_PLATFORM = $(ANDROID_HOME)/platforms/$(ANDROID_PLATFORM_VERSION) + +ifeq ($(shell [ -d "$(ANDROID_PLATFORM)" ] && echo ok),) +$(error Android platform not found. Want $(ANDROID_PLATFORM_VERSION), \ + found $(notdir $(wildcard $(ANDROID_HOME)/platforms/*))) +endif + +JAVAC_FLAGS = -source $(JAVA_VERSION) -target $(JAVA_VERSION) -encoding utf8 + +# Source files + +MANIFEST_FILE = AndroidManifest.xml +JAVA_FILES = $(shell find $(SRC_DIR) -name '*.java') +RES_FILES = $(shell find $(RES_DIR) -type f) +ASSETS_FILES = $(shell find $(ASSETS_DIR) -type f 2>/dev/null) + +# Align + +_build/%.apk: _build/%.signed-apk + $(ANDROID_BUILD_TOOLS)/zipalign -fp 4 "$<" "$@" + +# Debug signing + +DEBUG_KEYSTORE = _build/debug.keystore +DEBUG_PASSWD = debug0 + +$(DEBUG_KEYSTORE): + echo y | keytool -genkeypair -dname "cn=d, ou=e, o=b, c=ug" \ + -alias debug -keypass $(DEBUG_PASSWD) -keystore "$@" \ + -keyalg rsa -storepass $(DEBUG_PASSWD) -validity 10000 + +_build/%.debug.signed-apk: _build/%.debug.unsigned-apk $(DEBUG_KEYSTORE) + jarsigner -keystore $(DEBUG_KEYSTORE) \ + -storepass $(DEBUG_PASSWD) -keypass $(DEBUG_PASSWD) \ + -signedjar "$@" "$<" debug + +# Debug apk + +_build/$(PACKAGE_NAME).debug.unsigned-apk: AAPT_PACKAGE_FLAGS+=--rename-manifest-package $(PACKAGE_NAME).debug + +# Release signing + +# %-keystore.conf should declare KEYSTORE, KEYNAME and OPTS +# it is interpreted as a shell script +# OPTS can be used to pass -storepass or -keypass options to jarsigner +_build/%.signed-apk: _build/%.unsigned-apk %-keystore.conf + eval `cat $(word 2,$^)` && \ + jarsigner -keystore "$$KEYSTORE" $$OPTS -signedjar "$@" "$<" "$$KEYNAME" + +# Package + +_build/%.unsigned-apk: _build/classes.dex $(MANIFEST_FILE) $(ASSETS_FILES) + $(ANDROID_BUILD_TOOLS)/aapt package -f -M $(MANIFEST_FILE) -S $(RES_DIR) \ + -I $(ANDROID_PLATFORM)/android.jar -F "$@" $(AAPT_PACKAGE_FLAGS) + [ -z "$(ASSETS_FILES)" ] || $(ANDROID_BUILD_TOOLS)/aapt add "$@" $(ASSETS_FILES) + cd $(@D) && $(ANDROID_BUILD_TOOLS)/aapt add $(@F) classes.dex + +# R.java + +GEN_DIR = _build/gen +R_FILE = $(GEN_DIR)/$(subst .,/,$(PACKAGE_NAME))/R.java + +$(R_FILE): $(RES_FILES) $(MANIFEST_FILE) + mkdir -p "$(@D)" + $(ANDROID_BUILD_TOOLS)/aapt package -f -m -S $(RES_DIR) -J $(GEN_DIR) \ + -M $(MANIFEST_FILE) -I $(ANDROID_PLATFORM)/android.jar + +# Compile java classes and build classes.dex + +OBJ_DIR = _build/class +# A$B.class files are ignored +# CLASS_FILES = $(JAVA_FILES:$(SRC_DIR)/%.java=$(OBJ_DIR)/%.class) \ +# $(R_FILE:$(GEN_DIR)/%.java=$(OBJ_DIR)/%.class) + +_build/classes.dex: $(JAVA_FILES) $(R_FILE) + mkdir -p $(OBJ_DIR) + javac -d $(OBJ_DIR) $(JAVAC_FLAGS) \ + -classpath $(ANDROID_PLATFORM)/android.jar:$(EXTRA_JARS) \ + -sourcepath $(SRC_DIR):$(GEN_DIR) \ + $^ + $(ANDROID_BUILD_TOOLS)/dx --dex --output="$@" $(OBJ_DIR) $(subst :, ,$(EXTRA_JARS)) diff --git a/ant.properties b/ant.properties deleted file mode 100644 index 190cdd5..0000000 --- a/ant.properties +++ /dev/null @@ -1,23 +0,0 @@ -# This file is used to override default values used by the Ant build system. -# -# This file must be checked into Version Control Systems, as it is -# integral to the build system of your project. - -# This file is only used by the Ant script. - -# You can use this to override default values such as -# 'source.dir' for the location of your java source folder and -# 'out.dir' for the location of your output folder. -source.dir=srcs - -# You can also use it define how the release builds are signed by declaring -# the following properties: -# 'key.store' for the location of your keystore and -# 'key.alias' for the name of the key to use. -# The password will be asked during the build when you use the 'release' target. - -key.store=release-keys.keystore -key.alias=releasekey - -java.source=1.7 -java.target=1.7 diff --git a/build.xml b/build.xml deleted file mode 100644 index 8e58243..0000000 --- a/build.xml +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/project.properties b/project.properties deleted file mode 100644 index 8218193..0000000 --- a/project.properties +++ /dev/null @@ -1,14 +0,0 @@ -# This file is automatically generated by Android Tools. -# Do not modify this file -- YOUR CHANGES WILL BE ERASED! -# -# This file must be checked in Version Control Systems. -# -# To customize properties used by the Ant build system edit -# "ant.properties", and override values to adapt the script to your -# project structure. -# -# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): -#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt - -# Project target. -target=android-29 diff --git a/shell.nix b/shell.nix index 3f6d853..fc29b4c 100644 --- a/shell.nix +++ b/shell.nix @@ -14,9 +14,7 @@ in pkgs.mkShell { buildInputs = with pkgs; [ - ant openjdk8 android.androidsdk + findutils openjdk8 android.androidsdk ]; - shellHook = '' - export ANDROID_HOME=${android.androidsdk}/libexec/android-sdk - ''; + ANDROID_HOME = "${android.androidsdk}/libexec/android-sdk"; }