aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/build.gradle47
-rw-r--r--app/proguard-rules.pro2
-rw-r--r--app/src/main/assets/THIRD_PARTY_NOTICES59
-rwxr-xr-xscripts/build-apk29
-rwxr-xr-xscripts/check10
-rwxr-xr-xscripts/check-server39
-rwxr-xr-xscripts/check-wrapper2
-rwxr-xr-xscripts/fetch-vendor4
-rw-r--r--settings.gradle13
-rwxr-xr-xtest14
-rw-r--r--test-rig/Dockerfile27
-rw-r--r--test-rig/sdk-packages-e2e.txt2
-rw-r--r--test-rig/sdk-packages.txt2
-rw-r--r--vendor/libadb-android/LICENSES/LGPL-3.0162
-rw-r--r--vendor/libadb-android/libadb/build.gradle2
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'
+ }
+ }
}
}
diff --git a/test b/test
index 242cee3..ec31236 100755
--- a/test
+++ b/test
@@ -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'