J'ai récemment mis à jour un ancien projet. La version originale de Gradle est 4.6 et doit être mise à niveau vers 7.6. Le JDK est mis à niveau de 8 à 17. Il y a de nombreux pièges en cours de route. Enregistrons-les un par un.
1. L'entrepôt Maven doit être mis à niveau vers https
Vous rencontrerez cette erreur
L’utilisation de protocoles non sécurisés avec des référentiels, sans adhésion explicite, n’est pas prise en charge. Basculez le référentiel Maven 'maven(http://mapmo.baidu.com/artifactory/libs-release)' pour rediriger vers un protocole sécurisé (comme HTTPS) ou autoriser les protocoles non sécurisés. Voir https://docs.gradle.org/7.6.1/dsl/org.gradle.api.artifacts.repositories.UrlArtifactRepository.html#org.gradle.api.artifacts.repositories.UrlArtifactRepository:allowInsecureProtocol pour plus de détails
Si vous ne pouvez pas effectuer la mise à niveau vers https, il existe un moyen de le rendre compatible. Remplacez-le par la méthode suivante.
maven {
url "http://xxxxxx.com/artifactory/libs-release"
allowInsecureProtocol = true
credentials {
username ""
password ""
}
}
2. Lors de la mise à niveau de la syntaxe Gradle, vous rencontrerez l'erreur suivante
Impossible de trouver la méthode fournie() pour les arguments [com.android.support:appcompat-v7:26.+] sur un objet de type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler
Impossible de trouver la méthode compile() pour les arguments [répertoire 'libs'] sur l'objet de type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler
C'est facile de changer
fourni ---> compileOnly
compiler ---> implémentation
3. Proguard est introuvable
Impossible d'obtenir la propriété inconnue « proguard » pour le projet « :XXXXX » de type org.gradle.api.Project.
Cela devrait être dû au fait que la version supérieure de Gradle est configurée avec R8 par défaut. Vous devez introduire Proguard vous-même. GPT a également donné une réponse spécieuse. Ce problème m'a causé des douleurs pendant longtemps avant de le résoudre. La méthode est la suivante :
Introduisez proguard dans le fichier build.gradle de votre projet
dependencies {
classpath 'com.android.tools.build:gradle:7.4.2'
classpath 'com.guardsquare:proguard-gradle:7.1.0'
}
4. Le fichier BuildConfig est introuvable
Pour les anciennes versions des fichiers Gradle, vous pouvez configurer une option de publication dans buildTypes, et un fichier de débogage BuildConfig sera également généré, qui peut être référencé dans le projet. Après la mise à niveau, si l'option de débogage n'est pas configurée dans buildTypes, le fichier de débogage BuildConfig ne sera pas généré, ce qui entraînera une erreur signalée lorsque le projet n'est pas référencé.
Modifier le fichier précédent
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
frame {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
Après modification
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
frame {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
Ajoutez simplement un débogage
5. Certains attributs du fichier BuildConfig sont introuvables.
C'est également très pénible. Dans mon fichier BuildConfig, il y a un attribut VERSION_NAME qui est introuvable. Il n'est pas trouvé dans le fichier BuildConfig généré. Je n'ai pas non plus trouvé quelque chose de similaire dans le fichier build.gradle.
buildConfigField "Chaîne", "NOM_VERSION", "11.2"
Ce genre de déclaration, je suis donc très curieux de savoir comment le code précédent a été compilé.
Enfin, il a été découvert que l'ancienne version de gradle modifierait automatiquement les attributs versionCode et versionName dans defaultConfig en attributs VERSION_CODE et VERSION_NAME et les ajouterait au fichier BuildConfig, tandis que la nouvelle version du fichier gradle ne s'en soucierait pas.
Alors ajoutez-le vous-même
defaultConfig {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 1
versionName rootProject.ext.MAPCOM_VERSION
buildConfigField "String", "VERSION_NAME", "\"${rootProject.ext.MAPCOM_VERSION}\""
buildConfigField "String", "MECP_VERSION", "\"${rootProject.ext.MECP_VERSION}\""
buildConfigField "String", "MAPCOM_VERSION", "\"${rootProject.ext.MAPCOM_VERSION}\""
buildConfigField "String", "ENGINE_VERSION", "\"${rootProject.ext.ENGINE_VERSION}\""
buildConfigField "String", "MANUFACTURER", "\"${rootProject.ext.MANUFACTURER}\""
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
6. class.jar est introuvable
Dans mon projet, je dois compiler certains projets dans des bocaux. J'ai écrit moi-même l'implémentation de la fonction gradle, mais j'ai rencontré cette erreur.
Impossible d'étendre le ZIP '/home/GitDownload/mappreset/mapcom/android/ComBase/build/intermediates/packaged-classes/release/classes.jar' car il n'existe pas
Le code original est écrit comme ceci
def zipFile = file('build/intermediates/packaged-classes/release/classes.jar')
Ou le chemin de class.jar généré par la nouvelle version de gradle a changé, remplacez-le simplement par celui ci-dessous
def zipFile = fichier('build/intermediates/aar_main_jar/release/classes.jar')
7. Problème de stratégie en double
L'erreur est signalée comme suit
Entry assets/CircleDashTexture.png est un doublon mais aucune stratégie de gestion des doublons n'a été définie. Veuillez vous référer à https://docs.gradle.org/7.6.1/dsl/org.gradle.api.tasks.Copy.html#org.gradle.api.tasks.Copy:duplicatesStrategy pour plus de détails.
J'ai signalé une erreur dans la fonction de compilation du package jar. Il n'est pas difficile de le modifier. Ajoutez simplement la stratégie de gestion des conflits dans la première phrase, comme suit
task makeJar(type:Jar){
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
archiveName = SDK_BASENAME + "_" + SDK_VERSION + '.jar'
// 复制资源文件
from fileTree(dir: 'src/main', includes: ['assets/**'])
***********
}
8. Erreur de compilation du fichier AIDL
Si vous rencontrez cette erreur, org.gradle.api.tasks.TaskExecutionException : l'exécution a échoué pour la tâche ':app:compileDebugAidl'
En même temps il y a
* L'exception est : [2023-08-24 11:28:29] java.lang.OutOfMemoryError : métaespace
Ce problème est généralement dû au fait que les métadonnées utilisées lors de la compilation dépassent Metaspace
la limite. Il peut être résolu en l'ajoutant au fichier gradle.properties.
org.gradle.jvmargs=-XX:MaxMetaspaceSize=512m
La Metaspace
taille augmentée est de 512 Mo. Je l'ai compilé avec 512 Mo. Bien entendu, vous pouvez également ajuster cette valeur de manière appropriée en fonction des besoins réels du projet.
Ce qui précède est un voyage à travers les fosses, j'espère qu'il sera utile à tout le monde !