aboutsummaryrefslogtreecommitdiff
path: root/app/build.gradle
diff options
context:
space:
mode:
Diffstat (limited to 'app/build.gradle')
-rw-r--r--app/build.gradle130
1 files changed, 130 insertions, 0 deletions
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..d16a8d5
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,130 @@
+plugins {
+ id 'com.android.application'
+}
+
+android {
+ namespace 'invalid.lena.scrcpy'
+ compileSdk 35
+ // Pin build-tools explicitly so the aapt2/zipalign/d8 toolchain is
+ // fixed and builds stay reproducible, not whatever AGP defaults to.
+ // 35.0.0 is the compileSdk's.
+ buildToolsVersion '35.0.0'
+
+ defaultConfig {
+ // The published package id. Immutable across releases.
+ applicationId 'invalid.lena.scrcpy'
+ minSdk 31
+ targetSdk 35
+ versionCode 1
+ versionName '0.1'
+ }
+
+ // AGP otherwise embeds a Google-signed dependency-metadata blob in the
+ // APK that is not byte-reproducible. Strip it so the build stays
+ // deterministic. This is the single most common reproducible-build
+ // breaker on AGP.
+ dependenciesInfo {
+ includeInApk false
+ includeInBundle false
+ }
+
+ // Release signing pulls credentials from the environment. Set all
+ // four of KEYSTORE_PATH / KEYSTORE_PASS / KEY_ALIAS / KEY_PASS and
+ // assembleRelease produces a signed APK. With any of them missing
+ // the release build is unsigned (Gradle's default).
+ signingConfigs {
+ release {
+ def ksPath = System.getenv('KEYSTORE_PATH')
+ def ksPass = System.getenv('KEYSTORE_PASS')
+ def kAlias = System.getenv('KEY_ALIAS')
+ def kPass = System.getenv('KEY_PASS')
+ if (ksPath && ksPass && kAlias && kPass) {
+ storeFile file(ksPath)
+ storePassword ksPass
+ keyAlias kAlias
+ keyPassword kPass
+ }
+ }
+ }
+
+ // Native ABI policy: release ships arm64-v8a only. Every targeted
+ // source device is 64-bit ARM in practice; 32-bit-only devices are
+ // not supported. The test rig uses an x86_64 emulator, so debug keeps
+ // x86_64 (and arm64) so ./test e2e still works.
+ buildTypes {
+ debug {
+ applicationIdSuffix '.debug'
+ versionNameSuffix '-debug'
+ ndk {
+ abiFilters 'arm64-v8a', 'x86_64'
+ }
+ }
+ release {
+ ndk {
+ abiFilters 'arm64-v8a'
+ }
+ minifyEnabled true
+ shrinkResources true
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'),
+ 'proguard-rules.pro'
+ if (System.getenv('KEYSTORE_PATH')) {
+ signingConfig signingConfigs.release
+ }
+ }
+ }
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_17
+ targetCompatibility JavaVersion.VERSION_17
+ }
+
+ packaging {
+ // bouncycastle (transitive via :adb) is the dominant source of
+ // dead weight in the APK. Each entry below is dead code/data for
+ // our use case (we only call BC's asn1, crypto, util.encoders):
+ // - picnic post-quantum lookup tables: ~1.2 MB of .properties
+ // - cert-path-reviewer i18n messages: ~92 KB, en+de only
+ // - kotlin metadata: bleed from spake2-android (Kotlin lib);
+ // our code is pure Java and doesn't reflect on .kotlin_builtins
+ // - androidx annotation LICENSE.txt: 10 KB blob, no runtime use
+ // - duplicate META-INF licenses/notices: ordinary AGP cleanup
+ resources.excludes += [
+ 'META-INF/LICENSE*',
+ 'META-INF/NOTICE*',
+ 'META-INF/versions/9/OSGI-INF/MANIFEST.MF',
+ 'META-INF/androidx/**',
+ 'META-INF/kotlin-stdlib*',
+ 'org/bouncycastle/pqc/crypto/picnic/**',
+ 'org/bouncycastle/x509/CertPathReviewerMessages*.properties',
+ 'kotlin/**',
+ ]
+ }
+
+ testOptions {
+ // android.util.Log and friends are stubs on the JVM unit-test
+ // classpath; let them return defaults instead of throwing.
+ unitTests.returnDefaultValues = true
+ }
+}
+
+dependencies {
+ implementation project(':adb')
+ // bcprov is already pulled in transitively by :adb at runtime; we
+ // 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'
+
+ // Bundled Conscrypt. libadb-android's TLS pairing exports keying
+ // material via Conscrypt. Without a bundled copy it reflects into the
+ // platform's hidden com.android.org.conscrypt.Conscrypt, which under
+ // targetSdk 35 is invisible to reflection (getMethod throws
+ // NoSuchMethodException and pairing fails on real devices). Bundling a
+ // standalone Conscrypt flips libadb onto the public
+ // org.conscrypt.Conscrypt API, which is not restricted. Ships a native
+ // .so (filtered to arm64-v8a in release).
+ implementation 'org.conscrypt:conscrypt-android:2.5.2'
+
+ testImplementation 'junit:junit:4.13.2'
+ testImplementation 'org.json:json:20240303'
+}