You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
Sander van Grieken acde8cd0b7 add apt --allow-downgrades in more places. 2 years ago
..
p4a_recipes binaries: update python and openssl 2 years ago
Dockerfile add apt --allow-downgrades in more places. 2 years ago
Makefile (trivial) replace URL in comment to include git hash instead of branch 2 years ago
Readme.md android README: (trivial) don't need sudo anymore 2 years ago
apkdiff.py flake8: enable more mandatory tests 2 years ago
apt.preferences android: adapt Dockerfile to use debian bullseye base 2 years ago
apt.sources.list rerun freeze_container_distro.sh and update docker base images for debian buster and bullseye 2 years ago
bitcoin_intent.xml android+osx: add lightning uri handlers 4 years ago
blacklist.txt move android stuff to contrib/android 5 years ago
build.sh contrib: rename some shell scripts to have ".sh" extension 2 years ago
buildozer_kivy.spec android build: bump targetSdkVersion from 30 to 31 2 years ago
buildozer_qml.spec android build: bump targetSdkVersion from 30 to 31 2 years ago
make_apk.sh android: pass keystore password as argument to make_apk. 2 years ago

Readme.md

Kivy GUI

The Kivy GUI is used with Electrum on Android devices. To generate an APK file, follow these instructions.

Android binary with Docker

These binaries should be reproducible, meaning you should be able to generate binaries that match the official releases.

This assumes an Ubuntu (x86_64) host, but it should not be too hard to adapt to another similar system.

  1. Install Docker

    See contrib/docker_notes.md.

  2. Build binaries

    The build script takes a few arguments. To see syntax, run it without providing any:

    $ ./build.sh
    

    For development, consider e.g. $ ./build.sh kivy arm64-v8a debug

    If you want reproducibility, try instead e.g.:

    $ ELECBUILD_COMMIT=HEAD ELECBUILD_NOCACHE=1 ./build.sh kivy all release-unsigned
    
  3. The generated binary is in ./dist.

Verifying reproducibility and comparing against official binary

Every user can verify that the official binary was created from the source code in this repository.

  1. Build your own binary as described above. Make sure you don't build in debug mode, instead use either of release or release-unsigned. If you build in release mode, the apk will be signed, which requires a keystore that you need to create manually (see source of make_apk.sh for an example).
  2. Note that the binaries are not going to be byte-for-byte identical, as the official release is signed by a keystore that only the project maintainers have. You can use the apkdiff.py python script (written by the Signal developers) to compare the two binaries.
    $ python3 contrib/android/apkdiff.py Electrum_apk_that_you_built.apk Electrum_apk_official_release.apk
    

    This should output APKs match!.

FAQ

I changed something but I don't see any differences on the phone. What did I do wrong?

You probably need to clear the cache: rm -rf .buildozer/android/platform/build-*/{build,dists}

How do I deploy on connected phone for quick testing?

Assuming adb is installed:

$ adb -d install -r dist/Electrum-*-arm64-v8a-debug.apk
$ adb shell monkey -p org.electrum.electrum 1

How do I get an interactive shell inside docker?

$ docker run -it --rm \
    -v $PWD:/home/user/wspace/electrum \
    -v $PWD/.buildozer/.gradle:/home/user/.gradle \
    --workdir /home/user/wspace/electrum \
    electrum-android-builder-img

How do I get more verbose logs for the build?

See log_level in buildozer.spec

How can I see logs at runtime?

This should work OK for most scenarios:

adb logcat | grep python

Better grep but fragile because of cut:

adb logcat | grep -F "`adb shell ps | grep org.electrum.electrum | cut -c14-19`"

Kivy can be run directly on Linux Desktop. How?

Install Kivy.

Build atlas: (cd contrib/android/; make theming)

Run electrum with the -g switch: electrum -g kivy

debug vs release build

If you just follow the instructions above, you will build the apk in debug mode. The most notable difference is that the apk will be signed using a debug keystore. If you are planning to upload what you build to e.g. the Play Store, you should create your own keystore, back it up safely, and run ./contrib/make_apk.sh release.

See e.g. kivy wiki and android dev docs.

Access datadir on Android from desktop (e.g. to copy wallet file)

Note that this only works for debug builds! Otherwise the security model of Android does not let you access the internal storage of an app without root. (See this)

$ adb shell
$ run-as org.electrum.electrum ls /data/data/org.electrum.electrum/files/data
$ run-as org.electrum.electrum cp /data/data/org.electrum.electrum/files/data/wallets/my_wallet /sdcard/some_path/my_wallet

Or use Android Studio: "Device File Explorer", which can download/upload data directly from device (via adb).

How to investigate diff between binaries if reproducibility fails?

cd dist/
unzip Electrum-*.apk1 -d apk1
mkdir apk1/assets/private_mp3/
tar -xzvf apk1/assets/private.mp3 --directory apk1/assets/private_mp3/

unzip Electrum-*.apk2 -d apk2
mkdir apk2/assets/private_mp3/
tar -xzvf apk2/assets/private.mp3 --directory apk2/assets/private_mp3/

sudo chown --recursive "$(id -u -n)" apk1/ apk2/
chmod -R +Xr  apk1/ apk2/
$(cd apk1; find -type f -exec sha256sum '{}' \; > ./../sha256sum1)
$(cd apk2; find -type f -exec sha256sum '{}' \; > ./../sha256sum2)
diff sha256sum1 sha256sum2 > d
cat d

How to install apks built by the CI on my phone?

The CI (Cirrus) builds apks on most git commits. See e.g. here. The task name should start with "Android build". Click "View more details on Cirrus CI" to get to cirrus' website, and search for "Artifacts". The apk is built in debug mode, and is signed using an ephemeral RSA key.

For tech demo purposes, you can directly install this apk on your phone. However, if you already have electrum installed on your phone, Android's TOFU signing model will not let you upgrade that to the CI apk due to mismatching signing keys. As the CI key is ephemeral, it is not even possible to upgrade from an older CI apk to a newer CI apk.

However, it is possible to resign the apk manually with one's own key, using e.g. apksigner, mutating the apk in place, after which it should be possible to upgrade:

apksigner sign --ks ~/wspace/electrum/contrib/android/android_debug.keystore Electrum-*-arm64-v8a-debug.apk