Make a key once, and keep it somewhere safe:
keytool -genkeypair -keystore extensions.jks -alias extensions -keyalg RSA -keysize 4096 -validity 36500
Then build each release, align it, sign it, and read the key's fingerprint:
./gradlew assembleRelease
zipalign -f 4 build/outputs/apk/release/example-comics-release-unsigned.apk example-comics.apk
apksigner sign --ks extensions.jks --ks-key-alias extensions --v4-signing-enabled false example-comics.apk
apksigner verify --print-certs example-comics.apk
zipalign and apksigner are in the Android SDK's build-tools. Of what the last command prints,
the store needs the SHA-256 digest, in the same form: 64 lowercase hexadecimal digits without colons. keytool prints
it in capitals with colons, which matches nothing.
Signer #1 certificate SHA-256 digest: 0ea9de3d5a682608a15b101000c032d5aaae7e12902fc6bf8bb551de1aa00124
Katari installs an extension from a store only if the APK is signed with the store's key, and trusts it without asking for the same reason.