TL;DR
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.
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.
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.
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.
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).
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.
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
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.
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 ...
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 ...
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.
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