Add Nix flake: devShell + hermetic nonRoot debug APK build

- flake.nix: devShells.default (JDK 17 + Android SDK 34 / NDK 27.0.12077973 + Gradle)
  and packages.moonlight-android (assembleNonRootDebug via gradle mitmCache)
- deps.json: offline Maven lockfile (195 artifacts)
- nix-deps-fixup.gradle: skip androidTest variant ambiguity during dep capture
- README: Building with Nix section
This commit is contained in:
Oleks
2026-05-29 15:05:07 +03:00
parent f10085f552
commit d9dedf6f19
7 changed files with 990 additions and 1 deletions
+3
View File
@@ -0,0 +1,3 @@
{
"MD013": false
}
+30
View File
@@ -24,6 +24,36 @@ You can follow development on our [Discord server](https://moonlight-stream.org/
* In moonlight-android/, create a file called local.properties. Add an ndk.dir= property to the local.properties file and set it equal to your NDK directory.
* Build the APK using Android Studio or gradle
## Building with Nix
A `flake.nix` provides a reproducible dev environment and a fully hermetic
debug-APK build (Android SDK 34, NDK 27.0.12077973, Gradle, JDK 17). All
commands need `?submodules=1` so the `moonlight-common-c` + `enet` submodule
sources are included in the build.
```sh
# Dev shell: ANDROID_HOME / ANDROID_NDK_ROOT / JAVA_HOME + gradle, then build by hand
nix develop '.?submodules=1'
./gradlew assembleNonRootDebug
# Hermetic, offline build of the nonRoot debug APK (output in ./result/)
nix build '.?submodules=1#moonlight-android'
ls result/app-nonRoot-debug.apk
```
Maven dependencies are pinned in `deps.json` (a Nixpkgs Gradle mitm-cache
lockfile). Regenerate it after changing dependencies:
```sh
nix build '.?submodules=1#moonlight-android.mitmCache.updateScript' && ./result
```
Notes:
* If your Nix is configured to offload to a remote builder, add `--builders ""`
to build locally instead of copying the multi-GB SDK closure to the remote.
* The build targets the `nonRoot` `debug` variant; it is signed with the
generated Android debug keystore (not a release key).
## Authors
* [Cameron Gutman](https://github.com/cgutman)
+748
View File
@@ -0,0 +1,748 @@
{
"!comment": "This is a nixpkgs Gradle dependency lockfile. For more details, refer to the Gradle section in the nixpkgs manual.",
"!version": 1,
"https://dl.google.com/dl/android/maven2": {
"androidx/databinding#databinding-common/8.5.1": {
"jar": "sha256-Zsq4JjnawPbCQzRkwJOwdNYIxLuIfsOKm4vErJgSZzI=",
"pom": "sha256-4k+S6bAybR+VBRy5+umKG/zS4WGN+QbUI+QDLdiV5VE="
},
"androidx/databinding#databinding-compiler-common/8.5.1": {
"jar": "sha256-K9foi27WtyImLkCZk1s2u6HfexzfL8CpWBj92Sq70ZI=",
"pom": "sha256-KfpSbWLCUOe08jPN9FVmXEsGZeIBwklRewoZp1Tc/M4="
},
"com/android#signflinger/8.5.1": {
"jar": "sha256-wdyixoNjTuGilCmPnHF5V4r2qG4IC9xA+WGRW8XIFC8=",
"pom": "sha256-mMXUJdbmwXv9pgH4Va/7F0gxd4eetbzpOHFfa/jn3X8="
},
"com/android#zipflinger/8.5.1": {
"jar": "sha256-gd1IVhilCaMjWSm56xMJHYhEUmYd5s5aRcw4scVVQhw=",
"pom": "sha256-H61GAd4ulSsxCkf1b1pRNuzb2zaNvsXzU6nQ9toXLDU="
},
"com/android/databinding#baseLibrary/8.5.1": {
"jar": "sha256-eUETcJ2rIbBsJis3lec8twj7rK5hcV80Nh4a9iN6GHA=",
"pom": "sha256-VOPuTKKjm4W4yNy6+AgBKFNXZX/YQN3QiOK1lwa6Cwo="
},
"com/android/tools#annotations/31.5.1": {
"jar": "sha256-slmV+nsiDTX7uOMl3wcfgpFpG/uv+XNMmOOPRewqc+4=",
"pom": "sha256-/C0bM+cvGl2okQQ4Iv1CnuQCkW8wUooGbVhNNMb6KBY="
},
"com/android/tools#common/31.5.1": {
"jar": "sha256-BkyysO4GTXFE0yeaijiytH+oNOGp+wiq0rHSFXeYgLk=",
"pom": "sha256-zJEPF3xQbSxjWRwbRbqPMwrP3R2YBDjI98lNC9DSuAI="
},
"com/android/tools#dvlib/31.5.1": {
"jar": "sha256-XMxJAlggKFBjDFnuy50ppshJuxfxD0ypAX22SfcuSB8=",
"pom": "sha256-e0jh13cxmf7BVC+JSn36NJ3uAadhKYROBaDiJmotoyY="
},
"com/android/tools#repository/31.5.1": {
"jar": "sha256-3yUz4VS3NqCpXkgEiTqlkJlVKEK/ljXNo3Ub6eiUoOI=",
"pom": "sha256-DVjUgWMnrGOvA0mmRFYDBmCCbaVldQ9EOhIuS5N8EZY="
},
"com/android/tools#sdk-common/31.5.1": {
"jar": "sha256-ymaZTQkxZ+OJshMkf0FOb5qUWE23jC5TyUuE+2C2C5o=",
"pom": "sha256-zN6jDCw0rHrX5J2wjkGlR43paf5vHTwyDGD5f/176/E="
},
"com/android/tools#sdklib/31.5.1": {
"jar": "sha256-qHx9labZwynd3oKK8/ITJTFAE1xgoL8CWpEHs8ISPyA=",
"pom": "sha256-gh7xvOfo74t462D+20X7BSGtoGSbBqoF4f24cMO+3Ww="
},
"com/android/tools/analytics-library#crash/31.5.1": {
"jar": "sha256-LFwmQglnZ1wHS8cUCDH+O/9burx/u8CLop/cPq3MlRA=",
"pom": "sha256-OXJrDyPv30HRxITT6LBZ+HVjy1ugDDFIJ9HhIB0Kko8="
},
"com/android/tools/analytics-library#protos/31.5.1": {
"jar": "sha256-F7mgPMS5aU6JAVRQIJ4T0MlYIZHdDqG48pfTbWA3ReY=",
"pom": "sha256-mIdZOvRT0we6namMYk4EnfGXn1DrlZNa0siAPbzNgWE="
},
"com/android/tools/analytics-library#shared/31.5.1": {
"jar": "sha256-Mk/EmDsURpqN8Z+lwswb09H9cpVUgl85EtjfrYuHNNM=",
"pom": "sha256-BiteE6o/oW+2jomPwh+0rDXWLDjAFdTopiuTItbSboY="
},
"com/android/tools/analytics-library#tracker/31.5.1": {
"jar": "sha256-VCxsAHCn32JUBQUy8qFKqdtVU6D8LLID/bp7chUj5xY=",
"pom": "sha256-++t2FU5ccPtD+xyuN8GpRa03y3n+/bxIktbtfijpDDM="
},
"com/android/tools/build#aapt2-proto/8.5.1-11315950": {
"jar": "sha256-LpmLPbtVLPSJump32hatI1R5Qf615WnZ6cPD9xCD58o=",
"module": "sha256-l0TymXwXyKW1KmBsOWK5chqepCZrqbWofrQfI3XsTUg=",
"pom": "sha256-Ss21jf5fpI7XEM9pcd0LusyJP6doMA2WWwfmmbbnIiU="
},
"com/android/tools/build#aaptcompiler/8.5.1": {
"jar": "sha256-Zwo5AhZc8gM7kOZKTb7YSDgJosrn1b7crOODCWDBdv0=",
"module": "sha256-bWaORgSw/1hwnkmwFezs+hLzxSBMrz5W8U6ztvVoJy4=",
"pom": "sha256-HS0jQNZ+2XLBSPKPqKCUpIdvrX7AjAN4mV6o3Uz//l8="
},
"com/android/tools/build#apksig/8.5.1": {
"jar": "sha256-xPb98hSEkClvQip+s3ZH6hHRw7AvHyNJwzziV/PCmx8=",
"pom": "sha256-N5IIT8RbraUNZxfhSQSNRA504lsAbAD2tP2ye9FN/H8="
},
"com/android/tools/build#apkzlib/8.5.1": {
"jar": "sha256-HBpn1vTxhkJ6wWbrqg3YZ/WV1RRPySUlKwX/udGhVrc=",
"pom": "sha256-a3rJuq3ifLcm8yc45sVeoMK63zpg0wIIo91Rwt4t0Eo="
},
"com/android/tools/build#builder-model/8.5.1": {
"jar": "sha256-ubfCzQtmkzIHr0jbd7NiRHYe0hVVxoOEnh5t21zivyc=",
"module": "sha256-QkbxfMXzC+azlxt8q9kIq9Sf7m7XveqB5lxleqa74mg=",
"pom": "sha256-TpxCn+I7+4NkICj92NZeaxC4hRDvxG67McxfdnlXBr4="
},
"com/android/tools/build#builder-test-api/8.5.1": {
"jar": "sha256-xfxT2D6tH0ZHsUw+u2WlRMd3UxYEzx2ARj+Y4YYHNgQ=",
"module": "sha256-PJkpNmfVudrEkqTC7n8/v4/g66ByAiSppfIiZIlAK2A=",
"pom": "sha256-C1ChK0uyXlF8Te2OHso7J1gnX2sheHDymdqHBg7MZlQ="
},
"com/android/tools/build#builder/8.5.1": {
"jar": "sha256-VeG9MUtrQR8lfryVUZEttov+ATcUcZP4SjLHiQ/x18I=",
"module": "sha256-tbou5mIZz6Q1vM7Bp8Jiz2XlmGZi6bL8v5/wQAArGqs=",
"pom": "sha256-zJQrbWRVtbehC+3HGYnYXpYA+3LkA1bUAM3jntnDHzc="
},
"com/android/tools/build#bundletool/1.16.0": {
"jar": "sha256-HqK/UnS7rHo7tWGFIdL6EfsE6QDjOopkYCnsYzL8CMg=",
"pom": "sha256-8uiq1EVaQjckYtXhiiaXPWdXEXmmdX84JfIn6Rry8ts="
},
"com/android/tools/build#gradle-api/8.5.1": {
"jar": "sha256-j99RbDNOCilR5EHF1KoDlkS/7vaey8uAoSAmzEMASek=",
"module": "sha256-bjognnNhBs+OI+nR+A1e81MDhexp+jQUhqG+oOuA6dA=",
"pom": "sha256-rGKHAU+sM7FlBGARgyXeGNCH387V8x4Jo1ck8hrGm0Q="
},
"com/android/tools/build#gradle-settings-api/8.5.1": {
"jar": "sha256-giZMHLRg/72siAls9xdicjQYt5zDMaSeVhtpUN8twa8=",
"module": "sha256-Xpr9vAKvLcxwf40N923uxZxaNsaJI+dQQQbrULoyx3w=",
"pom": "sha256-q69K2m5DEU7ZKKUBEyCVOnUpzSAT2oLBwveh16jI7b0="
},
"com/android/tools/build#gradle/8.5.1": {
"jar": "sha256-A3ovU83V0KLBzGZjLy/nojlFz6+3+cJ0/iKnFuyjp5Y=",
"module": "sha256-/v8j32Cwtb3zRavTBE00oa69u7Bnq/1QlmeD/95a5yE=",
"pom": "sha256-t5/zHvT310fE/wWiJi19gIm8lQQQcpUQgHd8EBcNQ3A="
},
"com/android/tools/build#manifest-merger/31.5.1": {
"jar": "sha256-Wv4OMmOjfBWN1CiLzMqgkVH7tMwgcf1t5wYkKvUYhH0=",
"module": "sha256-D52bVheFKmATMMs4NfTnWe50qlbJUxDBwo539S6yQY8=",
"pom": "sha256-d/VgqPsXO7Jr+wAL+Qx8gaSXEEHuv5d+gekfEasQq8w="
},
"com/android/tools/build/jetifier#jetifier-core/1.0.0-beta10": {
"jar": "sha256-Jqu0oTkn2QYhacUEyelP6A6a46T3tauIdasAdTapH14=",
"module": "sha256-8JF1iaQtJ2Fj8QBAq1hC6RiD3L2x1Iv9Hx/Kpywcp7c=",
"pom": "sha256-XJ1C5rfjXU2NAuCjIs8maTs+w2QrEHyPC+WnIdRaDG0="
},
"com/android/tools/build/jetifier#jetifier-processor/1.0.0-beta10": {
"jar": "sha256-xQZ6e5KCN6EnGl6ctXEOn4C0lzKTlFvFHjpMhk6kv+0=",
"module": "sha256-NsJVdrGZk982AXBSjMYrckbDd3bWFYFUpnzfj8LVjhM=",
"pom": "sha256-M7F/OWmJQEpJF0dIVpvI7fTjmmKkKjXOk9ylwOS6CEI="
},
"com/android/tools/ddms#ddmlib/31.5.1": {
"jar": "sha256-xXHAIk/j5+ZgcZbZXMMUL9wZ8BPo8VEPaMe0pobFOAk=",
"pom": "sha256-HdkRpTji7AzoZ6qd8qtM2B6hvnXl8NuFIajFDMVcP/M="
},
"com/android/tools/layoutlib#layoutlib-api/31.5.1": {
"jar": "sha256-knG/Cz+95l51o+nFh3AbiGXS8AnqFZ8oAbqY27yKw2A=",
"pom": "sha256-AHisaGN+NrAyh66Ux+nJZPZrbvke2TDTqWuksCYuCkA="
},
"com/android/tools/lint#lint-model/31.5.1": {
"jar": "sha256-rls4Rg86WcByWTDXedu7M3LwgDGhpB+qWdn4UAs+RkE=",
"pom": "sha256-We2jbeV5Y5gq2GzW/IAKF/ee270hHslHBk42mpGEcgU="
},
"com/android/tools/lint#lint-typedef-remover/31.5.1": {
"jar": "sha256-W09IUhXKTYbvIxn8OYtfIlHmL1RGvF/Q4AZTZI3d4xg=",
"pom": "sha256-ZMG6kvnO0A2dNczwj9PIiWWCZUYkWHzrD/C1mCEzYqU="
},
"com/android/tools/utp#android-device-provider-ddmlib-proto/31.5.1": {
"jar": "sha256-2p8/Pa4mVEyQZoVJWEdl1YVKh8Ql0s/ld80002AOoJc=",
"pom": "sha256-4wr767lO/YKnYsH0VzVlW2xHK4q+Y2nAWb3UhiH1eaY="
},
"com/android/tools/utp#android-device-provider-gradle-proto/31.5.1": {
"jar": "sha256-rSNCux1vlVY0AKMiST6hwinLk985RPEmG3OZ9xhJQEk=",
"pom": "sha256-iYdBirXnjxs2pt5rwib7h3qjeQ+S6Xg9icB4qD5CSdA="
},
"com/android/tools/utp#android-test-plugin-host-additional-test-output-proto/31.5.1": {
"jar": "sha256-OEUGlN5jKMLEy6aW+cBOzdXOaVI1X2jDoi+VQdHWVG8=",
"pom": "sha256-rdsloP8gn7f5hRXsnI9ClJsnK9SF1OSv+7gvjbVcBhg="
},
"com/android/tools/utp#android-test-plugin-host-apk-installer-proto/31.5.1": {
"jar": "sha256-ztSaykAxqixXtR05CbqBUILlY8HZoka8I+3pc3glJPc=",
"pom": "sha256-x7iXXN3eStKB2KEJujczaNKu+8LmBWe85MG04HZfvGk="
},
"com/android/tools/utp#android-test-plugin-host-coverage-proto/31.5.1": {
"jar": "sha256-77TXAUqqc1UkagfC5DeiIx+yUlQP8bzmhyyI3I2onRI=",
"pom": "sha256-uu3ksHWND1DNWwQZvXaXP3dU5RaueQoP1OVv0ivz9R8="
},
"com/android/tools/utp#android-test-plugin-host-emulator-control-proto/31.5.1": {
"jar": "sha256-rt7F7EYn2JjMzfQtgDjbIOukSVdTxT0bCzeHNEkcr18=",
"pom": "sha256-QPiWAfztmgeT+ThJAd8n7msLLixmtJ6thfawKT3Iiqw="
},
"com/android/tools/utp#android-test-plugin-host-logcat-proto/31.5.1": {
"jar": "sha256-kSkCS9jjg1O8o+sm39jjYo4FjVfW6dhFH/w18BZ1HmM=",
"pom": "sha256-YOxd/ukXyFHuWe6q0D6bZhPfJtNbX8uxbDjU2l7aAqA="
},
"com/android/tools/utp#android-test-plugin-host-retention-proto/31.5.1": {
"jar": "sha256-PbjtOO9JtpTK6kZq4i47Ns7clVezWJ0OB8DN2DKUWRw=",
"pom": "sha256-papZnheulG+JoEQmzmclP581ym21nuan4xNlrGSNwJ4="
},
"com/android/tools/utp#android-test-plugin-result-listener-gradle-proto/31.5.1": {
"jar": "sha256-y99xvKYOFMMOeyz0uQ8PCj6ME498rdh0sNnArgguAnQ=",
"pom": "sha256-3eYSlDB2g3WmtJupWX1AROW5V6fgKHg0JzADaN2axVM="
},
"com/google/testing/platform#core-proto/0.0.9-alpha02": {
"jar": "sha256-bYqJBndBUPQ6j60IymTiXGBww5vYpvwTslk/KJJC/pU=",
"pom": "sha256-J855WUJ6L/7kjQ/rRRKKPzbMQX7YqCKvoigiyPWliyU="
}
},
"https://jitpack.io/com/github": {
"cgutman#ShieldControllerExtensions/1.0.1": {
"module": "sha256-6C1fL60OxxyaoRiGAV/s9QXC+GNUrD0BtFmhxWACpqg=",
"pom": "sha256-P49Bt0XIkSOgXHcLrw8OeDDy2CoteSiO/ZDWaLy0I2w="
},
"cgutman/ShieldControllerExtensions/1.0.1/ShieldControllerExtensions-1.0.1": {
"aar": "sha256-9T3e7fpYTbYNZuEbpnXTIoE7YHBvmyE5dr+VmU/Lc4Q="
}
},
"https://repo.maven.apache.org/maven2": {
"com/android/tools/build#transform-api/2.0.0-deprecated-use-gradle-api": {
"jar": "sha256-6LQVGuFnnxq+ehTuNxrJs8ZRrntjKQ0fWGvdD3j6zpo=",
"pom": "sha256-1J0Xn3B9PzoAsqfTYTa1SqjUT6IncHA82C/lL7OeIus="
},
"com/google/android#annotations/4.1.1.4": {
"jar": "sha256-unNOHoTAnWFa9qCdMwNLTwRC+Hct7BIO+zdthqVlrhU=",
"pom": "sha256-5LtUdTw2onoOXXAVSlA0/t2P6sQoIpUDS/1IPWx6rng="
},
"com/google/api/grpc#proto-google-common-protos/2.17.0": {
"jar": "sha256-TvH+DDJ/wVIdHXU7CxxKh1pUvRTr3tOv/wyjlTILbqk=",
"pom": "sha256-PwKBU6WFxZ9Viz5Dp8mAmmAai7XpEGHWxlj/+iTLjiY="
},
"com/google/auto#auto-parent/6": {
"pom": "sha256-BfdAxmSBZdsAz2GN1WwgDEcl41jm1U9YU+C+wVc06go="
},
"com/google/auto/value#auto-value-annotations/1.6.2": {
"jar": "sha256-tIsE3bpA6KwzvwNvBvxDmV/FCEvZS9qs6AfOJ9O+o/s=",
"pom": "sha256-HHbNRi/JbnqpbccM6C8NVAY9bfFts1ycfZzA0amdP/8="
},
"com/google/auto/value#auto-value-parent/1.6.2": {
"pom": "sha256-J7ZAyCF59c/2IAnAtyAz2bxg9g6ZAqZoAidLf+N/yBw="
},
"com/google/code/findbugs#jsr305/3.0.2": {
"jar": "sha256-dmrSoHg/JoeWLIrXTO7MOKKLn3Ki0IXuQ4t4E+ko0Mc=",
"pom": "sha256-GYidvfGyVLJgGl7mRbgUepdGRIgil2hMeYr+XWPXjf4="
},
"com/google/code/gson#gson-parent/2.10.1": {
"pom": "sha256-QkjgiCQmxhUYI4XWCGw+8yYudplXGJ4pMGKAuFSCuDM="
},
"com/google/code/gson#gson/2.10.1": {
"jar": "sha256-QkHBSncnw0/uplB+yAExij1KkPBw5FJWgQefuU7kxZM=",
"pom": "sha256-0rEVY09cCF20ucn/wmWOieIx/b++IkISGhzZXU2Ujdc="
},
"com/google/crypto/tink#tink/1.7.0": {
"jar": "sha256-iJcKRWoIukxmsBsj5YRsoQlcwU5Uy0g2Pl0uFaEwcwg=",
"pom": "sha256-Ku41I3FfjyzRCyYDyNGeVhrHWDELfiyYU5RtLF57S/c="
},
"com/google/dagger#dagger/2.28.3": {
"jar": "sha256-8d0j+K40qOkTZnI5kerQ1kmdGj6RY85VDCALAtdqhys=",
"pom": "sha256-JlupWajhPDoGEz8EtTkWnBAY2v/U0z9TxFOrTLOG9XA="
},
"com/google/errorprone#error_prone_annotations/2.11.0": {
"pom": "sha256-AmHKAfLS6awq4uznXULFYyOzhfspS2vJQ/Yu9Okt3wg="
},
"com/google/errorprone#error_prone_annotations/2.18.0": {
"jar": "sha256-nmgUy3GBaYik/RsHqZOo8hu3BY1SLBYrHehJ4ZvqVK4=",
"pom": "sha256-kgE1eX3MpZF7WlwBdkKljTQKTNG80S9W+JKlZjvXvdw="
},
"com/google/errorprone#error_prone_annotations/2.3.1": {
"pom": "sha256-PtzmtxG6No7+Frm3qssCFPvWSEFMublllTouftiagZo="
},
"com/google/errorprone#error_prone_parent/2.11.0": {
"pom": "sha256-goPwy0TGJKedMwtv2AuLinFaaLNoXJqVHD3oN9RUBVE="
},
"com/google/errorprone#error_prone_parent/2.18.0": {
"pom": "sha256-R/Iumce/RmOR3vFvg3eYXl07pvW7z2WFNkSAVRPhX60="
},
"com/google/errorprone#error_prone_parent/2.3.1": {
"pom": "sha256-dnUl2agRKc0IGWg4KYAzYye+QWKx4iUaGCkR2qczwSM="
},
"com/google/flatbuffers#flatbuffers-java/1.12.0": {
"jar": "sha256-P4wIi03QSphYch8uFiUIyU2w3Yb5YeMG7mPvLtqHG/c=",
"pom": "sha256-yyJrr1RiYHcPIegVKmqoi6FSMNc591DfSA8qZo1D4Os="
},
"com/google/guava#failureaccess/1.0.1": {
"jar": "sha256-oXHuTHNN0tqDfksWvp30Zhr6typBra8x64Tf2vk2yiY=",
"pom": "sha256-6WBCznj+y6DaK+lkUilHyHtAopG1/TzWcqQ0kkEDxLk="
},
"com/google/guava#guava-parent/26.0-android": {
"pom": "sha256-+GmKtGypls6InBr8jKTyXrisawNNyJjUWDdCNgAWzAQ="
},
"com/google/guava#guava-parent/32.0.1-jre": {
"pom": "sha256-Q+0ONrNT9B5et1zXVmZ8ni35fO8G6xYGaWcVih0DTSo="
},
"com/google/guava#guava/32.0.1-jre": {
"jar": "sha256-vX+iJ1kfuFCWd9DREiz5UVjzuKn0VlP1goHYefbcSMU=",
"pom": "sha256-QsJX9/c203ezGv7u6XirJtcwzXCvYN3nZi4YI1LiSCo="
},
"com/google/guava#listenablefuture/9999.0-empty-to-avoid-conflict-with-guava": {
"jar": "sha256-s3KgN9QjCqV/vv/e8w/WEj+cDC24XQrO0AyRuXTzP5k=",
"pom": "sha256-GNSx2yYVPU5VB5zh92ux/gXNuGLvmVSojLzE/zi4Z5s="
},
"com/google/j2objc#j2objc-annotations/1.3": {
"pom": "sha256-X6yoJLoRW+5FhzAzff2y/OpGui/XdNQwTtvzD6aj8FU="
},
"com/google/j2objc#j2objc-annotations/2.8": {
"jar": "sha256-8CqV+hpele2z7YWf0Pt99wnRIaNSkO/4t03OKrf01u0=",
"pom": "sha256-N/h3mLGDhRE8kYv6nhJ2/lBzXvj6hJtYAMUZ1U2/Efg="
},
"com/google/jimfs#jimfs-parent/1.1": {
"pom": "sha256-xxVVdR5X4O+RKHDorJYlrnglAqalucGcz4OyqX2LJr0="
},
"com/google/jimfs#jimfs/1.1": {
"jar": "sha256-xIKOKNfAqTCvk4dRCzutp9qlwE18Jadce4sIHxwlfd0=",
"pom": "sha256-76huXNki8XtHL9/K5XI02NSsPhSLYlBzffzkVK96ekQ="
},
"com/google/protobuf#protobuf-bom/3.22.3": {
"pom": "sha256-E6Mt+53m/Bw8P3r1Pk1cd/130rR2uuOLdLdYHN7i5lU="
},
"com/google/protobuf#protobuf-java-util/3.22.3": {
"jar": "sha256-xhX3aHncXDA+TfW5Smr6OVNAWMdUXbLUg/2V2fY8i/4=",
"pom": "sha256-tEcBsGoGSGXsm1YUqT6eKPrdfU38S0YPIcgZ71Pb4tY="
},
"com/google/protobuf#protobuf-java/3.22.3": {
"jar": "sha256-WdOI6motLXaujv/3/U0MYMbw9GTD06ub6OWt0JKXVwg=",
"pom": "sha256-GG6nlBUPW0Kup+xgQd83PR2KioMWJPWKVd67YEPscxI="
},
"com/google/protobuf#protobuf-parent/3.22.3": {
"pom": "sha256-OZEz1/b1eTTddsSxjoY0j0JFMhCNr0oByPgguGZfCSk="
},
"com/googlecode/juniversalchardet#juniversalchardet/1.0.3": {
"jar": "sha256-dXv+kGGTuLZR553CbNZ9a1XQdwos37A4FZFQT3edSnY=",
"pom": "sha256-eEY5mzXHzWQqmzoADD4tYtBOs3pFR7aTPMixi8wvCGs="
},
"com/squareup#javapoet/1.10.0": {
"jar": "sha256-IO9LguQ/98ZSKBohMTzzuUEJJGet0/pzUJwm9pae/as=",
"pom": "sha256-FpA0CiIiefLLrfNz6Igm+iD388w+wCUvNoGP7TJwGrE="
},
"com/squareup#javawriter/2.5.0": {
"jar": "sha256-/PsJ+w6gqpfTz+fqeSOYCBNI5GjxJrNgPLOAPyQBl/A=",
"pom": "sha256-4avX8RFs9eDFmUdpPiGJII7JQpayozlMlZ41EdOZp7A="
},
"com/squareup/okhttp3#okhttp/4.12.0": {
"jar": "sha256-sQUAgbFLt6On5VpNPvAbXc+rxFO0VzpPwBl2cZHV9OA=",
"module": "sha256-YH4iD/ghW5Kdgpu/VPMyiU8UWbTXlZea6vy8wc6lTPM=",
"pom": "sha256-fHNwQKlBlSLnxQzAJ0FqcP58dinlKyGZNa3mtBGcfTg="
},
"com/squareup/okio#okio-jvm/3.6.0": {
"jar": "sha256-Z1Q/Bzb8QirpJ+0OUEuYvF4mn9oNNQBXkzfLcT2ihBI=",
"module": "sha256-scIZnhwMyWnvYcu+SvLsr5sGQRvd4By69vyRNN/gToo=",
"pom": "sha256-YbTXxRWgiU/62SX9cFJiDBQlqGQz/TURO1+rDeiQpX8="
},
"com/squareup/okio#okio/3.6.0": {
"module": "sha256-akesUDZOZZhFlAH7hvm2z832N7mzowRbHMM8v0xAghg=",
"pom": "sha256-rrO3CiTBA+0MVFQfNfXFEdJ85gyuN2pZbX1lNpf4zJU="
},
"com/sun/activation#all/1.2.0": {
"pom": "sha256-HYUY46x1MqEE5Pe+d97zfJguUwcjxr2z1ncIzOKwwsQ="
},
"com/sun/activation#all/1.2.1": {
"pom": "sha256-NgiDv2RIbs7xYbjygvZQNTbdGmcNU6Coccj7IBcOZ5U="
},
"com/sun/activation#javax.activation/1.2.0": {
"jar": "sha256-mTMCsWzXBW8h53nMV30XWoELtJAO9zzY+/K1D5KLqc4=",
"pom": "sha256-+Hm26UWFTGkAsNvuHIOE16s95+FX/XrISTdAXEFtKl4="
},
"com/sun/istack#istack-commons-runtime/3.0.8": {
"jar": "sha256-T/q7Br5FSgXkOY4gx3+itjCNS4jfvvfKMKdrW31VBe8=",
"pom": "sha256-wuAU00y4TtKH0GSYbEXDBaQSQiinM37M9sQh0U1wjxw="
},
"com/sun/istack#istack-commons/3.0.8": {
"pom": "sha256-oPBRfoUS8PvMe4KVwS9lZqPQwthtZVY53GYu+MDH6+U="
},
"com/sun/xml/bind#jaxb-bom-ext/2.3.2": {
"pom": "sha256-Gn3sKyfn4FV0TNuM8bkN70/Uc6zRuATv8JgTk1iVm9c="
},
"com/sun/xml/bind/mvn#jaxb-parent/2.3.2": {
"pom": "sha256-IN1tw0q3VJrEDaHYLpIiLsQ0etDsDLEY72xXA77VOhg="
},
"com/sun/xml/bind/mvn#jaxb-runtime-parent/2.3.2": {
"pom": "sha256-sk+NUfGEpovBuG1IwOPP7+shpE7eHF9zA8WK4EiFM+w="
},
"com/sun/xml/bind/mvn#jaxb-txw-parent/2.3.2": {
"pom": "sha256-tV0++psVj0g6MOkseMy2APkzFHM9CJ66m3RDbwGzFKQ="
},
"com/sun/xml/fastinfoset#FastInfoset/1.2.16": {
"jar": "sha256-BW86HhRECfIe0Wr8JoBfWOmiHz/OFUPELUAHGdJQxRE=",
"pom": "sha256-4UfSWKtuZpH3BZmpUkAObmx1WPjJwCjb4b4jF4MI6DA="
},
"com/sun/xml/fastinfoset#fastinfoset-project/1.2.16": {
"pom": "sha256-kFgkJa3B9AtBNi2vuVFzkxIlrKpeeWINXmvVL2Rikro="
},
"commons-codec#commons-codec/1.10": {
"pom": "sha256-vbjbcBLREqbj6o/bfFELMA2Z7/CBnSfd26nEM5fqTPs="
},
"commons-codec#commons-codec/1.11": {
"jar": "sha256-5ZnVMY6Xqkj0ITaikn5t+k6Igd/w5sjjEJ3bv/Ude30=",
"pom": "sha256-wecUDR3qj981KLwePFRErAtUEpcxH0X5gGwhPsPumhA="
},
"commons-io#commons-io/2.13.0": {
"jar": "sha256-Zx6qOWiNrC/6pGRbPJmAri0OokceSual2hmc0VriNmY=",
"pom": "sha256-2z/tZMLhd06/1rGnSQN3MrFJuREd1+a5hfCN2lVHBDk="
},
"commons-logging#commons-logging/1.2": {
"jar": "sha256-2t3qHqC+D1aXirMAa4rJKDSv7vvZt+TmMW/KV98PpjY=",
"pom": "sha256-yRq1qlcNhvb9B8wVjsa8LFAIBAKXLukXn+JBAHOfuyA="
},
"io/grpc#grpc-api/1.57.0": {
"jar": "sha256-jSw4Qpn4Tuiqf2cPAOfLJrh+IxzzCRR0MHsyt2kQ9xw=",
"pom": "sha256-w/BUp8iGFkfQpVglsKlJ9E/PycZPR5CD2WgTgUxQJhI="
},
"io/grpc#grpc-context/1.57.0": {
"jar": "sha256-lT/KzYL1MeabduODT1gwutTCKuhBROBY1x3ICnQwJ10=",
"pom": "sha256-qyZOgr+2q4lfYBavizzERJWryB52nDD6WprgrRa+bMY="
},
"io/grpc#grpc-core/1.57.0": {
"jar": "sha256-O+5IxzvExbVb7Xm+DkhK3ya6Vr675XmN2/NHFO8eHOo=",
"pom": "sha256-gYQEX1eR4Azyzbz16IRq/Uj1z35aTzj7W4MDx7Lv5Vs="
},
"io/grpc#grpc-netty/1.57.0": {
"jar": "sha256-gdQ/LU7Rj6NBvYQKNzXxQDpwB0oEbhV+J/Z5tyG0ya0=",
"pom": "sha256-7Z3917HtQ1avs8XRQH3ttjTIYC+0EEebSArYwROe4Xs="
},
"io/grpc#grpc-protobuf-lite/1.57.0": {
"jar": "sha256-LFB8AtmBuEohdj1E4Jr08nmIHdPiW+MID2NhJYYH8Zg=",
"pom": "sha256-sCO+cAiElIn2Uu7/df0P4aqckF9nHTROFtqv3fkhgZ0="
},
"io/grpc#grpc-protobuf/1.57.0": {
"jar": "sha256-SfmG1OqxJhD9ukpokPylLV62U1mJFv24Y6Nm1eKO7Pc=",
"pom": "sha256-wNy4xn/QHapjJW8Pi2jTcHzrfKhc2qt6PGw/9GDhPdE="
},
"io/grpc#grpc-stub/1.57.0": {
"jar": "sha256-bm7hQVOfoU2fpHn39RFgVUREPH4BHnjic8+UaKoYMGA=",
"pom": "sha256-bURZSHxiHf8xUQqIgpBjYx6RXS3Md01xkoQYEW5ZqI0="
},
"io/netty#netty-buffer/4.1.93.Final": {
"jar": "sha256-AHx9nDeN8C05BWfQ1931Qv/dsCG3MT2/UCOSET/6uwg=",
"pom": "sha256-g/vFTitzuG1Vsgj2GNGioVaRDsFG9+zldWUAe3UK3Xg="
},
"io/netty#netty-codec-http/4.1.93.Final": {
"jar": "sha256-2s94znirLSlXAyXbTNJFHqWJY5gH3pWIGg+nFVqea1U=",
"pom": "sha256-o9r/8HG20oToBj2WhD3iu4PPO4iergzJ4K22SlejG4I="
},
"io/netty#netty-codec-http2/4.1.93.Final": {
"jar": "sha256-2WzAkEWhNBxtR0lDUqomO4e3L7HS6p7KFhqnOCC/6Ls=",
"pom": "sha256-CEQztC1UH3rEtZKH3SUyhc/aOj1l3nLnNou37D02cnE="
},
"io/netty#netty-codec-socks/4.1.93.Final": {
"jar": "sha256-DqR7W6I8odqOuRRsj8dVwScUFGM7Hivizh33ZLoP/yo=",
"pom": "sha256-jNgW7ZkalGBBurTLJL2cjkHuBpJRJRHy2DzvU462Bdc="
},
"io/netty#netty-codec/4.1.93.Final": {
"jar": "sha256-mQw3gWjcY2TG/1aXAfTy8SL//omYs+GJ66TE2GjtEIQ=",
"pom": "sha256-Gc3tJnoHDf8avJ0Cm1UvrSYqzBq6XGxnsiePyhE6Jqs="
},
"io/netty#netty-common/4.1.93.Final": {
"jar": "sha256-RDuzFlmfsW47rrovtYiBgU1/8LevF2/nbjgHGm6G+MA=",
"pom": "sha256-QtiDsT6zjKv1SWFkYsXzMfUzO/DI/JIVdE+DwBgKT2s="
},
"io/netty#netty-handler-proxy/4.1.93.Final": {
"jar": "sha256-KsX3+++gtz73g4iQaTRNVRVQWhSyMDvmk8UALEht8rQ=",
"pom": "sha256-bcUNoOZ/WXgSh0+B6qRUBPfQdrgZnqkIiTKoXBthAkU="
},
"io/netty#netty-handler/4.1.93.Final": {
"jar": "sha256-Tl9WOuFO1xM4GBbVgvX8/QYVrvspIDSGzft4LYoAoCs=",
"pom": "sha256-hKFSXKwLR1nvrvKZekf+Gbm1ZC+Sc/oP1YoudsegWf4="
},
"io/netty#netty-parent/4.1.93.Final": {
"pom": "sha256-sQnLdvN1/tuKnvdaxYBjFw3rfqLd0CT0Zv723GXN/O4="
},
"io/netty#netty-resolver/4.1.93.Final": {
"jar": "sha256-5Zdwtm6Bgi5dERrE5UTX6wxUPgooX1JijlOUGs2O11k=",
"pom": "sha256-WzUMPJHp5V0py+aM/k7yEWzB8DKGd+v59hW6twgsefQ="
},
"io/netty#netty-transport-native-unix-common/4.1.93.Final": {
"jar": "sha256-d0FlocTbqssX+cGtZms1aaallxWugo58PUdwP0eaU+c=",
"pom": "sha256-Fbwltn/wpJJysnDvK4z/1iAFfKFssp3/etVmGtyirhI="
},
"io/netty#netty-transport/4.1.93.Final": {
"jar": "sha256-paeAGbwc1D28PHt83TgBkSyibR9Jj7VgUU/uSXhkupY=",
"pom": "sha256-DdYqDrPLHqABpNBCbk9cCN8ccNkmVnW/+lxYNhNCLUM="
},
"io/perfmark#perfmark-api/0.26.0": {
"jar": "sha256-t9I+k6NFN84zJwgmmg0UBHiKW14ZSegvVTX85Rs+qVs=",
"module": "sha256-MdgyMyR0zkgVD1uuADNDMZE28zav0QdqKJApMZ4+qXo=",
"pom": "sha256-ft7khhbhe2Epfq46gutIOoXlbSVnkpN4qkbzCpUDIto="
},
"jakarta/activation#jakarta.activation-api/1.2.1": {
"jar": "sha256-iwoPUvqLBcVDGSGgY+2GbvqkHa3y46fuPhlh8rDZZFs=",
"pom": "sha256-QlhcsH3afyOqBOteCUAGGUSiRqZ609FpQvvlaf8DzTE="
},
"jakarta/xml/bind#jakarta.xml.bind-api-parent/2.3.2": {
"pom": "sha256-FaVbfVN8n5lwrq0o0q+XwFn2X/YQL3a70p8SR92Kbfs="
},
"jakarta/xml/bind#jakarta.xml.bind-api/2.3.2": {
"jar": "sha256-aRVjBAeb3u2fwK47OTifGbPMS6REO8gFCJlTlOrXQuo=",
"pom": "sha256-tTeziNurTMBpC50vsMdBJNZyUxc0VnrPblMTDqsTGtY="
},
"javax/annotation#javax.annotation-api/1.3.2": {
"jar": "sha256-4EulGVvNVV3JVlD3zGFNFR5LzVLSmhC4qiGX86uJq5s=",
"pom": "sha256-RqSiUcpAbnjkhT16K66DKChEpJkoUUOe6aHyNxbwa5c="
},
"javax/inject#javax.inject/1": {
"jar": "sha256-kcdwRKUMSBY2wy2Rb9ickRinIZU5BFLIEGUID5V95/8=",
"pom": "sha256-lD4SsQBieARjj6KFgFoKt4imgCZlMeZQkh6/5GIai/o="
},
"net/java#jvnet-parent/1": {
"pom": "sha256-KBRAgRJo5l2eJms8yJgpfiFOBPCXQNA4bO60qJI9Y78="
},
"net/java#jvnet-parent/3": {
"pom": "sha256-MPV4nvo53b+WCVqto/wSYMRWH68vcUaGcXyy3FBJR1o="
},
"net/java/dev/jna#jna-platform/5.6.0": {
"jar": "sha256-ns6ovysbOZY5OdGLcEZO72DFCP7Ygg+dyroMNVGOq/c=",
"pom": "sha256-G+s1y0GE5skGp+Murr2FLdPaCiY5YumRNKuUWDI5Tig="
},
"net/java/dev/jna#jna/5.6.0": {
"jar": "sha256-VVfiNaiqL5dm1dxgnWeUjyqIMsLXls6p7x1svgs7fq8=",
"pom": "sha256-X+gbAlWXjyRhbTexBgi3lJil8wc+HZsgONhzaoMfJgg="
},
"net/sf/jopt-simple#jopt-simple/4.9": {
"jar": "sha256-JsWFbpVLX4ZNt28TuGkZtZxu7Pn9kwuWuqiIRia68vU=",
"pom": "sha256-evfi2LJLR5jwTCt9okyfvRt1V7TgF8IFRIFWWRYHkJI="
},
"net/sf/kxml#kxml2/2.3.0": {
"jar": "sha256-8mTdn3mh/eEM5ezFMiHv8kvkyTMcgwt9UvLwintjPeI=",
"pom": "sha256-Mc5gb06VGJNimbsNJ8l4+mHhhf0d58mHT+lZpT40poU="
},
"org/apache#apache/13": {
"pom": "sha256-/1E9sDYf1BI3vvR4SWi8FarkeNTsCpSW+BEHLMrzhB0="
},
"org/apache#apache/15": {
"pom": "sha256-NsLy+XmsZ7RQwMtIDk6br2tA86aB8iupaSKH0ROa1JQ="
},
"org/apache#apache/18": {
"pom": "sha256-eDEwcoX9R1u8NrIK4454gvEcMVOx1ZMPhS1E7ajzPBc="
},
"org/apache#apache/21": {
"pom": "sha256-rxDBCNoBTxfK+se1KytLWjocGCZfoq+XoyXZFDU3s4A="
},
"org/apache#apache/23": {
"pom": "sha256-vBBiTgYj82V3+sVjnKKTbTJA7RUvttjVM6tNJwVDSRw="
},
"org/apache#apache/29": {
"pom": "sha256-PkkDcXSCC70N9jQgqXclWIY5iVTCoGKR+mH3J6w1s3c="
},
"org/apache/commons#commons-compress/1.21": {
"jar": "sha256-auz9VFlyillWAc+gcljRMZcv/Dm0kutIvdWWV3ovJEo=",
"pom": "sha256-Z1uwI8m+7d4yMpSZebl0Kl/qlGKApVobRi1Mp4AQiM0="
},
"org/apache/commons#commons-parent/34": {
"pom": "sha256-Oi5p0G1kHR87KTEm3J4uTqZWO/jDbIfgq2+kKS0Et5w="
},
"org/apache/commons#commons-parent/35": {
"pom": "sha256-cJihq4M27NTJ3CHLvKyGn4LGb2S4rE95iNQbT8tE5Jo="
},
"org/apache/commons#commons-parent/42": {
"pom": "sha256-zTE0lMZwtIPsJWlyrxaYszDlmPgHACNU63ZUefYEsJw="
},
"org/apache/commons#commons-parent/52": {
"pom": "sha256-ddvo806Y5MP/QtquSi+etMvNO18QR9VEYKzpBtu0UC4="
},
"org/apache/commons#commons-parent/58": {
"pom": "sha256-LUsS4YiZBjq9fHUni1+pejcp2Ah4zuy2pA2UbpwNVZA="
},
"org/apache/httpcomponents#httpclient/4.5.14": {
"jar": "sha256-yLx+HFGm1M5y9A0uu6vxxLaL/nbnMhBLBDgbSTR46dY=",
"pom": "sha256-8YNVr0z4CopO8E69dCpH6Qp+rwgMclsgldvE/F2977c="
},
"org/apache/httpcomponents#httpcomponents-client/4.5.14": {
"pom": "sha256-W60d5PEBRHZZ+J0ImGjMutZKaMxQPS1lQQtR9pBKoGE="
},
"org/apache/httpcomponents#httpcomponents-client/4.5.6": {
"pom": "sha256-sEK0HyOR7bANNff05Qmu0hI2SMHSRs5Y0Pe5Bcn+H3M="
},
"org/apache/httpcomponents#httpcomponents-core/4.4.16": {
"pom": "sha256-8tdaLC1COtGFOb8hZW1W+IpAkZRKZi/K8VnVrig9t/c="
},
"org/apache/httpcomponents#httpcomponents-parent/10": {
"pom": "sha256-yq+WfZSvshdT82CCxghiBr0fSIJf9ZaTLM66crZdOfo="
},
"org/apache/httpcomponents#httpcomponents-parent/11": {
"pom": "sha256-qQH4exFcVQcMfuQ+//Y+IOewLTCvJEOuKSvx9OUy06o="
},
"org/apache/httpcomponents#httpcore/4.4.16": {
"jar": "sha256-bJs90UKgncRo4jrTmq1vdaDyuFElEERp8CblKkdORk8=",
"pom": "sha256-PLrYSbNdrP5s7DGtraLGI8AmwyYRQbDSbux+OZxs1/o="
},
"org/apache/httpcomponents#httpmime/4.5.6": {
"jar": "sha256-CysRAsGNPH4Fp3IUubdQGm9gVhdK5WBODiVndu2nVT4=",
"pom": "sha256-37/W/+KnhMqYF8RjZap/ileDILgFveOdb1WgsJ2KqMo="
},
"org/bitbucket/b_c#jose4j/0.9.5": {
"jar": "sha256-gI+zFm8+Z9rZgRwzECmrFoEkL9Urc1vD8z8oEWf8xy4=",
"pom": "sha256-utAkGAobRpy9lOXy2xKEG8rFRD2VRWB/Zzz95nfB2HI="
},
"org/bouncycastle#bcpkix-jdk18on/1.77": {
"jar": "sha256-Gsf+jv1bLzjNwWW+WgZ1c0/kSAjauScHIB8DpTXW8bg=",
"pom": "sha256-j7CSbwLixLLcUuR+uwk/kvHTu28UnCpcyl4qZI0sSY0="
},
"org/bouncycastle#bcprov-jdk18on/1.77": {
"jar": "sha256-2ruYwk1yybn1hWM9HfnFzVjZrTc9DNaBNn5qYDpJXVg=",
"pom": "sha256-rROCz80DvN2L4TkTwC9E/UadCnalPPLK71vhgK3DayM="
},
"org/bouncycastle#bcutil-jdk18on/1.77": {
"jar": "sha256-lHZzvLxajd4tL6aIpbdZjQym4qdKfqMM2T8E9rOtaPg=",
"pom": "sha256-Fj36ZjL/uSinBcqDciNQys6knM1iPOc2RaXMOw+p5ug="
},
"org/checkerframework#checker-qual/2.5.8": {
"pom": "sha256-M6xqDxNBrpZkfH1EZfSqPST+l9Jpe87izq5vyLXvLDw="
},
"org/checkerframework#checker-qual/3.33.0": {
"jar": "sha256-4xYlW7/Nn+UNFlMUuFq7KzPLKmapPEkdtkjkmKgsLeE=",
"module": "sha256-6FIddWJdQScsdn0mKhU6wWPMUFtmZEou9wX6iUn/tOU=",
"pom": "sha256-9VqSICenj92LPqFaDYv+P+xqXOrDDIaqivpKW5sN9gM="
},
"org/codehaus/mojo#animal-sniffer-annotations/1.23": {
"jar": "sha256-n/5Sa/Q6Y0jp2LM7nNb1gKf17tDPBVkTAH7aJj3pdNA=",
"pom": "sha256-VhDbBrczZBrLx6DEioDEAGnbYnutBD+MfI16+09qPSc="
},
"org/codehaus/mojo#animal-sniffer-parent/1.23": {
"pom": "sha256-a38FSrhqh/jiWZ81gIsJiZIuhrbKsTmIAhzRJkCktAQ="
},
"org/codehaus/mojo#mojo-parent/74": {
"pom": "sha256-FHIyWhbwsb2r7SH6SDk3KWSURhApTOJoGyBZ7cZU8rM="
},
"org/eclipse/ee4j#project/1.0.2": {
"pom": "sha256-dJWgenl+iOQ8O8GodCG9ix/FXjIpH6GOTjLYAx3chz8="
},
"org/eclipse/ee4j#project/1.0.5": {
"pom": "sha256-kWtHlNjYIgpZo/32pk2+eUrrIzleiIuBrjaptaLFkaY="
},
"org/glassfish/jaxb#jaxb-bom/2.3.2": {
"pom": "sha256-oQGLtUZ47Z9ayy96QITjhf9RAgH06dv1913GpnX2a+c="
},
"org/glassfish/jaxb#jaxb-runtime/2.3.2": {
"jar": "sha256-5uCh6J+2/3hieeagCC1c71LcLr5nBT0EGABzdlK0/Rs=",
"pom": "sha256-lEilrX+mimCD375PQsjIPggrkgKhBUAfxo6UTCZUizQ="
},
"org/glassfish/jaxb#txw2/2.3.2": {
"jar": "sha256-SmqfSDOI1GG4GqmijGhbi3TAWXmTvxiEsE7dvKlfSP4=",
"pom": "sha256-p53QAvsDgYP/KGomNb4uaMEDuH4OZHF9jUS/0Bf9M+o="
},
"org/jcodec#jcodec/0.2.5": {
"jar": "sha256-iQMp2tEk6Lc5wdZgKlmlPIpHTa3f8mXCVh4hxJhJbIE=",
"pom": "sha256-MPEyx4bSU6cgrLx3P6gApN+yPI65v3aQu7zGqjPU7oo="
},
"org/jdom#jdom2/2.0.6": {
"jar": "sha256-E0XxG6YG0VYD1nQFUajCGUfAIVZAdw7GcnH+eL6pfPU=",
"pom": "sha256-R7I6ef4za3QbgkNMbgSdaBZSVuQF51wQkh/XL6imXY0="
},
"org/jetbrains#annotations/13.0": {
"jar": "sha256-rOKhDcji1f00kl7KwD5JiLLA+FFlDJS4zvSbob0RFHg=",
"pom": "sha256-llrrK+3/NpgZvd4b96CzuJuCR91pyIuGN112Fju4w5c="
},
"org/jetbrains#annotations/23.0.0": {
"jar": "sha256-ew8ZckCCy/y8ZuWr6iubySzwih6hHhkZM+1DgB6zzQU=",
"pom": "sha256-yUkPZVEyMo3yz7z990P1P8ORbWwdEENxdabKbjpndxw="
},
"org/jetbrains/intellij/deps#trove4j/1.0.20200330": {
"jar": "sha256-xf1yW/+rUYRr88d9sTg8YKquv+G3/i8A0j/ht98KQ50=",
"pom": "sha256-h3IcuqZaPJfYsbqdIHhA8WTJ/jh1n8nqEP/iZWX40+k="
},
"org/jetbrains/kotlin#kotlin-reflect/1.9.20": {
"jar": "sha256-SbZvmonVD9KVTC6K6sgOT0iLCgkyKiXvrWJhV2cT3A8=",
"pom": "sha256-lCtehgLTF+wTZS8cAiIFK7kIF/KM9v6dRxEvCbPo5n0="
},
"org/jetbrains/kotlin#kotlin-stdlib-common/1.9.10": {
"jar": "sha256-zeM0G6GKK6JisLfPbFWyDJDo1DTkLJoT5qP3cNuWWog=",
"pom": "sha256-fUtwVHkQZ2s738iSWojztr+yRYLJeEVCgFVEzu9JCpI="
},
"org/jetbrains/kotlin#kotlin-stdlib-jdk7/1.8.21": {
"pom": "sha256-m7EH1dXjkwvFl38AekPNILfSTZGxweUo6m7g8kjxTTY="
},
"org/jetbrains/kotlin#kotlin-stdlib-jdk7/1.9.10": {
"jar": "sha256-rGNhv5rR7TgsIQPZcSxHzewWYjK0kD7VluiHawaBybc=",
"pom": "sha256-x/pnx5YTILidhaPKWaLhjCxlhQhFWV3K5LRq9pRe3NU="
},
"org/jetbrains/kotlin#kotlin-stdlib-jdk7/1.9.20": {
"jar": "sha256-xUUdZ6J/M6/QmRPGfhzro4l65wiEsk7w/3EVflW2CGU=",
"pom": "sha256-AS4cVe1q3kF7y4JBEuvqaCrWJd++4WCFw3nM+hT68DM="
},
"org/jetbrains/kotlin#kotlin-stdlib-jdk8/1.8.21": {
"pom": "sha256-ODnXKNfDCaXDaLAnC0S08ceHj/XKXTKpogT6o0kUWdg="
},
"org/jetbrains/kotlin#kotlin-stdlib-jdk8/1.9.10": {
"jar": "sha256-pMdNlNZM4avlN2D+A4ndlB9vxVjQ2rNeR8CFoR7IDyg=",
"pom": "sha256-X0uU3TBlp3ZMN/oV3irW2B9A1Z+Msz8X0YHGOE+3py4="
},
"org/jetbrains/kotlin#kotlin-stdlib-jdk8/1.9.20": {
"jar": "sha256-+DP8yU8LscMbnni9S9p+oj9Xn/NAiuGpTi61dHCGoqs=",
"pom": "sha256-o7B96wkfKu1Z1lWYhPRPmc/135ufo1okvNa4sGnP9I0="
},
"org/jetbrains/kotlin#kotlin-stdlib/1.8.21": {
"pom": "sha256-/gzZ4yGT5FMzP9Kx9XfmYvtavGkHECu5Z4F7wTEoD9c="
},
"org/jetbrains/kotlin#kotlin-stdlib/1.9.10": {
"jar": "sha256-VemJxRK4CQd5n4VDCfO8d4LFs9E5MkQtA3nVxHJxFQQ=",
"pom": "sha256-fin79z/fceBnnT3ufmgP1XNGT6AWRKT1irgZ0sCI09I="
},
"org/jetbrains/kotlin#kotlin-stdlib/1.9.20": {
"jar": "sha256-KKNbzf9G2GT4DzRqYX5IYoSyCNFzeMQZAN+x3pWpDmw=",
"module": "sha256-3Mql0xVHD6s5IFAohru4Xy2myGECxl2cBEEFRO7bIBk=",
"pom": "sha256-43IWpzLI6Bqf0FtN2JLDDKwMrXtOP9ovlmP0jogHQcA="
},
"org/jmdns#jmdns/3.5.9": {
"jar": "sha256-hoGOY4KgffYBP7sRPTy+7bE22A43cun25HhP8FiN2e8=",
"pom": "sha256-nLQuc1ugkH8azqRHX3voQWYHs1Rpw/5jMDg1XhHh8Ao="
},
"org/junit#junit-bom/5.9.2": {
"module": "sha256-qxN7pajjLJsGa/kSahx23VYUtyS6XAsCVJdyten0zx8=",
"pom": "sha256-LtB9ZYRRMfUzaoZHbJpAVrWdC1i5gVqzZ5uw82819wU="
},
"org/junit#junit-bom/5.9.3": {
"module": "sha256-tAH9JZAeWCpSSqU0PEs54ovFbiSWHBBpvytLv87ka5M=",
"pom": "sha256-TQMpzZ5y8kIOXKFXJMv+b/puX9KIg2FRYnEZD9w0Ltc="
},
"org/jvnet/staxex#stax-ex/1.8.1": {
"jar": "sha256-IFIlSQVunlCqNe8LRFouR6U9Br4LCpRn1wTiSD/7BJo=",
"pom": "sha256-j8hPNs5tps6MiTtlOBmaf2mmmgcG2bF6PuajoJRS7tY="
},
"org/ow2#ow2/1.5.1": {
"pom": "sha256-Mh3bt+5v5PU96mtM1tt0FU1r+kI5HB92OzYbn0hazwU="
},
"org/ow2/asm#asm-analysis/9.6": {
"jar": "sha256-2Sgy18N+3AfGDiVZrGEYsx1kLjN6ZnHty3up+uaO27s=",
"pom": "sha256-+j+ZUCHP9PQTkwbmz/7uoHU5EGRA0psZzAanpjahOFA="
},
"org/ow2/asm#asm-commons/9.6": {
"jar": "sha256-eu/Q1cCQFwHGn3UT/tp2X7a+M68s56oXxXgfyHZXxRE=",
"pom": "sha256-qYrkiVM0uvj/hr1mUWIQ29mgPxpuFeR92oKvz2tT13w="
},
"org/ow2/asm#asm-tree/9.6": {
"jar": "sha256-xD7PF7U5x3fhXae1uGVTs3fi05poPeYoVWfVKDiI5+8=",
"pom": "sha256-G8tIHX/Ba5VbtgygfIz6JCS87ni9xAW7oxx9b13C0RM="
},
"org/ow2/asm#asm-util/9.6": {
"jar": "sha256-xjWnQC9Kqb9msvQjDOpiAloP4c1j6HKa3vybGZT6xMM=",
"pom": "sha256-UsXB01dAR3nRqZtJqFv506CFAluFFstz2+93yK40AF4="
},
"org/ow2/asm#asm/9.6": {
"jar": "sha256-PG+sJCTbPUqFO2afTj0dnDxVIjXhmjGWc/iHCDwjA6E=",
"pom": "sha256-ku7iS8PIQ+SIHUbB3WUFRx7jFC+s+0ZrQoz+paVsa2A="
},
"org/slf4j#slf4j-api/1.7.30": {
"jar": "sha256-zboHlk0btAoHYUhcax6ML4/Z6x0ZxTkorA1/lRAQXFc=",
"pom": "sha256-fgdHdR6bZ+Gdy1IG8E6iLMA9JQxCJCZALq3QNRPywxQ="
},
"org/slf4j#slf4j-api/2.0.7": {
"jar": "sha256-XWKYuToZBcMs2mR4gIrBTC1KR+kVNeU8Qff+64XZRvQ=",
"pom": "sha256-LUA8zw4KAtXBqGZ7DiozyN/GA4qyh7lnHdaBwgUmeYE="
},
"org/slf4j#slf4j-parent/1.7.30": {
"pom": "sha256-EWR5VuSKDFv7OsM/bafoPzQQAraFfv0zWlBbaHvjS3U="
},
"org/slf4j#slf4j-parent/2.0.7": {
"pom": "sha256-wYK7Ns068ck8FgPN/v54iRV9swuotYT0pEU1/NIuRec="
},
"org/sonatype/oss#oss-parent/7": {
"pom": "sha256-tR+IZ8kranIkmVV/w6H96ne9+e9XRyL+kM5DailVlFQ="
},
"org/sonatype/oss#oss-parent/9": {
"pom": "sha256-+0AmX5glSCEv+C42LllzKyGH7G8NgBgohcFO8fmCgno="
},
"org/tensorflow#tensorflow-lite-metadata/0.1.0-rc2": {
"jar": "sha256-LComT4QkmMNtNNKnuRNCSQ2alihiyFuqwazVTsL8ptk=",
"pom": "sha256-mk9eVnQ2bBVskDkWYvA+18WXHWqmODLfdKJx2m/4LpY="
}
}
}
Generated
+27
View File
@@ -0,0 +1,27 @@
{
"nodes": {
"nixpkgs": {
"locked": {
"lastModified": 1779560665,
"narHash": "sha256-tpyBcxPpcQb8ukyNF7DoCwfSY3VPsxHoYwj00Cayv5o=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "64c08a7ca051951c8eae34e3e3cb1e202fe36786",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"root": {
"inputs": {
"nixpkgs": "nixpkgs"
}
}
},
"root": "root",
"version": 7
}
+160
View File
@@ -0,0 +1,160 @@
{
description = "Moonlight game streaming client for Android devShell + hermetic debug-APK build";
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
outputs =
{ self, nixpkgs }:
let
# Android builds run on Linux hosts; the SDK is x86_64/aarch64-linux only.
systems = [
"x86_64-linux"
"aarch64-linux"
];
forAllSystems =
f:
nixpkgs.lib.genAttrs systems (
system:
f (
import nixpkgs {
inherit system;
config = {
allowUnfree = true; # Android SDK components are unfree
android_sdk.accept_license = true;
};
}
)
);
# Pinned to match app/build.gradle exactly.
ndkVersion = "27.0.12077973";
buildToolsVersion = "34.0.0";
platformVersion = "34";
in
{
# Compose the Android SDK once per system, reused by devShell + package.
legacyPackages = forAllSystems (pkgs: {
androidComposition = pkgs.androidenv.composeAndroidPackages {
platformVersions = [ platformVersion ];
buildToolsVersions = [ buildToolsVersion ];
includeNDK = true;
ndkVersions = [ ndkVersion ];
includeEmulator = false;
includeSystemImages = false;
includeSources = false;
};
});
# `nix develop` — JDK 17 + Android SDK/NDK + gradle, ready for `./gradlew`.
devShells = forAllSystems (
pkgs:
let
androidSdk = self.legacyPackages.${pkgs.system}.androidComposition.androidsdk;
sdkRoot = "${androidSdk}/libexec/android-sdk";
in
{
default = pkgs.mkShell {
packages = [
pkgs.jdk17
pkgs.gradle
androidSdk
];
ANDROID_HOME = sdkRoot;
ANDROID_SDK_ROOT = sdkRoot;
ANDROID_NDK_ROOT = "${sdkRoot}/ndk/${ndkVersion}";
JAVA_HOME = pkgs.jdk17.home;
# AGP downloads aapt2 from Maven; that prebuilt won't run on NixOS.
# Point it at the SDK's patched aapt2 instead.
GRADLE_OPTS = "-Dorg.gradle.project.android.aapt2FromMavenOverride=${sdkRoot}/build-tools/${buildToolsVersion}/aapt2";
shellHook = ''
echo "Android SDK: $ANDROID_HOME"
echo "NDK: $ANDROID_NDK_ROOT"
echo "Build the nonRoot debug APK with: ./gradlew assembleNonRootDebug"
'';
};
}
);
# `nix build` — hermetic, offline debug APK build via gradle's mitm-cache.
packages = forAllSystems (
pkgs:
let
androidSdk = self.legacyPackages.${pkgs.system}.androidComposition.androidsdk;
sdkRoot = "${androidSdk}/libexec/android-sdk";
in
{
default = self.packages.${pkgs.system}.moonlight-android;
moonlight-android = pkgs.stdenv.mkDerivation (finalAttrs: {
pname = "moonlight-android";
version = "12.1";
# The repo, including the moonlight-common-c + enet submodules that must
# already be checked out (git submodule update --init --recursive).
src = ./.;
nativeBuildInputs = [
pkgs.gradle
pkgs.jdk17
androidSdk
];
# Offline Maven dependency cache. Regenerate deps.json with:
# nix build .#moonlight-android.mitmCache.updateScript && ./result
mitmCache = pkgs.gradle.fetchDeps {
inherit (finalAttrs) pname;
pkg = finalAttrs.finalPackage;
data = ./deps.json;
};
gradleBuildTask = "assembleNonRootDebug";
ANDROID_HOME = sdkRoot;
ANDROID_SDK_ROOT = sdkRoot;
ANDROID_NDK_ROOT = "${sdkRoot}/ndk/${ndkVersion}";
gradleFlags = [
"-Dorg.gradle.java.home=${pkgs.jdk17.home}"
# Use the SDK's runnable aapt2 instead of the Maven prebuilt.
"-Pandroid.aapt2FromMavenOverride=${sdkRoot}/build-tools/${buildToolsVersion}/aapt2"
# Skip resolving androidTest/test classpaths during dependency capture
# (AGP variant ambiguity on the self-referenced app project).
"--init-script"
"nix-deps-fixup.gradle"
];
postPatch = ''
# Tell Gradle where the SDK lives without relying on env detection.
echo "sdk.dir=${sdkRoot}" > local.properties
'';
# The debug build type auto-signs with a debug keystore that lands in
# $HOME/.android; the build sandbox's HOME is read-only, so redirect it.
preBuild = ''
export ANDROID_USER_HOME="$NIX_BUILD_TOP/.android"
export HOME="$NIX_BUILD_TOP/home"
mkdir -p "$ANDROID_USER_HOME" "$HOME"
'';
doCheck = false;
installPhase = ''
runHook preInstall
mkdir -p "$out"
find app/build/outputs/apk -name '*.apk' -exec cp -v {} "$out/" \;
runHook postInstall
'';
meta = {
description = "Moonlight game streaming client for Android (nonRoot debug APK)";
homepage = "https://github.com/moonlight-stream/moonlight-android";
license = pkgs.lib.licenses.gpl3Only;
platforms = systems;
};
});
}
);
};
}
+21
View File
@@ -0,0 +1,21 @@
// Workaround for the nixpkgs Gradle mitm-cache hook.
//
// The hook's `nixDownloadDeps` task force-resolves every resolvable configuration
// to record all dependencies. AGP's androidTest/test classpaths reference the app
// project itself and cannot disambiguate its published variants, so resolving them
// throws a "cannot choose between the following variants of project :app" error and
// aborts dependency capture.
//
// The hermetic build target is `assembleNonRootDebug`, which never compiles tests,
// so we mark every test configuration as non-resolvable. `nixDownloadDeps` filters
// on `canBeResolved`, so these are simply skipped, and the real build does not touch
// them either.
gradle.projectsLoaded {
rootProject.allprojects { proj ->
proj.afterEvaluate {
proj.configurations
.matching { it.name.toLowerCase().contains("test") }
.all { it.setCanBeResolved(false) }
}
}
}