[JAVA] Tu comprends vraiment? Comment vérifier la bibliothèque et la licence utilisées par l'application

TL;DR

introduction

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.

Connaissez la bibliothèque que vous utilisez

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.

pic1.jpg

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 consulterreleaseRuntimeClasspath` 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.

pic2.jpg

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.

Découvrez quelle 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).

pic3.jpg

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.

En fait, il le fera automatiquement

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

Bonus: [Apache License 2.0] Connaître le fichier NOTICE

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.

  1. Cliquez sur la zone de liste déroulante intitulée «Android» dans la fenêtre Projet image.png
  2. Sélectionnez Projet dans la liste des listes déroulantes pour changer d'affichage.
  3. Sélectionnez la bibliothèque dont vous voulez voir le contenu à partir de «Bibliothèques externes» image.png

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 ...

image.png

Il y avait un fichier inconnu appelé ʻandroid.arch.lifecycle_viewmodel.versiondansMETA-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 ...

image.png

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.

en conclusion

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

Tu comprends vraiment? Comment vérifier la bibliothèque et la licence utilisées par l'application
Comment remplacer des caractères que vous ne comprenez pas [Principe]
Comment vérifier l'extension et la taille des fichiers téléchargés
Comment installer le langage utilisé dans Ubuntu et comment créer l'environnement
Que faire si vous n'aimez pas le code généré par swagger-codegen-cli
[Rails] Comment appliquer le CSS utilisé dans l'application principale avec Administrer
Comment écrivez-vous l'opérateur ternaire (? :)
Comment trouver les dizaines et les unités
Comment intégrer et afficher des vidéos youtube dans Rails (vous pouvez également obtenir l'URL saisie en modifiant)
Que faire si vous ne pouvez pas activer la boîte de sélection créée par bootstrap-select
Comment afficher la quantité de disque utilisée par le conteneur Docker pour chaque conteneur
[Rails] Comment décider de la destination par "voies ferrées"
Comment vérifier le journal dans le conteneur Docker
Comment trouver le score total et le score moyen
Comment vérifier les commandes Rails dans le terminal
[Java] Comment obtenir la clé et la valeur stockées dans Map par traitement itératif
Comment revenir à l'écran précédent par opération Swipe
Comment passer à l'écran des détails en cliquant sur l'image
Comment vérifier une seule vérification RadioButton par défaut (Remarque)
Comment penser quand on comprend soudainement les génériques
Classes et instances Java comprises dans la figure
[Linux] Commentaire facile! Comment vérifier et modifier les autorisations
[Android] Comment vérifier si le service de développement Google Play est installé lors du démarrage de l'application
Vérifiez comment définir le délai d'expiration lors de la connexion avec Spring + HikariCP + MySQL et de l'exécution de SQL
J'ai essayé de créer une application qui vous permet de publier et de discuter par genre ~ Vue d'ensemble de l'application ~