Compare commits

..

14 commits

22 changed files with 152 additions and 64 deletions

View file

@ -1 +0,0 @@

4
.gitignore vendored
View file

@ -1,3 +1,5 @@
*.apk
*.apk.install-log
apk/ToyKey.keystore
apk/obj
apk/obj/*
@ -7,3 +9,5 @@ apk/result/
apk/result/*
apk/bin/!.gitkeep
/example.app.apk
docker-compose-build.log
/Makefile.apps

View file

@ -1,30 +1,42 @@
FROM archlinux:latest
ARG YESACCEPT=n
RUN echo "this is $YESACCEPT"
RUN pacman -Syu --noconfirm
RUN pacman -S --noconfirm coreutils bash shadow make unzip jdk11-openjdk wget
RUN pacman -S --noconfirm coreutils bash shadow make unzip zip jdk17-openjdk wget
ENV ANDROID_SDK_ROOT="/opt/android"
ENV BUILD_TOOLS_LATEST="$ANDROID_SDK_ROOT/cmdline-tools/latest"
RUN BUILD_TOOLS="$(realpath -m "$BUILD_TOOLS_LATEST/..")";\
mkdir -p "$BUILD_TOOLS";\
cd "$BUILD_TOOLS";\
pwd;\
wget -O cmdline-tools.zip https://dl.google.com/android/repository/commandlinetools-linux-9477386_latest.zip;\
unzip cmdline-tools.zip;\
for LATESTTOOLS in \
"$(curl https://developer.android.com/studio#command-line-tools-only | grep -e 'https://dl.google.com/android/repository/commandlinetools-linux-.*_latest.zip' | cut -f2 -d'"')" \
'https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip' ;\
do \
echo "testing to get '$LATESTTOOLS'";\
echo test "${LATESTTOOLS:0:22}" = "https://dl.google.com/" -a "${LATESTTOOLS:(-11)}" = "_latest.zip" ;\
test "${LATESTTOOLS:0:22}" = "https://dl.google.com/" -a "${LATESTTOOLS:(-11)}" = "_latest.zip" || { echo "unsure of URL $LATESTTOOLS correct, skipping it..." >&2; continue; }; \
wget -O cmdline-tools.zip "$LATESTTOOLS" ;\
unzip cmdline-tools.zip && break || { echo "error downloading working cmdline-tools.zip"; exit 1; };\
done;\
ls ;\
ls cmdline-tools;\
rm cmdline-tools.zip;\
mv -v cmdline-tools "$BUILD_TOOLS_LATEST" || true
ENV PATH="$PATH:$BUILD_TOOLS_LATEST/bin"
ENV JAVA_HOME="/usr/lib/jvm/java-11-openjdk/"
#ENTRYPOINT bash -c 'sleep 10000'
#TODO make this automatic
ENV JAVA_HOME="/usr/lib/jvm/java-17-openjdk/"
ENV LIBRARY_PATH="$LIBRARY_PATH:$BUILD_TOOLS_LATEST/lib"
ARG YESACCEPT=n
RUN test "$YESACCEPT" = "y" || { printf "\033[31;1;4m%s\n%s\033[0m " "FAILED TO BUILD CONTAINER: You did not ACCEPT THE UPSTREAM LICENSE" " -> export YESACCEPT=y" >&2; exit 1; }
RUN echo you selected to accept the licenses/TOS
RUN echo you selected to accept the licenses/TOS
RUN echo "$YESACCEPT" | sdkmanager --install "build-tools;33.0.2"
RUN echo "$YESACCEPT" | sdkmanager --install "platforms;android-33"
RUN echo "$YESACCEPT" | sdkmanager --install "ndk;28.0.12433566"
#RUN apk add setpriv
#RUN echo "$YESACCEPT" | sdkmanager --install "system-images;android-33;aosp_atd;x86_64"
#RUN echo "$YESACCEPT" | sdkmanager --install "emulator"
#RUN echo "no" | avdmanager --verbose create avd --force --name "thedevice" --package 'system-images;android-33;aosp_atd;x86_64' --tag "aosp_atd" --abi "x86_64"
#RUN echo "$YESACCEPT" | sdkmanager --install "platform-tools"
COPY entrypoint.sh /entrypoint.sh
RUN chown 0:0 /entrypoint.sh
RUN chmod 0700 /entrypoint.sh

43
IDEAS.TODOS.md Normal file
View file

@ -0,0 +1,43 @@
# Ideas and todos
## 1. EMULATOR: enable a way to have the "sdk emulator" running
this is attempted in the `emulator` branch. Challenges comprise:
* Xorg server must be forwarded (and other stuff like sound etc)
* the emulator itself might need to have `docker .... --device` setup for `/dev/kvm` probably (and at that point it might be
better to have it all run natively inside a VM anyways... (alternative would be nested virutalization)
## 2. BUILD and PACKAGENAME improvements
### status quo: 2 Makefiles (gnu make) are involved,
* a) one being the outer one that uses Makefile.apps as an include and then
* b) an inner one located at `./apps/<app-name>/Makefile`
the inner-one is not "parametrized" and at present has explicit nameing of the android app/ package (i.e. `example.app`),
which comes with the additional negative that one has several files that need to be adjusted, this also being true
because of the "fun that JAVA" naming conventions which basically means that the very least those files all have to
be kept in sync
* `./apps/<app-name>/AndroidManifest.xml`
* `./apps/<app-name>/Makefile`
* `./apps/<app-name>/src/<package-name>/<activity-name>.java`
### goal: attempt to have the `<app-name>`, `<package-name>` and `<package-name>` be abstracted
Ideally make the inner Makefile superfluous
## 3. ALLOW KOTLIN
Since Java was apparently not "good/fancy" enough of maybe "bloated" the hippster did do what they like best
re-invent to garnish personal "pride/achievement" and thus make a unhelpful thing (java) into now 2 unhelpful
things (i.e. Kotlin and Java) super!
However oftentimes now the undesired-yet-existing-kotlin is there and a goal could be to enable it being used.
After all it appears to be a tiny bit less of a boilerplate annoyance...
## 4. ALLOW GRADLEBUILDS
GRADLE is often used as a building system for apps, it would be beneficial to have those build run also
in this `android-docker-app` thing

View file

@ -1,29 +1,18 @@
# this includes explicit rules
include Makefile.apps
Makefile.apps: Makefile apps
@./Makefile.make.Makefile.apps.sh
all: build install
apps:
mkdir "$@"
build:
docker-compose run --rm compile
ln -sf apk/result/example.app.apk ./; test -e ./example.app.apk || rm ./example.app.apk
install: $(shell for APP in apps/*/; do test -d "$$APP" || continue; echo "$$APP""app.apk.install-log"; done)
force-install reinstall:
for APP in apps/*/; do rm -f "$$APP""app.apk.install-log" 2>/dev/null; done; $(MAKE) install
run: $(shell cd apps/; for APP in */; do test -d "$$APP" || continue; echo "run-$${APP%/}"; done)
install:
adb install -r ./example.app.apk
.PHONY: clean-all
clean-all: clean-docker clean-apk
.PHONY: clean-docker
clean-docker:
rm docker-compose-build.log || true
docker-compose down --remove-orphans --rmi all
.PHONY: clean-apk
clean-apk:
cd apk && $(MAKE) clean
docker-compose-build.log: Dockerfile docker-compose.yml
docker-compose-build.log: Dockerfile compose.yml
docker-compose down --remove-orphans --rmi all
BUILDKIT_PROGRESS=plain docker-compose build | tee docker-compose-build.log

22
Makefile.make.Makefile.apps.sh Executable file
View file

@ -0,0 +1,22 @@
#!/bin/bash
(
set -xe
cd apps
for APP in */
do
test -d "$APP" || continue;
APP="${APP%/}";
cat << MAKEFILE
apps/$APP/app.apk: docker-compose-build.log
docker compose run --rm compile $APP
build-$APP: apps/$APP/app.apk
true
apps/$APP/app.apk.install-log: apps/$APP/app.apk
adb install -r $< > \$@ || rm \$@
install-$APP: apps/$APP/app.apk.install-log
true
run-$APP: apps/$APP/app.apk.install-log
adb shell am start -n app.example/.ExampleApp
MAKEFILE
done
) > Makefile.apps

View file

@ -1,28 +1,11 @@
# Repo allowing -in a KISS way- to create a containered way to build an Android App APK
## branchs
### branch `native`
this branch should allow to use the Native Developer Kit to build an app without much java
the content below apk/native are LICENSE MIT
### branch `no-res.xml`
## brach `no-res.xml`
this branch features the exmaple.app to not require the compoletely bogus unneeded requirement
to setup a `./apk/res/layouts/res.xml` file to setup the layout to be used.
Instead a layout is created inline
### branch `webview`
a bra
## changelog
* using https://android.googlesource.com/platform/cts/+/android-7.1.1_r13/tests/tests/webkit/src/android/webkit/cts/PostMessageTest.java derived
webmessage to send data to Javascript/Webview from Java (using a timer)
## tl;dr
@ -44,7 +27,7 @@ This will generate the APK file `./apk/example.app.apk`
this can be installed via `adb`
```
adb install -r ./example.app.apk
adb install -r ./apk/example.app.apk
# or alternative type
make install
```

View file

View file

@ -1 +0,0 @@
./bin/example.app.apk

9
apps/webview/.gitignore vendored Normal file
View file

@ -0,0 +1,9 @@
/ToyKey.keystore
/obj
/obj/*
/bin/*
!/bin/.gitkeep
/result
/result/
/result/*
/example.app.apk

View file

@ -27,6 +27,7 @@
<application android:label="@string/app_name" android:icon="@drawable/ic_launcher">
<activity android:name="app.example.ExampleApp"
android:exported="true"
android:configChanges="orientation|screenSize|keyboardHidden"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

View file

@ -15,6 +15,7 @@ all: build
.PHONY : clean
build : ./result/example.app.apk
mv ./result/example.app.apk app.apk
true
env:

View file

@ -1,5 +1,9 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta content="width=device-width,initial-scale=1.0" name="viewport">
</head>
<script>
function sleepit(ms) {
@ -101,6 +105,7 @@ function divMessage(html){
<a href='https://html5test.co/'>https://html5test.co/</a>
<h1> this is html <h1>
<h2> this is a h2</h2>
<input type=text />
<img src='https://wald.alexmahr.de/images/bear.avif'>
<img src='https://wald.alexmahr.de/images/delphin.avif'>
</html>

View file

Before

Width:  |  Height:  |  Size: 9.2 KiB

After

Width:  |  Height:  |  Size: 9.2 KiB

View file

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

View file

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

View file

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

View file

@ -13,6 +13,7 @@ import android.view.*;
//import android.view.MenuItem;
import android.view.ViewGroup.*;
import android.widget.*;
//import android.widget.Toast;
//import android.widget.TextView;
import android.webkit.*;
import android.net.Uri;
@ -157,12 +158,16 @@ public class ExampleApp extends Activity {
}
}.start();
// Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION, Uri.parse("package: app.example"));// + BuildConfig.APPLICATION_ID));
Intent intent = new Intent();
intent.setAction(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
if(!Environment.isExternalStorageManager()){
Intent intent = new Intent();
intent.setAction(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
Uri uri = Uri.fromParts("package", this.getPackageName(), null);
intent.setData(uri);
startActivity(intent);
} else {
Toast.makeText(this, "berechtigt", Toast.LENGTH_SHORT).show();
}
//intent.setAction(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION);
Uri uri = Uri.fromParts("package", this.getPackageName(), null);
intent.setData(uri);
startActivity(intent);
// startActivityForResult(intent, APP_STORAGE_ACCESS_REQUEST_CODE);
}
@JavascriptInterface

View file

@ -1,10 +1,16 @@
services:
compile:
hostname: android-app-builder
hostname: thinkbox
build:
context: .
args:
YESACCEPT: ${YESACCEPT:-n}
YESACCEPT: ${YESACCEPT:-}
stop_grace_period: 1s
environment:
XAUTHORITY: /root/.Xauthority
DISPLAY: ":0"
volumes:
- ./apk:/apk
- ./apps:/apps
- /home/alex/.Xauthority:/root/.Xauthority:ro

View file

@ -1,8 +1,18 @@
#!/bin/sh
cd /apk;
VOLUID="$(stat -c "%u" /apk)";
VOLGID="$(stat -c "%g" /apk)";
CMD="${*:-"make"}"
setpriv --reuid $VOLUID --regid $VOLGID --clear-groups sh -c "$CMD"
set -x
APKDIR="/apps/$1"
shift
#test -d "$1" ==
#APKDIR=
#cd /apk/$1;
#shift
VOLUID="$(stat -c "%u" "$APKDIR")";
VOLGID="$(stat -c "%g" "$APKDIR")";
#CMD="${*:-"make"}"
cd "$APKDIR"
test -z "$*" && set -- make
setpriv --reuid $VOLUID --regid $VOLGID --clear-groups sh -c "$*"