Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/akavel/hellomello
Experiments with writing Android apps in Nim
https://github.com/akavel/hellomello
android apk dalvik dex hello-world jni minimal nim standalone
Last synced: 3 months ago
JSON representation
Experiments with writing Android apps in Nim
- Host: GitHub
- URL: https://github.com/akavel/hellomello
- Owner: akavel
- License: apache-2.0
- Created: 2019-05-05T11:21:35.000Z (over 5 years ago)
- Default Branch: master
- Last Pushed: 2020-06-20T08:38:39.000Z (over 4 years ago)
- Last Synced: 2024-10-31T14:43:48.597Z (3 months ago)
- Topics: android, apk, dalvik, dex, hello-world, jni, minimal, nim, standalone
- Language: C++
- Size: 85 KB
- Stars: 85
- Watchers: 5
- Forks: 3
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
HelloWorld.apk built with Nim and no Android Studio
===================================================To build the project, you will currently need the following prerequisites:
- [Nim compiler](https://nim-lang.org/install.html)
- [Go compiler](https://golang.org/dl/) (TODO: remove this dependency —
at least provide prebuilt binaries of *apksigner*)
- [Android NDK][ndk] (the elephant in the room...)
- *standalone* toolchain — just
[download][ndk] and unpack
somewhere, no installation required afterwards (still, ~2.5GB unpacked)
- ...and: NO Java, NO JRE, NO Android Studio, NO Android SDK! 🎉[ndk]: https://developer.android.com/ndk/downloads
Build Steps
-----------1. Compile the native JNI code, using Nim + Android NDK:
$ git clone https://github.com/akavel/hellomello
# Edit `nim.cfg`: change `--clang.path=...` to a correct path to clang in your Android NDK directory.
# Also: remove `.cmd` suffixes in `nim.cfg` if you are on Linux.
$ cd hellomello
$ nim c --app:lib --os:android --cpu=arm -d:noSignalHandler --hint[CC]:on hello.nim
$ mkdir lib
$ mkdir lib/armeabi-v7a
$ mv libhello.so lib/armeabi-v7a/libhello-mello.so
$ cd ..2. Assemble the Dalvik bytecode (required to wrap the JNI library), using [dali](https://github.com/akavel/dali):
$ git clone https://github.com/akavel/dali
$ cd dali
$ nim c jni_hello.nim
$ ./jni_hello > ../hellomello/classes.dex
$ cd ..3. Compile the manifest file to binary format, using [marco](https://github.com/akavel/marco):
$ git clone https://github.com/akavel/marco
$ cd marco
$ nimble build
$ cd ../hellomello
$ ../marco/marco < AndroidManifest0.xml > AndroidManifest.xml4. Build an unsigned .apk, using OS-provided zip archiver:
$ zip -r unsigned.apk classes.dex lib/ AndroidManifest.xml
adding: classes.dex (172 bytes security) (deflated 44%)
adding: lib/ (192 bytes security) (stored 0%)
adding: lib/armeabi-v7a/ (192 bytes security) (stored 0%)
adding: lib/armeabi-v7a/libhello-mello.so (172 bytes security) (deflated 60%)
adding: AndroidManifest.xml (172 bytes security) (stored 0%)
$ cd ..5. Sign the .apk, using [apksigner](https://github.com/akavel/apksigner) tool written in Go:
$ git clone https://github.com/akavel/apksigner
$ cd apksigner
$ go build
$ cd ../hellomello
$ ../apksigner/apksigner -i unsigned.apk -o hello.apk -k key.pk8 -c key.x509.pem
$ unzip -l hello.apk
Archive: hello.apk
Length Date Time Name
-------- ---- ---- ----
282 00-00-80 00:00 META-INF/MANIFEST.MF
335 00-00-80 00:00 META-INF/CERT.SF
436 00-00-80 00:00 META-INF/CERT.EC
14 06-05-19 22:30 AndroidManifest.xml
1060 06-05-19 22:29 classes.dex
149348 06-05-19 22:28 lib/armeabi-v7a/libhello-mello.so
-------- -------
151475 6 files6. ...aaand you should have a `hello.apk` file now, **ready to be installed**
on an ARM-based Android device. Worked For Me™... In case of problems
installing or opening the apk on your device, try running `adb logcat` (yep,
that requires Android Studio... or you could try
[python-adb](https://github.com/google/python-adb)). I suggest searching for
"InstallInstall" and "InstallFail" messages, verifier/verification messages,
and Java-like exception stack traces. You're welcome to post your problems as
issues on this repository, but I can't promise I will be able to help you in
any way. We can treat them as "observations" or "reports". Maybe someone else
will come by and suggest some steps for future experimenters.*[/Mateusz Czapliński.](http://akavel.com)*
*2019-05-06*