TL;DR
build.gradle
dependencies
.Si vous souhaitez distribuer votre application sur Google Play, vous devez vous conformer correctement aux conditions de licence de la bibliothèque externe que vous avez utilisée. Par conséquent, les développeurs d'applications doivent savoir quelles bibliothèques externes leur application utilise.
Sur Android, il est courant d'utiliser Gradle pour déployer des bibliothèques externes. Gradle téléchargera dans votre environnement local, y compris les bibliothèques auxquelles la bibliothèque externe que vous souhaitez utiliser fait référence (dépend de). Alors que Gradle cache le travail fastidieux, vous utilisez peut-être une bibliothèque inattendue.
build.gradle
//...
dependencies {
implementation 'com.android.support:appcompat-v7:28.0.0'
}
//...
ʻAppcompat-v7 est une bibliothèque presque indispensable pour créer des applications Android modernes, et je pense que beaucoup de gens l'utilisent. Saviez-vous que les applications qui incluent ʻappcompat-v7
incluent également les bibliothèques répertoriées ci-dessous?
Il existe un total de 30 bibliothèques dont ʻappcompat-v7. Gardez à l'esprit que ces bibliothèques sont des bibliothèques dans lesquelles l'utilisateur n'a pas écrit ʻimplementation
, mais juste une ligne d'instruction que ** 'appcompat-v7 ʻimplementation
**.
Dans cet article, je vais vous expliquer comment connaître les bibliothèques externes utilisées dans la production d'applications Android. Il explique également comment vérifier l'avis d'attribution de la licence Apache 2.0, qui est souvent appliqué aux bibliothèques Android.
Cette fois, je vais expliquer en utilisant les dépendances suivantes comme exemple. Apache Commons Codec est ajouté aux dépendances créées à la suite de la poursuite de l'assistant de création de projet Android Studio avec les paramètres par défaut. ..
build.gradle
//...
dependencies {
//Android Studio a été ajouté par défaut
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
//ajouter à
implementation 'commons-codec:commons-codec:1.11'
}
//...
Maintenant, je vais vous expliquer comment connaître la bibliothèque que vous utilisez.
En fait, cela peut être compris en exécutant une seule tâche Gralde. Exécutez la tâche ʻandroid Dependencies` depuis la fenêtre Gradle.
Ensuite, je pense que le résultat est sorti dans la fenêtre Exécuter.
Jetons un coup d'œil aux blocs qui commencent par releaseRuntimeClassPath
.
Résultat d'exécution androidDependencies.
...
releaseRuntimeClasspath - Dependencies for runtime/packaging
+--- com.android.support:appcompat-v7:28.0.0@aar
+--- com.android.support.constraint:constraint-layout:1.1.3@aar
+--- commons-codec:commons-codec:1.11@jar
+--- com.android.support:support-fragment:28.0.0@aar
+--- com.android.support:animated-vector-drawable:28.0.0@aar
+--- com.android.support:support-core-ui:28.0.0@aar
+--- com.android.support:support-core-utils:28.0.0@aar
+--- com.android.support:support-vector-drawable:28.0.0@aar
+--- com.android.support:loader:28.0.0@aar
+--- com.android.support:viewpager:28.0.0@aar
+--- com.android.support:coordinatorlayout:28.0.0@aar
+--- com.android.support:drawerlayout:28.0.0@aar
+--- com.android.support:slidingpanelayout:28.0.0@aar
+--- com.android.support:customview:28.0.0@aar
+--- com.android.support:swiperefreshlayout:28.0.0@aar
+--- com.android.support:asynclayoutinflater:28.0.0@aar
+--- com.android.support:support-compat:28.0.0@aar
+--- com.android.support:versionedparcelable:28.0.0@aar
+--- com.android.support:collections:28.0.0@jar
+--- com.android.support:cursoradapter:28.0.0@aar
+--- android.arch.lifecycle:runtime:1.1.1@aar
+--- com.android.support:documentfile:28.0.0@aar
+--- com.android.support:localbroadcastmanager:28.0.0@aar
+--- com.android.support:print:28.0.0@aar
+--- android.arch.lifecycle:viewmodel:1.1.1@aar
+--- android.arch.lifecycle:livedata:1.1.1@aar
+--- android.arch.lifecycle:livedata-core:1.1.1@aar
+--- android.arch.lifecycle:common:1.1.1@jar
+--- android.arch.core:runtime:1.1.1@aar
+--- android.arch.core:common:1.1.1@jar
+--- com.android.support:interpolator:28.0.0@aar
+--- com.android.support:support-annotations:28.0.0@jar
\--- com.android.support.constraint:constraint-layout-solver:1.1.3@jar
...
La tâche ʻandroidDependenciesest une tâche qui présente les dépendances de votre application. Normalement, le chemin d'accès aux classes d'exécution de la tâche de publication correspond à la bibliothèque que vous incluez réellement. Par conséquent, vous pouvez consulter
releaseRuntimeClasspath` pour voir la liste des bibliothèques utilisées par votre application.
Si vous voulez connaître les dépendances plus détaillées, exécutez la tâche dependencies
.
résultat de l'exécution des dépendances.
...
releaseCompileClasspath - Resolved configuration for compilation for variant: release
+--- com.android.support:appcompat-v7:28.0.0
| +--- com.android.support:support-annotations:28.0.0
| +--- com.android.support:support-compat:28.0.0
| | +--- com.android.support:support-annotations:28.0.0
| | +--- com.android.support:collections:28.0.0
| | | \--- com.android.support:support-annotations:28.0.0
| | +--- android.arch.lifecycle:runtime:1.1.1
| | | +--- android.arch.lifecycle:common:1.1.1
| | | | \--- com.android.support:support-annotations:26.1.0 -> 28.0.0
| | | +--- android.arch.core:common:1.1.1
| | | | \--- com.android.support:support-annotations:26.1.0 -> 28.0.0
| | | \--- com.android.support:support-annotations:26.1.0 -> 28.0.0
| | \--- com.android.support:versionedparcelable:28.0.0
| | +--- com.android.support:support-annotations:28.0.0
| | \--- com.android.support:collections:28.0.0 (*)
| +--- com.android.support:collections:28.0.0 (*)
| +--- com.android.support:cursoradapter:28.0.0
| | \--- com.android.support:support-annotations:28.0.0
| +--- com.android.support:support-core-utils:28.0.0
| | +--- com.android.support:support-annotations:28.0.0
| | +--- com.android.support:support-compat:28.0.0 (*)
| | +--- com.android.support:documentfile:28.0.0
| | | \--- com.android.support:support-annotations:28.0.0
| | +--- com.android.support:loader:28.0.0
| | | +--- com.android.support:support-annotations:28.0.0
| | | +--- com.android.support:support-compat:28.0.0 (*)
| | | +--- android.arch.lifecycle:livedata:1.1.1
| | | | +--- android.arch.core:runtime:1.1.1
| | | | | +--- com.android.support:support-annotations:26.1.0 -> 28.0.0
| | | | | \--- android.arch.core:common:1.1.1 (*)
| | | | +--- android.arch.lifecycle:livedata-core:1.1.1
| | | | | +--- android.arch.lifecycle:common:1.1.1 (*)
| | | | | +--- android.arch.core:common:1.1.1 (*)
| | | | | \--- android.arch.core:runtime:1.1.1 (*)
| | | | \--- android.arch.core:common:1.1.1 (*)
| | | \--- android.arch.lifecycle:viewmodel:1.1.1
| | | \--- com.android.support:support-annotations:26.1.0 -> 28.0.0
| | +--- com.android.support:localbroadcastmanager:28.0.0
| | | \--- com.android.support:support-annotations:28.0.0
| | \--- com.android.support:print:28.0.0
| | \--- com.android.support:support-annotations:28.0.0
| +--- com.android.support:support-fragment:28.0.0
| | +--- com.android.support:support-compat:28.0.0 (*)
| | +--- com.android.support:support-core-ui:28.0.0
| | | +--- com.android.support:support-annotations:28.0.0
| | | +--- com.android.support:support-compat:28.0.0 (*)
| | | +--- com.android.support:support-core-utils:28.0.0 (*)
| | | +--- com.android.support:customview:28.0.0
| | | | +--- com.android.support:support-annotations:28.0.0
| | | | \--- com.android.support:support-compat:28.0.0 (*)
| | | +--- com.android.support:viewpager:28.0.0
| | | | +--- com.android.support:support-annotations:28.0.0
| | | | +--- com.android.support:support-compat:28.0.0 (*)
| | | | \--- com.android.support:customview:28.0.0 (*)
| | | +--- com.android.support:coordinatorlayout:28.0.0
| | | | +--- com.android.support:support-annotations:28.0.0
| | | | +--- com.android.support:support-compat:28.0.0 (*)
| | | | \--- com.android.support:customview:28.0.0 (*)
| | | +--- com.android.support:drawerlayout:28.0.0
| | | | +--- com.android.support:support-annotations:28.0.0
| | | | +--- com.android.support:support-compat:28.0.0 (*)
| | | | \--- com.android.support:customview:28.0.0 (*)
| | | +--- com.android.support:slidingpanelayout:28.0.0
| | | | +--- com.android.support:support-annotations:28.0.0
| | | | +--- com.android.support:support-compat:28.0.0 (*)
| | | | \--- com.android.support:customview:28.0.0 (*)
| | | +--- com.android.support:interpolator:28.0.0
| | | | \--- com.android.support:support-annotations:28.0.0
| | | +--- com.android.support:swiperefreshlayout:28.0.0
| | | | +--- com.android.support:support-annotations:28.0.0
| | | | +--- com.android.support:support-compat:28.0.0 (*)
| | | | \--- com.android.support:interpolator:28.0.0 (*)
| | | +--- com.android.support:asynclayoutinflater:28.0.0
| | | | +--- com.android.support:support-annotations:28.0.0
| | | | \--- com.android.support:support-compat:28.0.0 (*)
| | | \--- com.android.support:cursoradapter:28.0.0 (*)
| | +--- com.android.support:support-core-utils:28.0.0 (*)
| | +--- com.android.support:support-annotations:28.0.0
| | +--- com.android.support:loader:28.0.0 (*)
| | \--- android.arch.lifecycle:viewmodel:1.1.1 (*)
| +--- com.android.support:support-vector-drawable:28.0.0
| | +--- com.android.support:support-annotations:28.0.0
| | \--- com.android.support:support-compat:28.0.0 (*)
| \--- com.android.support:animated-vector-drawable:28.0.0
| +--- com.android.support:support-vector-drawable:28.0.0 (*)
| \--- com.android.support:support-core-ui:28.0.0 (*)
+--- com.android.support.constraint:constraint-layout:1.1.3
| \--- com.android.support.constraint:constraint-layout-solver:1.1.3
\--- commons-codec:commons-codec:1.11
...
ʻAndroidDependencies vous indique la bibliothèque qui sera éventuellement utilisée dans un format à puces, tandis que
dependencies` vous indique les dépendances dans un format arborescent.
Utilisez ceci pour savoir si vous avez vraiment besoin d'une bibliothèque.
Quand j'essaye de sortir la liste avec les «Dépendances d'Android», je vois beaucoup de bibliothèques inconnues. Consultez le référentiel Maven (https://mvnrepository.com/) pour ces bibliothèques. Par exemple, si vous recherchez ʻandroid.arch.lifecycle: viewmodel`, vous verrez la page suivante (https://mvnrepository.com/artifact/android.arch.lifecycle/viewmodel).
Sur cette page, vous pouvez voir que ʻandroid.arch.lifecycle: viewmodel fait apparemment partie d'un package Android nommé Android Lifecycle ViewModel et est distribué sous la licence Apache 2.0. Par conséquent, on peut voir que ʻandroid.arch.lifecycle: viewmodel
devrait suivre les conditions de distribution de la licence Apache 2.0.
Je l'ai expliqué pendant longtemps, mais en fait, il existe de nombreux plug-ins Android Studio qui génèrent automatiquement les étapes ci-dessus (et créent même des activités d'affichage de licence en fonction de l'élément) **. Veuillez vous référer à l'article de @ tyoro.
Certaines bibliothèques intégrant des licences s'affichent dans les applications Android
Vous vous demandez peut-être: "Si vous le faites automatiquement, vous ne le ferez plus?" Cependant, certaines tâches ne peuvent pas être automatisées lors de l'affichage de la licence pour utiliser la bibliothèque sous licence Apache License 2.0. C'est un avis du contenu de l'attribution.
La licence Apache 2.0 exige que si la bibliothèque que vous utilisez a une attribution, son contenu doit être visible dans la documentation. Le fichier contenant le contenu de cette attribution est appelé un fichier NOTICE ou similaire.
Le problème est que dans le monde Android (Java), les fichiers NOTICE sont généralement distribués en les intégrant dans des jars et des aars. De plus, les fichiers NOTICE n'ont pas de nom ou de format de fichier fixe. En d'autres termes, ** vous devez regarder autour de chacun d'eux pour voir si le fichier jar ou aar que vous utilisez contient un fichier qui correspond au fichier NOTICE **.
La procédure de vérification efficace (?) À l'aide d'Android Studio est expliquée ci-dessous.
Projet
dans la liste des listes déroulantes pour changer d'affichage.Vous pouvez voir toutes les bibliothèques dépendantes dans Android Studio, non?
Maintenant, vérifions s'il existe un fichier NOTICE dans le modèle de vue du cycle de vie Android.
Si vous creusez dans Gradle: android.arch.lifecycle: viewmodel-1.1.1
...
Il y avait un fichier inconnu appelé ʻandroid.arch.lifecycle_viewmodel.versiondans
META-INF`, mais quand j'ai regardé à l'intérieur, il ne décrivait vraiment que les informations de version comme le nom du fichier le suggère.
Apparemment, il n'y a pas de fichier NOTICE dans le modèle d'affichage du cycle de vie Android car il n'y a pas d'autres fichiers.
Ensuite, vérifions s'il existe un fichier NOTICE dans Commons-Codec d'Apache.
Si vous creusez dans Gradle: commons-codec: commons-codec: 1.11 @ jar
...
J'ai trouvé «NOTICE.txt» dans «META-INF» de «commons-codec-1.11.jar».
Lorsque vous ouvrez NOTICE.txt
, vous pouvez voir que le contenu de l'attribution (informations de crédit) est écrit.
Il semble que cette description devrait être citée dans l'affichage des licences.
Cette fois, le fichier NOTICE existait avec le chemin «META-INF / NOTICE.txt», mais il n'est pas rare que certaines bibliothèques existent avec des noms de fichiers et des chemins de fichiers complètement différents. Cherchons patiemment.
La distribution de logiciels non conformes aux termes de la licence peut, dans le pire des cas, être poursuivie par l'auteur et conduire à un procès. Manipulez correctement le logiciel sous licence.
Recommended Posts