Как добиться desugaring в сборках Android Gradle? - PullRequest
0 голосов
/ 03 октября 2019

Я разрабатываю приложение, которое должно работать на телефонах с Android API 19+. В беседах с руководством выясняется, можем ли мы отказаться от поддержки более старых версий Android, но кажется почти наверняка, что мы не можем жить только с 26+.

В последнее время возникла необходимость использовать библиотеку, которая используетнекоторые функции Java 1.8, и те, которые не могут dex.

Ранее я думал, что автоматическое «десагеринг» было включено при сборке / индексации с помощью gradle, и такие проблемы будут «автоматически» решены. путем преобразования неподдерживаемых опкодов в 1.7 в функционально эквивалентные 1.7 опкоды.

Но мои сборки терпят неудачу с «Методы частного интерфейса поддерживаются только начиная с Android N (--min-api 24)» и аналогичныхсообщения об ошибках (как я уже сказал, API-уровень 26 является самым большим на мой взгляд), и:

"Failed to transform artifact '...' to match attributes {artifactType=android-dex, dexing-enable-desugaring=false, dexing-is-debuggable=false, dexing-min-sdk=1}"

Как вы можете видеть, dexing, кажется, происходит с "dexing-enable-desugaring = false" и"dexing-min-sdk = 1", и я бы хотел это изменить. Я долго искал способ их установки, и, похоже, не могу найти способ сказать gradle, что он должен передать правильные параметры дексеру.

Вот соответствующие фрагментыфайлы конфигурации:

gradle.properties:

androidBuildToolsVersion=28.0.3
androidCompileSdkVersion=28

gradle-wrapper.properties:

distributionUrl = https\://services.gradle.org/distributions/gradle-5.4.1-all.zip

build.gradle:

buildscript {
    repositories {
        jcenter()
        mavenCentral()
        google()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:3.5.0'
        classpath 'com.google.gms:google-services:3.0.0'
    }
}

allprojects {
    repositories {
        jcenter()
        google()
    }
}

apply plugin: 'com.android.application'

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:23.0.1'
    compile 'com.android.support:mediarouter-v7:23.0.1'
    compile 'com.google.android.gms:play-services-analytics:10.0.0'
    compile 'com.google.android.gms:play-services-cast:10.0.0'
    compile 'com.google.android.gms:play-services-location:10.0.0'
    compile 'com.google.firebase:firebase-core:10.0.1'
    compile 'org.bouncycastle:bcpkix-jdk15on:1.60'
    compile 'org.bouncycastle:bcprov-jdk15on:1.60'
    ...
}

apply plugin: 'com.google.gms.google-services'

android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }

    compileSdkVersion androidCompileSdkVersion.toInteger()

    buildToolsVersion androidBuildToolsVersion

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            ...
       }
    }

    defaultConfig.applicationId = "..."
}

Любые предложения?

Кроме того, стоит отметить, что это не «чистый» проект android / Gradle, там задействован нативный код и система сборки, над которой я не могу хорошо контролировать, которая запускает Gradle какшаг в процессе сборки. Если есть несколько способов настройки параметров dexer, я бы предпочел что-то, что требует изменения build.gradle, так как это единственное, над чем у меня есть прямой контроль, вставка чего-либо в gradle.properties потребует взлома системы сборки способами, которые яЛучше избегать, но я возьму это, если это единственный способ сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...