diff options
| -rw-r--r-- | app/build.gradle | 47 | ||||
| -rw-r--r-- | app/proguard-rules.pro | 2 | ||||
| -rw-r--r-- | app/src/main/assets/THIRD_PARTY_NOTICES | 59 | ||||
| -rwxr-xr-x | scripts/build-apk | 29 | ||||
| -rwxr-xr-x | scripts/check | 10 | ||||
| -rwxr-xr-x | scripts/check-server | 39 | ||||
| -rwxr-xr-x | scripts/check-wrapper | 2 | ||||
| -rwxr-xr-x | scripts/fetch-vendor | 4 | ||||
| -rw-r--r-- | settings.gradle | 13 | ||||
| -rwxr-xr-x | test | 14 | ||||
| -rw-r--r-- | test-rig/Dockerfile | 27 | ||||
| -rw-r--r-- | test-rig/sdk-packages-e2e.txt | 2 | ||||
| -rw-r--r-- | test-rig/sdk-packages.txt | 2 | ||||
| -rw-r--r-- | vendor/libadb-android/LICENSES/LGPL-3.0 | 162 | ||||
| -rw-r--r-- | vendor/libadb-android/libadb/build.gradle | 2 |
15 files changed, 379 insertions, 35 deletions
diff --git a/app/build.gradle b/app/build.gradle index d0913be..476f3d8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,6 +2,8 @@ plugins { id 'com.android.application' } +import java.security.MessageDigest + android { namespace 'invalid.lena.scrcpy' compileSdk 35 @@ -95,6 +97,7 @@ android { 'META-INF/androidx/**', 'META-INF/kotlin-stdlib*', 'org/bouncycastle/pqc/crypto/picnic/**', + 'org/bouncycastle/pqc/legacy/picnic/**', 'org/bouncycastle/x509/CertPathReviewerMessages*.properties', 'kotlin/**', ] @@ -105,6 +108,10 @@ android { // classpath; let them return defaults instead of throwing. unitTests.returnDefaultValues = true } + + sourceSets { + main.assets.srcDir '../vendor/libadb-android/LICENSES' + } } dependencies { @@ -113,7 +120,7 @@ dependencies { // need it on the compile classpath too for Adb.java's ASN.1 // cert-builder. :adb keeps it 'implementation'-scoped upstream so // we declare it explicitly here rather than patch the vendor tree. - implementation 'org.bouncycastle:bcprov-jdk15to18:1.81' + implementation 'org.bouncycastle:bcprov-jdk15to18:1.84' // Bundled Conscrypt. libadb-android's TLS pairing exports keying // material via Conscrypt. Without a bundled copy it reflects into the @@ -128,3 +135,41 @@ dependencies { testImplementation 'junit:junit:4.13.2' testImplementation 'org.json:json:20240303' } + +def serverJar = file('src/main/assets/scrcpy-server.jar') +def serverSum = file('src/main/assets/scrcpy-server.sha256') +def serverVersion = file('src/main/assets/scrcpy-server.version') +def expectedServerSum = providers.gradleProperty('scrcpyServerSha256') + .orElse(providers.provider { serverSum.text.trim() }) + +tasks.register('verifyScrcpyServer') { + inputs.files(serverJar, serverSum, serverVersion) + inputs.property('expectedChecksum', expectedServerSum) + doLast { + if (!serverJar.isFile() || !serverSum.isFile() || !serverVersion.isFile()) { + throw new GradleException('scrcpy server assets are incomplete; run scripts/update-server') + } + def expected = expectedServerSum.get() + def version = serverVersion.text.trim() + if (!(expected ==~ /[0-9a-f]{64}/) || version.isEmpty()) { + throw new GradleException('scrcpy server checksum or version is invalid') + } + def digest = MessageDigest.getInstance('SHA-256') + serverJar.withInputStream { input -> + byte[] buffer = new byte[64 * 1024] + for (int n; (n = input.read(buffer)) >= 0; ) { + if (n > 0) digest.update(buffer, 0, n) + } + } + def actual = digest.digest().encodeHex().toString() + if (actual != expected) { + throw new GradleException("scrcpy server checksum mismatch: expected ${expected}, got ${actual}") + } + } +} + +tasks.configureEach { task -> + if (task.name.startsWith('merge') && task.name.endsWith('Assets')) { + task.dependsOn tasks.named('verifyScrcpyServer') + } +} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index a2c74bf..5c99914 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -31,7 +31,7 @@ -keep class org.conscrypt.** { *; } -dontwarn org.conscrypt.** -dontwarn com.android.org.conscrypt.** -# Legacy Apache Harmony JSSE; unreachable on minSdk 35 but +# Legacy Apache Harmony JSSE; unreachable on minSdk 31 but # referenced in libadb's PRNGFixes. -dontwarn org.apache.harmony.** diff --git a/app/src/main/assets/THIRD_PARTY_NOTICES b/app/src/main/assets/THIRD_PARTY_NOTICES new file mode 100644 index 0000000..6dfcad2 --- /dev/null +++ b/app/src/main/assets/THIRD_PARTY_NOTICES @@ -0,0 +1,59 @@ +scrcpy-android third-party notices +================================== + +This application includes the following open-source components. Complete +corresponding source is available from the listed versioned source URLs. + +libadb-android 3.1.1 +-------------------- +Copyright 2021 Muntashir Al-Islam and contributors. +Licensed under GPL-3.0-or-later OR Apache-2.0; this application uses the +Apache-2.0 option. Portions retain BSD-3-Clause and MIT notices. +Source: https://github.com/MuntashirAkon/libadb-android/tree/3.1.1 + +SPAKE2-Java / spake2-android 2.2.1 +---------------------------------- +Copyright 2021 Muntashir Al-Islam and contributors. +Licensed under LGPL-3.0-only. The Android artifact contains spake2-c and +components under LGPL-3.0-or-later, LGPL-2.1-or-later, Apache-2.0, ISC, MIT, +and public-domain terms. +Source: https://github.com/MuntashirAkon/spake2-java/tree/2.2.1 +Native source: https://github.com/MuntashirAkon/spake2-c/tree/0d15933e5ba3e662cb01245a7ac0dc9fca3eac31 +License: https://www.gnu.org/licenses/lgpl-3.0.txt + +The application source and build scripts needed to replace this library with +a modified compatible version and rebuild the application are available at: +https://codeberg.org/0xlena/scrcpy-android + +Reverse engineering for debugging modifications to LGPL-covered components +is permitted. + +Bouncy Castle Provider 1.84 +--------------------------- +Copyright 2000-2023 The Legion of the Bouncy Castle Inc. +Licensed under the MIT license. +Source: https://github.com/bcgit/bc-java/tree/r1rv84 + +Conscrypt Android 2.5.2 +----------------------- +Copyright 2016 The Android Open Source Project. +Licensed under Apache-2.0. Contains modified portions of Netty and Apache +Harmony under Apache-2.0. +Source: https://github.com/google/conscrypt/tree/2.5.2 +Notice: https://github.com/google/conscrypt/blob/2.5.2/NOTICE + +AndroidX Annotation 1.9.1 +------------------------- +Copyright The Android Open Source Project. +Licensed under Apache-2.0. +Source: https://android.googlesource.com/platform/frameworks/support/ + +scrcpy server 4.0 +----------------- +Copyright 2018 Genymobile and 2018-2026 Romain Vimont. +Licensed under Apache-2.0. +Source: https://github.com/Genymobile/scrcpy/tree/v4.0 + +The Apache-2.0 terms used by this application and several components are in +the top-level LICENSE file in the source distribution: +https://codeberg.org/0xlena/scrcpy-android/src/branch/master/LICENSE diff --git a/scripts/build-apk b/scripts/build-apk index 9fd1409..476731b 100755 --- a/scripts/build-apk +++ b/scripts/build-apk @@ -7,10 +7,8 @@ # KEY_ALIAS alias of the signing key inside the keystore # KEY_PASS password for that key (often the same as KEYSTORE_PASS) # -# Optional: -# ANDROID_SDK_ROOT if set, apksigner is located via this; otherwise -# the script trusts gradle's output and skips the -# post-build verification step. +# Required tooling: +# Android build-tools 35.0.0 apksigner under ANDROID_SDK_ROOT or on PATH. # # Usage: # scripts/build-apk @@ -49,11 +47,8 @@ if [ ! -f "$KEYSTORE_PATH" ]; then exit 1 fi -if [ ! -f "$JAR" ]; then - echo "build-apk: $JAR is missing" >&2 - echo " run scripts/update-server first" >&2 - exit 1 -fi +"$ROOT/scripts/check-wrapper" +"$ROOT/scripts/check-server" echo "build-apk: gradle :app:assembleRelease" cd "$ROOT" @@ -66,18 +61,24 @@ fi SUM=$(sha256sum "$APK" | awk '{print $1}') -# Best-effort: if apksigner is reachable, confirm the signature. APKSIGNER="" if [ -n "${ANDROID_SDK_ROOT:-}" ]; then - APKSIGNER=$(ls "$ANDROID_SDK_ROOT"/build-tools/*/apksigner 2>/dev/null | sort | tail -n 1 || true) + APKSIGNER="$ANDROID_SDK_ROOT/build-tools/35.0.0/apksigner" + if [ ! -x "$APKSIGNER" ]; then + APKSIGNER="" + fi fi if [ -z "$APKSIGNER" ] && command -v apksigner >/dev/null 2>&1; then APKSIGNER=$(command -v apksigner) fi -if [ -n "$APKSIGNER" ]; then - echo "build-apk: apksigner verify" - "$APKSIGNER" verify --verbose "$APK" | sed 's/^/ /' +if [ -z "$APKSIGNER" ]; then + echo "build-apk: apksigner 35.0.0 is required" >&2 + echo " set ANDROID_SDK_ROOT or put apksigner on PATH" >&2 + exit 1 fi +echo "build-apk: apksigner verify" +"$APKSIGNER" verify --verbose --print-certs "$APK" | sed 's/^/ /' + echo "build-apk: $APK" echo "build-apk: sha256 $SUM" diff --git a/scripts/check b/scripts/check new file mode 100755 index 0000000..6886411 --- /dev/null +++ b/scripts/check @@ -0,0 +1,10 @@ +#!/bin/sh +# Run the repository's host/VM quality gate. + +set -eu + +ROOT="$(cd "$(dirname "$0")/.." && pwd)" + +"$ROOT/scripts/check-wrapper" +"$ROOT/scripts/check-server" +"$ROOT/gradlew" --no-daemon :app:test :adb:test :app:lint diff --git a/scripts/check-server b/scripts/check-server new file mode 100755 index 0000000..9a895a1 --- /dev/null +++ b/scripts/check-server @@ -0,0 +1,39 @@ +#!/bin/sh +# Verify the scrcpy server asset against its tracked SHA-256 sidecar. + +set -eu + +ROOT="$(cd "$(dirname "$0")/.." && pwd)" +ASSETS="$ROOT/app/src/main/assets" +JAR="$ASSETS/scrcpy-server.jar" +SUM="$ASSETS/scrcpy-server.sha256" +VERSION="$ASSETS/scrcpy-server.version" + +for file in "$JAR" "$SUM" "$VERSION"; do + if [ ! -s "$file" ]; then + echo "check-server: $file is missing or empty" >&2 + exit 1 + fi +done + +expected=$(awk 'NR == 1 { print $1 }' "$SUM") +case "$expected" in + *[!0-9a-f]*|'') + echo "check-server: invalid SHA-256 in $SUM" >&2 + exit 1 + ;; +esac +if [ "${#expected}" -ne 64 ]; then + echo "check-server: invalid SHA-256 length in $SUM" >&2 + exit 1 +fi + +actual=$(sha256sum "$JAR" | awk '{ print $1 }') +if [ "$actual" != "$expected" ]; then + echo "check-server: scrcpy-server.jar checksum mismatch" >&2 + echo " want: $expected" >&2 + echo " got: $actual" >&2 + exit 1 +fi + +echo "check-server: ok ($(cat "$VERSION"))" diff --git a/scripts/check-wrapper b/scripts/check-wrapper index 31531b6..3997bed 100755 --- a/scripts/check-wrapper +++ b/scripts/check-wrapper @@ -4,7 +4,7 @@ set -eu -cd "$(git rev-parse --show-toplevel)" +cd "$(cd "$(dirname "$0")/.." && pwd)" WRAPPER='gradle/wrapper/gradle-wrapper.jar' EXPECTED_FILE="$WRAPPER.sha256" diff --git a/scripts/fetch-vendor b/scripts/fetch-vendor index 4c73381..1e3ae59 100755 --- a/scripts/fetch-vendor +++ b/scripts/fetch-vendor @@ -35,10 +35,10 @@ fi if [ ! -d "$LIBADB_PREFIX" ]; then echo "fetch-vendor: adding $LIBADB_PREFIX @ $LIBADB_TAG ($LIBADB_SHA)" - git subtree add --prefix="$LIBADB_PREFIX" "$LIBADB_REPO" "$LIBADB_TAG" --squash + git subtree add --prefix="$LIBADB_PREFIX" "$LIBADB_REPO" "$LIBADB_SHA" --squash else echo "fetch-vendor: pulling $LIBADB_PREFIX @ $LIBADB_TAG ($LIBADB_SHA)" - git subtree pull --prefix="$LIBADB_PREFIX" "$LIBADB_REPO" "$LIBADB_TAG" --squash + git subtree pull --prefix="$LIBADB_PREFIX" "$LIBADB_REPO" "$LIBADB_SHA" --squash fi echo "fetch-vendor: ok" diff --git a/settings.gradle b/settings.gradle index 78b1a9c..060839b 100644 --- a/settings.gradle +++ b/settings.gradle @@ -11,9 +11,16 @@ dependencyResolutionManagement { repositories { google() mavenCentral() - // JitPack is required for spake2-android, pulled in by :adb (libadb-android). - // Kept at settings level so the :adb module stays untouched upstream. - maven { url 'https://jitpack.io' } + // JitPack is used only for libadb's SPAKE2 pairing bridge. Do not + // allow it to shadow artifacts available from the primary repos. + exclusiveContent { + forRepository { + maven { url 'https://jitpack.io' } + } + filter { + includeModule 'com.github.MuntashirAkon.spake2-java', 'spake2-android' + } + } } } @@ -16,11 +16,19 @@ set -eu ROOT="$(cd "$(dirname "$0")" && pwd)" +cmd="${1:-unit}" + +target=unit +case "$cmd" in + e2e|all|record) target=e2e ;; +esac + # The image tag is a hash of the rig inputs, so editing the Dockerfile # or the SDK package list automatically invalidates the cached image. -IMG="scrcpy-android-test:$(cat "$ROOT/test-rig/Dockerfile" "$ROOT/test-rig/sdk-packages.txt" | sha256sum | cut -c1-12)" +IMG="scrcpy-android-test-$target:$(cat "$ROOT/test-rig/Dockerfile" \ + "$ROOT/test-rig/sdk-packages.txt" "$ROOT/test-rig/sdk-packages-e2e.txt" \ + | sha256sum | cut -c1-12)" -cmd="${1:-unit}" case "$cmd" in unit|e2e|all|record|apk) ;; -h|--help) @@ -48,7 +56,7 @@ if ! docker image inspect "$IMG" >/dev/null 2>&1; then echo " Build will likely fail. Fix the host DNS (e.g." >&2 echo " append 'nameserver 1.1.1.1' to /etc/resolv.conf) and retry." >&2 fi - docker build --network=host -t "$IMG" "$ROOT/test-rig" + docker build --network=host --target "$target" -t "$IMG" "$ROOT/test-rig" fi # KVM check for tiers that boot the emulator. diff --git a/test-rig/Dockerfile b/test-rig/Dockerfile index a9ffa23..c43abb5 100644 --- a/test-rig/Dockerfile +++ b/test-rig/Dockerfile @@ -1,24 +1,22 @@ # scrcpy-android test image. # -# Bundles JDK 17, Android cmdline-tools, platform 35, build-tools 34+35, -# emulator, and an x86_64 default API-35 system image (for e2e). +# The unit target bundles JDK 17, Android cmdline-tools, platform 35, and +# build-tools 34+35. The e2e target adds the emulator, system image, and +# runtime libraries. JVM-only tests therefore do not download an emulator. # build-tools 34 is AGP 8.7's internal pin; pre-installing it keeps # gradle from downloading it into the SDK at test time. # Project is mounted at /work; runs in --rm mode. -FROM debian:bookworm-slim +FROM debian:bookworm-slim@sha256:60eac759739651111db372c07be67863818726f754804b8707c90979bda511df AS unit ARG SDK_VER=11076708 +ARG SDK_SHA256=2d2d50857e4eb553af5a6dc3ad507a17adf43d115264b1afc116f95c92e5e258 ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update \ && apt-get install -y --no-install-recommends \ openjdk-17-jdk-headless \ curl unzip ca-certificates \ - libpulse0 libxkbcommon0 libgl1 libnss3 libasound2 libdbus-1-3 \ - qemu-system-x86 qemu-utils \ - procps \ - ffmpeg \ && rm -rf /var/lib/apt/lists/* ENV ANDROID_SDK_ROOT=/opt/android-sdk @@ -27,6 +25,7 @@ ENV ANDROID_HOME=$ANDROID_SDK_ROOT RUN mkdir -p $ANDROID_SDK_ROOT/cmdline-tools \ && curl -fsSL "https://dl.google.com/android/repository/commandlinetools-linux-${SDK_VER}_latest.zip" \ -o /tmp/clt.zip \ + && printf '%s %s\n' "$SDK_SHA256" /tmp/clt.zip | sha256sum -c - \ && unzip -q /tmp/clt.zip -d $ANDROID_SDK_ROOT/cmdline-tools \ && mv $ANDROID_SDK_ROOT/cmdline-tools/cmdline-tools $ANDROID_SDK_ROOT/cmdline-tools/latest \ && rm /tmp/clt.zip @@ -43,3 +42,17 @@ ENV GRADLE_USER_HOME=/work/.tools/gradle-home ENV ANDROID_AVD_HOME=/work/.tools/avd WORKDIR /work + +FROM unit AS e2e + +ARG DEBIAN_FRONTEND=noninteractive + +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + libpulse0 libxkbcommon0 libgl1 libnss3 libasound2 libdbus-1-3 \ + qemu-system-x86 qemu-utils procps ffmpeg \ + && rm -rf /var/lib/apt/lists/* + +COPY sdk-packages-e2e.txt /tmp/sdk-packages-e2e.txt +RUN sdkmanager $(tr '\n' ' ' < /tmp/sdk-packages-e2e.txt) >/dev/null \ + && chmod -R a+rwX "$ANDROID_SDK_ROOT" diff --git a/test-rig/sdk-packages-e2e.txt b/test-rig/sdk-packages-e2e.txt new file mode 100644 index 0000000..4732f6e --- /dev/null +++ b/test-rig/sdk-packages-e2e.txt @@ -0,0 +1,2 @@ +emulator +system-images;android-35;default;x86_64 diff --git a/test-rig/sdk-packages.txt b/test-rig/sdk-packages.txt index 8a7f0ff..48d2636 100644 --- a/test-rig/sdk-packages.txt +++ b/test-rig/sdk-packages.txt @@ -2,5 +2,3 @@ platform-tools platforms;android-35 build-tools;34.0.0 build-tools;35.0.0 -emulator -system-images;android-35;default;x86_64 diff --git a/vendor/libadb-android/LICENSES/LGPL-3.0 b/vendor/libadb-android/LICENSES/LGPL-3.0 new file mode 100644 index 0000000..f455ae6 --- /dev/null +++ b/vendor/libadb-android/LICENSES/LGPL-3.0 @@ -0,0 +1,162 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are covered + by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version of + the Library that is interface-compatible with the Linked Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the GNU + GPL, and only to the extent that such information is necessary to + install and execute a modified version of the Combined Work produced + by recombining or relinking the Application with a modified version + of the Linked Version. (If you use option 4d0, the Installation + Information must accompany the Minimal Corresponding Source and + Corresponding Application Code. If you use option 4d1, you must + provide the Installation Information in the manner specified by + section 6 of the GNU GPL for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your choice, +if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the + Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" applies +to it, you have the option of following +the terms and conditions either of that published version or of any +later version published by the Free Software Foundation. If the +Library as you received it does not specify a version number, you may +choose any version of the GNU Lesser General Public License ever +published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall + apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the Library. diff --git a/vendor/libadb-android/libadb/build.gradle b/vendor/libadb-android/libadb/build.gradle index c5bee94..33a9b9f 100644 --- a/vendor/libadb-android/libadb/build.gradle +++ b/vendor/libadb-android/libadb/build.gradle @@ -52,7 +52,7 @@ publishing { dependencies { implementation "androidx.annotation:annotation:1.9.1" - implementation 'org.bouncycastle:bcprov-jdk15to18:1.81' + implementation 'org.bouncycastle:bcprov-jdk15to18:1.84' implementation 'com.github.MuntashirAkon.spake2-java:spake2-android:2.2.1' testImplementation 'junit:junit:4.13.2' |