Compare commits

..

20 commits

Author SHA1 Message Date
2386b29233 add new branch "native" 2024-10-10 11:56:06 +02:00
947f057649 request manage all files, list files 2024-10-10 02:05:22 +02:00
a2c5d60e17 switch to load html from file (form assets) 2024-10-09 21:36:45 +02:00
dc86fdeb8b add assets folder to app 2024-10-09 21:32:26 +02:00
61c53c1fe4 example webmessage 2024-10-09 20:29:40 +02:00
f6261aebcd test countdowntimer 2024-10-09 18:26:49 +02:00
9a75e30ae0 add apk/result to gitignore 2024-10-09 18:26:16 +02:00
452082de2a fix Makefile $$ issue 2024-10-09 18:24:55 +02:00
f1dcecf971 javascriptinterface in activity itself 2024-10-09 16:23:50 +02:00
51734be9f8 test Thread.sleep 2024-10-09 16:13:30 +02:00
1c4c210091 non-working because JavasBrigde <> Webview thread 2024-10-09 16:03:27 +02:00
8785107ea5 timer , but not working with webview 2024-10-09 15:50:27 +02:00
bf535476ec add to the Webview content, link and javascript test 2024-10-09 09:25:39 +02:00
07ab6c4ab1 fix gitignore 2024-10-09 09:18:45 +02:00
7833f70173 add /example.app.apk to gitignore 2024-10-09 09:17:44 +02:00
6059e20bb5 set default value for YESACCEPT to suppress WARN 2024-10-09 09:17:08 +02:00
b9b9e32b8b improve Makefile and add red warning for missing YESACCEPT=y 2024-10-09 09:16:28 +02:00
703e34f0b4 fix issue with apk being add into itself 2024-10-08 15:44:19 +02:00
033219169b enable javascript in webview 2024-10-08 15:13:06 +02:00
1a1b53aaa6 make a webview with a static local webpage, via "datauri" 2024-10-08 12:00:10 +02:00
22 changed files with 64 additions and 152 deletions

1
.bashrc Normal file
View file

@ -0,0 +1 @@

4
.gitignore vendored
View file

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

View file

@ -1,42 +1,30 @@
FROM archlinux:latest
ARG YESACCEPT=n
RUN echo "this is $YESACCEPT"
RUN pacman -Syu --noconfirm
RUN pacman -S --noconfirm coreutils bash shadow make unzip zip jdk17-openjdk wget
RUN pacman -S --noconfirm coreutils bash shadow make unzip jdk11-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;\
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;\
wget -O cmdline-tools.zip https://dl.google.com/android/repository/commandlinetools-linux-9477386_latest.zip;\
unzip cmdline-tools.zip;\
ls ;\
ls cmdline-tools;\
rm cmdline-tools.zip;\
mv -v cmdline-tools "$BUILD_TOOLS_LATEST" || true
ENV PATH="$PATH:$BUILD_TOOLS_LATEST/bin"
#TODO make this automatic
ENV JAVA_HOME="/usr/lib/jvm/java-17-openjdk/"
ENV JAVA_HOME="/usr/lib/jvm/java-11-openjdk/"
#ENTRYPOINT bash -c 'sleep 10000'
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 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"
#RUN apk add setpriv
COPY entrypoint.sh /entrypoint.sh
RUN chown 0:0 /entrypoint.sh
RUN chmod 0700 /entrypoint.sh

View file

@ -1,43 +0,0 @@
# 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,18 +1,29 @@
# this includes explicit rules
include Makefile.apps
Makefile.apps: Makefile apps
@./Makefile.make.Makefile.apps.sh
apps:
mkdir "$@"
all: build install
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)
build:
docker-compose run --rm compile
ln -sf apk/result/example.app.apk ./; test -e ./example.app.apk || rm ./example.app.apk
docker-compose-build.log: Dockerfile compose.yml
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 down --remove-orphans --rmi all
BUILDKIT_PROGRESS=plain docker-compose build | tee docker-compose-build.log

View file

@ -1,22 +0,0 @@
#!/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,11 +1,28 @@
# Repo allowing -in a KISS way- to create a containered way to build an Android App APK
## brach `no-res.xml`
## 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`
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
@ -27,7 +44,7 @@ This will generate the APK file `./apk/example.app.apk`
this can be installed via `adb`
```
adb install -r ./apk/example.app.apk
adb install -r ./example.app.apk
# or alternative type
make install
```

View file

@ -27,7 +27,6 @@
<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,7 +15,6 @@ all: build
.PHONY : clean
build : ./result/example.app.apk
mv ./result/example.app.apk app.apk
true
env:

View file

@ -1,9 +1,5 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta content="width=device-width,initial-scale=1.0" name="viewport">
</head>
<script>
function sleepit(ms) {
@ -105,7 +101,6 @@ 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>

0
apk/bin/.gitkeep Normal file
View file

1
apk/example.app.apk Symbolic link
View file

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

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,7 +13,6 @@ 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;
@ -158,16 +157,12 @@ 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));
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 intent = new Intent();
intent.setAction(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
//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,9 +0,0 @@
/ToyKey.keystore
/obj
/obj/*
/bin/*
!/bin/.gitkeep
/result
/result/
/result/*
/example.app.apk

View file

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

View file

@ -1,18 +1,8 @@
#!/bin/sh
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 "$*"
cd /apk;
VOLUID="$(stat -c "%u" /apk)";
VOLGID="$(stat -c "%g" /apk)";
CMD="${*:-"make"}"
setpriv --reuid $VOLUID --regid $VOLGID --clear-groups sh -c "$CMD"