[JAVA] Verstehst du wirklich So überprüfen Sie die von der App verwendete Bibliothek und Lizenz

TL;DR

Einführung

Wenn Sie Ihre App auf Google Play verbreiten möchten, müssen Sie die Lizenzbestimmungen der von Ihnen verwendeten externen Bibliothek ordnungsgemäß einhalten. Daher müssen App-Entwickler wissen, welche externen Bibliotheken ihre App verwendet.

Unter Android ist es Standard, Gradle zum Bereitstellen externer Bibliotheken zu verwenden. Gradle lädt in Ihre lokale Umgebung herunter, einschließlich der Bibliotheken, auf die die externe Bibliothek verweist (abhängig davon). Während Gradle die mühsame Arbeit verbirgt, verwenden Sie möglicherweise tatsächlich eine unerwartete Bibliothek.

build.gradle



//...

dependencies {
    implementation 'com.android.support:appcompat-v7:28.0.0'
}

//...

appcompat-v7 ist eine Bibliothek, die für die Erstellung moderner Android-Apps fast unverzichtbar ist, und ich denke, viele Leute verwenden sie. Wussten Sie, dass Apps, die "appcompat-v7" importieren, auch die unten aufgeführten Bibliotheken importieren?

Insgesamt 30 Bibliotheken, einschließlich "appcompat-v7". Zur Erinnerung, diese Bibliotheken sind keine vom Benutzer geschriebenen "Implementierungen", sondern nur eine einzelne Anweisungszeile, die "" appcompat-v7 " implementiert.

In diesem Artikel werde ich erklären, wie Sie die externen Bibliotheken herausfinden, die in der Android-Anwendungsproduktion verwendet werden. Außerdem wird erläutert, wie Sie den Hinweis zur Zuweisung von Apache License 2.0 überprüfen, der häufig auf Android-Bibliotheken angewendet wird.

Kennen Sie die Bibliothek, die Sie verwenden

Dieses Mal werde ich die folgenden Abhängigkeiten als Beispiel erläutern. Apache Commons Codec wird zu den Abhängigkeiten hinzugefügt, die erstellt wurden, wenn Sie mit dem Standardeinstellungsassistenten für Android Studio mit den Standardeinstellungen fortfahren. ..

build.gradle



//...

dependencies {
    //Android Studio wurde standardmäßig hinzugefügt
    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'

    //hinzufügen
    implementation 'commons-codec:commons-codec:1.11'
}

//...

Jetzt werde ich erklären, wie Sie die Bibliothek kennen, die Sie verwenden.

Tatsächlich kann dies verstanden werden, indem nur eine Gralde-Aufgabe ausgeführt wird. Führen Sie die Aufgabe "Android-Abhängigkeiten" im Gradle-Fenster aus.

pic1.jpg

Dann denke ich, dass das Ergebnis im Run-Fenster veröffentlicht wurde. Werfen wir einen Blick auf die Blöcke, die mit releaseRuntimeClassPath beginnen.

Ausführungsergebnis von 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

...

Die Aufgabe "androidDependencies" ist eine Aufgabe, die die Abhängigkeiten Ihrer App darstellt. Normalerweise stimmt der Laufzeitklassenpfad der Release-Aufgabe mit der Bibliothek überein, die Sie tatsächlich einschließen. Daher können Sie unter "releaseRuntimeClasspath" die Liste der von Ihrer App verwendeten Bibliotheken anzeigen.

Wenn Sie detailliertere Abhängigkeiten kennen möchten, führen Sie die Aufgabe "Abhängigkeiten" aus.

pic2.jpg

Ergebnis der Ausführung von Abhängigkeiten.



...

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 teilt Ihnen die Bibliothek mit, die eventuell in einem Aufzählungszeichenformat verwendet wird, während dependencies Ihnen die Abhängigkeiten in einem Baumformat angibt. Verwenden Sie diese Option, um herauszufinden, ob Sie wirklich eine Bibliothek benötigen.

Finden Sie heraus, welche Bibliothek

Wenn ich versuche, die Liste mit "androidDependencies" auszugeben, erhalte ich viele unbekannte Bibliotheken. Überprüfen Sie das Maven Repository (https://mvnrepository.com/) auf solche Bibliotheken. Wenn Sie sich beispielsweise "android.arch.lifecycle: viewmodel" ansehen, wird die folgende Seite angezeigt (https://mvnrepository.com/artifact/android.arch.lifecycle/viewmodel).

pic3.jpg

Auf dieser Seite können Sie sehen, dass "android.arch.lifecycle: viewmodel" anscheinend Teil eines Android-Pakets mit dem Namen "Android Lifecycle ViewModel" ist und unter der Apache-Lizenz 2.0 vertrieben wird. Daher können Sie sehen, dass "android.arch.lifecycle: viewmodel" den Verteilungsbedingungen von Apache License 2.0 folgen sollte.

In der Tat wird es automatisch tun

Ich habe es schon lange erklärt, aber tatsächlich gibt es viele Android Studio-Plug-Ins, die die oben genannten Schritte automatisch ausgeben (und je nach Element sogar Aktivitäten zur Lizenzanzeige erstellen) **. Bitte lesen Sie den Artikel von @ tyoro.

Einige Bibliotheken, in die Lizenzanzeigen in Android-Apps eingebettet sind

Bonus: [Apache License 2.0] Kennen Sie die NOTICE-Datei

Sie fragen sich vielleicht: "Wenn Sie es automatisch tun, werden Sie es nicht mehr tun?" Es gibt jedoch einige Aufgaben, die beim Anzeigen der Lizenz zur Verwendung der mit Apache License 2.0 lizenzierten Bibliothek nicht automatisiert werden können. Es ist ein Hinweis auf den Inhalt der Zuschreibung.

Für Apache License 2.0 muss der Inhalt der von Ihnen verwendeten Bibliothek in der Dokumentation sichtbar sein, wenn sie eine Zuordnung aufweist. Die Datei, die den Inhalt dieser Zuordnung enthält, wird als NOTICE-Datei oder dergleichen bezeichnet.

Das Problem ist, dass in der Android-Welt (Java) NOTICE-Dateien im Allgemeinen durch Einbetten in Jars und Aars verteilt werden. Außerdem haben NOTICE-Dateien keinen festen Dateinamen oder kein festes Format. Mit anderen Worten, ** Sie müssen sich umschauen, um festzustellen, ob das von Ihnen verwendete Glas oder AAR eine Datei enthält, die der NOTICE-Datei entspricht **.

Das Verfahren zur effizienten Überprüfung (?) Mit Android Studio wird unten erläutert.

  1. Klicken Sie im Projektfenster auf das Kombinationsfeld "Android" image.png
  2. Wählen Sie "Projekt" aus der Liste der Kombinationsfelder, um die Anzeige zu wechseln.
  3. Wählen Sie unter "Externe Bibliotheken" die Bibliothek aus, deren Inhalt Sie sehen möchten image.png

Sie können alle abhängigen Bibliotheken in Android Studio sehen, oder?

Lassen Sie uns nun überprüfen, ob das Android Lifecycle View-Modell eine NOTICE-Datei enthält. Wenn Sie sich in Gradle: android.arch.lifecycle: viewmodel-1.1.1 vertiefen ...

image.png

Es gab eine unbekannte Datei namens "android.arch.lifecycle_viewmodel.version" in "META-INF", aber als ich hineinschaute, beschrieb sie wirklich nur die Versionsinformationen, wie der Dateiname andeutet. Anscheinend gibt es keine NOTICE-Datei im Android Lifecycle View-Modell, da es keine anderen Dateien gibt.

Als nächstes überprüfen wir, ob der Commons-Codec von Apache eine NOTICE-Datei enthält. Wenn Sie sich in Gradle: commons-codec: commons-codec: 1.11 @ jar vertiefen ...

image.png

Ich habe NOTICE.txt in META-INF von commons-codec-1.11.jar gefunden. Wenn Sie NOTICE.txt öffnen, können Sie sehen, dass der Inhalt der Zuordnung (Kreditinformationen) geschrieben ist. Es scheint, dass diese Beschreibung in der Lizenzanzeige zitiert werden sollte.

Diesmal existierte die NOTICE-Datei mit dem Pfad "META-INF / NOTICE.txt", aber es ist nicht ungewöhnlich, dass einige Bibliotheken mit völlig anderen Dateinamen und Dateipfaden existieren. Lassen Sie uns geduldig suchen.

abschließend

Das Verteilen von Software, die nicht den Lizenzbestimmungen entspricht, kann im schlimmsten Fall vom Autor verklagt werden und zu einem Test führen. Behandeln Sie die lizenzierte Software ordnungsgemäß.

Recommended Posts

Verstehst du wirklich So überprüfen Sie die von der App verwendete Bibliothek und Lizenz
So ersetzen Sie Zeichen, die Sie nicht verstehen [Prinzip]
So überprüfen Sie die Erweiterung und Größe der hochgeladenen Dateien
Wie installiere ich die in Ubuntu verwendete Sprache und wie erstelle ich die Umgebung?
Was tun, wenn Ihnen der von swagger-codegen-cli generierte Code nicht gefällt?
[Rails] So wenden Sie das in der Hauptanwendung verwendete CSS mit Administrate an
Wie schreibt man den ternären Operator (? :)
Wie man die Zehner und Einsen findet
Einbetten und Anzeigen von YouTube-Videos in Rails (Sie können die eingegebene URL auch durch Bearbeiten abrufen).
Was tun, wenn Sie das mit bootstrap-select erstellte Auswahlfeld nicht aktivieren können?
Anzeigen der vom Docker-Container verwendeten Festplattenmenge für jeden Container
[Rails] So bestimmen Sie das Ziel anhand von "Rails-Routen"
So überprüfen Sie das Protokoll im Docker-Container
So finden Sie die Gesamtpunktzahl und die Durchschnittspunktzahl
So überprüfen Sie Rails-Befehle im Terminal
[Java] So erhalten Sie den Schlüssel und den Wert, die in Map gespeichert sind, durch iterative Verarbeitung
So kehren Sie durch Wischen zum vorherigen Bildschirm zurück
So wechseln Sie zum Detailbildschirm, indem Sie auf das Bild klicken
So überprüfen Sie standardmäßig nur eine RadioButton-Prüfung (Hinweis)
Wie man denkt, wenn man plötzlich etwas über Generika versteht
In der Abbildung verstandene Java-Klassen und -Instanzen
[Linux] Einfacher Kommentar! So überprüfen und ändern Sie Berechtigungen
[Android] So überprüfen Sie, ob der Google Play-Entwicklerdienst beim Starten der Anwendung installiert ist
Überprüfen Sie, wie Sie das Zeitlimit festlegen, wenn Sie eine Verbindung zu Spring + HikariCP + MySQL herstellen und SQL ausführen
Ich habe versucht, eine App zu erstellen, mit der Sie nach Genre posten und chatten können ~ Übersicht über die App ~