gioui-gomobile-example/Makefile
2022-04-15 18:15:31 +02:00

178 lines
5.2 KiB
Makefile

# FIXME Explain wth we're doing
MIN_SDK_VERSION ?= 21
ANDROID_SDK_VERSION ?= 30.0.3
ANDROID_HOME ?= $(HOME)/Android/Sdk
ANDROID_NDK_HOME ?= $(ANDROID_HOME)/ndk/24.0.8215888
MAX_SDK_VERSION ?= 32
GDB_PORT ?= 4334
# Target package name.
ANDROID_PACKAGE ?= gl.entan.giouibind
# Settings for keystore which is used to sign APK.
KEYS_DN=DC=gl,CN=entan
KEYS_PASS=123456
KEYS_VALIDITY=365
KEYS_ALGORITHM=RSA
KEYS_SIZE=2048
# Target build dir. Resulting APK file will be available here.
BUILD_DIR=build
_BUILD_TOOLS=$(ANDROID_HOME)/build-tools/$(ANDROID_SDK_VERSION)
_ANDROID_JAR_PATH=$(ANDROID_HOME)/platforms/android-$(MAX_SDK_VERSION)/android.jar
_SWIFT_SRC=$(shell find ios -iname '*.swift')
_JAVA_SRC=$(shell find android/java -iname '*.java')
_GO_SRC=$(shell find . -iname '*.go')
_JAVA_ROOT_PATH=android/java/$(subst .,/,$(ANDROID_PACKAGE))
_ADB_PATH=$(ANDROID_HOME)/platform-tools/adb
_JARS=build/jars/ble/classes.jar build/jars/go-android/classes.jar
build: build-ios build-android
install-ios: build/ios-app.ipa
ideviceinstaller -i build/ios-app.ipa/giouibind.ipa
ios: build-ios
build-ios: build/ios-app.ipa
android: build-android
build-android: build/android-app.apk
run-android: install-android
$(_ADB_PATH) shell am start -n $(ANDROID_PACKAGE)/.MainActivity
$(_ADB_PATH) shell 'while ! dumpsys window windows | grep -o "$(ANDROID_PACKAGE)" 2>&1 > /dev/null ; do sleep 1 ; done'
debug-android: run-android
#FIXME Delve
$(_ADB_PATH) push $(ANDROID_NDK_HOME)/prebuilt/android-arm64/gdbserver/gdbserver /data/local/tmp
$(_ADB_PATH) shell "chmod 777 /data/local/tmp/gdbserver"
$(_ADB_PATH) forward tcp:$(GDB_PORT) tcp:$(GDB_PORT)
$(_ADB_PATH) shell 'su -c killall gdbserver || exit 0'
$(_ADB_PATH) shell 'su -c set enforce 0'
$(_ADB_PATH) shell 'su -c /data/local/tmp/gdbserver :$(GDB_PORT) --attach $$(ps -A -o NAME,PID | grep "$(ANDROID_PACKAGE)" | cut -F 2)'
install-android: build-android
$(_ADB_PATH) install build/android-app.apk
# Initialize keystore to sign APK.
keys.store:
keytool -genkeypair \
-validity $(KEYS_VALIDITY) \
-keystore $@ \
-keyalg $(KEYS_ALGORITHM) \
-keysize $(KEYS_SIZE) \
-storepass $(KEYS_PASS) \
-keypass $(KEYS_PASS) \
-dname $(KEYS_DN) \
-deststoretype pkcs12
build/Mobile.xcframework: $(_GO_SRC)
CGO_ENABLED=1 GO386=softfloat gomobile bind \
-target ios \
-o "$@" \
github.com/empathicqubit/giouibind/mobile
build/ios-app.ipa: build/ios.xcarchive
xcodebuild -allowProvisioningUpdates -exportArchive -archivePath build/ios.xcarchive -exportOptionsPlist ios/export-options.plist -exportPath "$@"
build/ios.xcarchive: $(_SWIFT_SRC) build/Mobile.xcframework
xcodebuild -project ios/giouibind/giouibind.xcodeproj -scheme giouibind -sdk iphoneos -configuration AppStoreDistribution archive -archivePath "$@"
build/jars/ble/classes.jar:
@mkdir -p build/jars/ble
curl -L -o "build/ble.aar" https://repo1.maven.org/maven2/no/nordicsemi/android/ble/2.4.0/ble-2.4.0.aar
cd build/jars/ble && unzip -o ../../ble.aar
touch "$@"
build/jars/go-android/classes.jar: $(_GO_SRC) $(ANDROID_NDK_HOME)
@mkdir -p build/jars/go-android
CGO_ENABLED=1 ANDROID_NDK_HOME=$(ANDROID_NDK_HOME) GO386=softfloat gomobile bind \
-target android \
-javapkg $(ANDROID_PACKAGE) \
-o "build/go-android.aar" \
github.com/empathicqubit/giouibind/mobile
# Unpack resulting AAR library to link it to APK during further stages.
@unzip -o -qq "build/go-android.aar" -d build/jars/go-android
@ln -sf jars/go-android/jni build/lib
touch "$@"
# Collect resources and generate R.java.
$(_JAVA_ROOT_PATH)/R.java: $(wildcard android/res/*/*.*) android/AndroidManifest.xml $(_ANDROID_JAR_PATH)
$(_BUILD_TOOLS)/aapt package \
-f \
-m \
-J android/java \
-M android/AndroidManifest.xml \
-S android/res \
-I $(_ANDROID_JAR_PATH)
# Generate a JAR suitable for code completion (less java.* classes)
build/jars/android-meta.jar: $(_ANDROID_JAR_PATH)
@mkdir -p build/jars
cp "$(_ANDROID_JAR_PATH)" "$@"
zip -d "$@" 'java/*'
build/obj.jar: build/jars/android-meta.jar $(_JARS) $(_JAVA_SRC) $(_JAVA_ROOT_PATH)/R.java
@mkdir -p build/obj
javac \
-source 8 \
-target 8 \
-d build/obj \
-classpath $(_ANDROID_JAR_PATH):android/java:$(subst $() $(),:,$(_JARS)) \
$(_JAVA_SRC)
jar cvf "$@" -C build/obj/ .
# Convert compiled Java code into DEX file (required by Android).
build/classes.dex: build/d8.jar
$(_BUILD_TOOLS)/dx \
--dex \
--min-sdk-version $(MIN_SDK_VERSION) \
--output build/classes.dex \
build/d8.jar
build/d8.jar: build/obj.jar
$(_BUILD_TOOLS)/d8 \
--output build/d8.jar \
--classpath $(_ANDROID_JAR_PATH) \
$(_JARS) \
build/obj.jar
# Package everything into unaligned APK file.
build/app.apk.unaligned: build/classes.dex
$(_BUILD_TOOLS)/aapt package \
-f \
-m \
-F build/app.apk.unaligned \
-M android/AndroidManifest.xml \
-S android/res \
-I $(_ANDROID_JAR_PATH)
cd build && $(_BUILD_TOOLS)/aapt add \
app.apk.unaligned \
classes.dex \
lib/*/*
# Align unaligned APK file and sign it using keystore.
build/android-app.apk: keys.store build/app.apk.unaligned
$(_BUILD_TOOLS)/zipalign \
-f 4 \
build/app.apk.unaligned \
"$@"
$(_BUILD_TOOLS)/apksigner sign \
--ks keys.store \
--ks-pass pass:$(KEYS_PASS) \
"$@"
clean:
@rm -rf build
@rm -rf $(_JAVA_ROOT_PATH)/R.java