AboutLibraries is a library to offer some information of libraries.

Overview

AboutLibraries

.. allows you to easily create an used open source libraries fragment/activity within your app. All the library information is automatically collected from the POM information of your dependencies and included during compile time. No runtime overhead. Strong caching. Any dependency is supported.


What's included πŸš€ β€’ Setup πŸ› οΈ β€’ Migration Guide 🧬 β€’ WIKI πŸ“– β€’ Used by β€’ Sample App


What's included πŸš€

  • used open source libraries
    • name, description, creator, license, version, ...
  • about this app section (optional)
  • autodetect libraries (via the gradle dependencies)
  • many included library details
  • automatic created fragment/activity
  • feature rich builder to simply create and start the fragment / activities
  • large amount of configuration options
    • usage standalone possible too
  • much much more... try the sample for a quick overview.

Screenshots

Image

Setup

Latest releases πŸ› 

Gradle Plugin

As a new feature of the AboutLibraries v8.x.y we offer a gradle plugin which will resolve the dependency during compilation, and only includes the libraries which are really specified as dependencies.

// Root build.gradle
classpath "com.mikepenz.aboutlibraries.plugin:aboutlibraries-plugin:${latestAboutLibsRelease}"

// App build.gradle
apply plugin: 'com.mikepenz.aboutlibraries.plugin'

Using Maven

The AboutLibraries Library is pushed to Maven Central. The gradle plugin is hosted via Gradle Plugins.

CORE module

implementation "com.mikepenz:aboutlibraries-core:${latestAboutLibsRelease}"

UI module

implementation "com.mikepenz:aboutlibraries:${latestAboutLibsRelease}"

//required support lib modules
implementation "androidx.appcompat:appcompat:${versions.appcompat | 1.x.y}"
implementation "androidx.cardview:cardview:${versions.cardview | 1.x.y}"
implementation "androidx.recyclerview:recyclerview:${versions.recyclerview | 1.1.y}"
implementation "com.google.android.material:material:${versions.material | 1.1.y}"

Basic Usage

You can use this library in a few different ways. Create your own activity, including a custom style or just use its generated information. Or simply use the built-in Activity or Fragment and just pass the libs you would love to include.

Activity / Fragment

NOTE: These integrations require the ui-module

Activity

LibsBuilder()
    .start(this) // start the activity

The activity uses a toolbar, which requires the appropriate theme. See Style the AboutLibraries for more details

Fragment

val fragment = LibsBuilder()
    .withFields(R.string::class.java.fields) // in some cases it may be needed to provide the R class, if it can not be automatically resolved
    .withLibraryModification("aboutlibraries", Libs.LibraryFields.LIBRARY_NAME, "_AboutLibraries") // optionally apply modifications for library information
    .supportFragment()

Gradle API

The gradle plugin will automatically run when building the application, so no action is required to build the library information showed / retrieved via the Libs class. But there are additional commands which may be helpful for various situations.

Export Library information

./gradlew exportLibraries // exists also per variant

Exports all libraries in a CSV format with the name, artifactId, and licenseId. And a seperate list with all licenses used, and a potential list of unmatched libraries / licenses.

Find

./gradlew findLibraries

Finds all included libraries with their name, and the unique AboutLibraries identifier which can be used to modify libraries and their information, or create custom mapping information if required. See the Config section for more information.

Advanced Usage

Jetpack navigation

Include the AboutLibraries destination in your graph

<include app:graph="@navigation/aboutlibs_navigation" />

After that you can define it as your target

<action
    android:id="@+id/action_x_to_about_libs"
    app:destination="@id/about_libraries" />

To configure provide the LibsBuilder as the data argument

Access generated library details

If you want to create your own integration you can access the generated library information programmatically through the core module.

val libraries = Libs(this).libraries
for (lib in libraries) {
    Log.e("AboutLibraries", "${lib.libraryName} from ${lib.author}")
}

About this App UI

You can also use the AboutLibraries activity as an "about this app" screen. Add the following .xml file (or just the strings - the key must be the same) to your project.

<resources>
    <string name="aboutLibraries_description_showIcon">true</string>
    <string name="aboutLibraries_description_showVersion">true</string>
    <string name="aboutLibraries_description_text">Place your description here :D</string>
</resources>

or use the builder and add following:

	.withAboutIconShown(true)
	.withAboutVersionShown(true)
	.withAboutDescription("This is a small sample which can be set in the about my app description file.<br /><b>You can style this with html markup :D</b>")

Style the AboutLibraries πŸ–ŒοΈ

Create your custom style. If you don't need a custom theme see the next section, how you can set the colors just by overwriting the original colors.

// define a custom style
<style name="CustomAboutLibrariesStyle" parent="">
    <!-- AboutLibraries specific values -->
    <item name="aboutLibrariesCardBackground">?cardBackgroundColor</item>
    <item name="aboutLibrariesDescriptionTitle">?android:textColorPrimary</item>
    <item name="aboutLibrariesDescriptionText">?android:textColorSecondary</item>
    <item name="aboutLibrariesDescriptionDivider">@color/opensource_divider</item>
    <item name="aboutLibrariesOpenSourceTitle">?android:textColorPrimary</item>
    <item name="aboutLibrariesOpenSourceText">?android:textColorSecondary</item>
    <item name="aboutLibrariesSpecialButtonText">?android:textColorPrimary</item>
    <item name="aboutLibrariesOpenSourceDivider">@color/opensource_divider</item>
</style>

// define the custom styles for the theme
<style name="SampleApp" parent="Theme.MaterialComponents.Light.NoActionBar">
    ...
    <item name="aboutLibrariesStyle">@style/CustomAboutLibrariesStyle</item>
    ...
</style>

Gradle Plugin Configuration

It is possible to provide custom configurations / adjustments to the automatic detection. This can be done via the gradle plugin.

aboutLibraries {
    configPath = "config" // the path to the directory relative to the root of the whole project containing configuration files
}

This directory may contain one or more of the following configurations:

custom_enchant_mapping.prop // allows providing custom mapping files to overwrite the information from the POM file
custom_license_mappings.prop // allows defining the licenseId which should be used for the library (if not resolvable via the POM file)
custom_license_year_mappings.prop // allows defining the license Year for this library (this information CANNOT be resolved from the POM file)
custom_name_mappings.prop // allows overwriting the name of a library if the POM specifies unexpected information
custom_author_mappings.prop // allows overwriting the authors of a library if the POM specifies unexpected information
custom_exclusion_list.prop // allows excluding libraries by their id at build time

See the corresponding files here for the format and content: https://github.com/mikepenz/AboutLibraries/tree/develop/aboutlibraries-definitions/src/main/res/raw

Exclude libraries

This is mainly meant for internal libraries, or projects. Full attribution to used projects is appreciated.

aboutLibraries {
    // allows to specify regex patterns to exclude some libraries
    // preferred for internal libraries, ...
    // The regex applies onto the uniqueId. E.g.: `com_mikepenz__materialdrawer`
    // specify with the groovy regex syntax.
    exclusionPatterns = [~"com_.*", ~/com_mylibrary_.*/]
}

Include undetected licenses

Only licenses from gradle dependencies with matching pom information are loaded. You may need to manually include some licenses if they are missing. Required identifiers can be found in the License.kt class.

aboutLibraries {
    // Licenses specified here will be included even if undetected.
    additionalLicenses {
        mit
        mpl_2_0
        LGPL_2_1_or_later
    }
}

Alternatively all licenses can be included in the project.

NOTE: Doing this will include extra string resources in your project.

aboutLibraries {
    includeAllLicenses = true
}

Custom Licenses

It is possible to add additional licenses. In order to do so, you have to add the content of the license as an own text file in the app's raw folder e.g. app/src/main/res/raw/myLicense.txt This file will contain the full raw license text which may be too long for the strings.xml file.

<h3>GNU GENERAL PUBLIC LICENSE</h3>

<p>Version 2, June 1991</p>

<p>
Copyright &copy; 1989, 1991 Free Software Foundation, Inc.<br/>
51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA<br/><br/>

Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.

Next, you need to add string identifiers that allow the plugin to recognize the license.

<!-- identifier used to reference this license -->
<string name="define_license_myLicense" translatable="false" />
<string name="license_myLicense_licenseName" translatable="false">Custom License</string>
<string name="license_myLicense_licenseWebsite" translatable="false">https://www.gnu.org/licenses/gpl-2.0.html</string>
<string name="license_myLicense_licenseShortDescription" translatable="false">
        <![CDATA[
        <p>&lt;one line to give the program\'s name and a brief idea of what it does.&gt;
        Copyright &copy; &lt;year&gt;  &lt;name of author&gt;</p>
        <p>This program is free software; you can redistribute it and/or
        modify it under the terms of the GNU General Public License
        as published by the Free Software Foundation; either version 2
        of the License, or (at your option) any later version.</p>
        <p>This program is distributed in the hope that it will be useful,
        but WITHOUT ANY WARRANTY; without even the implied warranty of
        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        GNU General Public License for more details.</p>
        <p>You should have received a copy of the GNU General Public License
        along with this program; if not, write to the Free Software
        Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.</p>
        ]]>
    </string>
<!-- name of the license file under the raw folder -->
<string name="license_myLicense_licenseDescription" translatable="false">raw:myLicense</string>

Finally, you have to use the specified identifier myLicense when referencing this license in your mappings.

Custom Libraries

In case the plugin fails to detect a library or you're using an embedded library, you can manually add an entry that will be picked up by the plugin. All you have to do is define custom string identifiers for the library.

<resources>
    <!-- identifier used to reference this library -->
    <string name="define_plu_myLibrary">year;owner</string>
    <string name="library_myLibrary_author">Author</string>
    <string name="library_myLibrary_authorWebsite">https://mikepenz.dev</string>
    <string name="library_myLibrary_libraryName">My Library</string>
    <string name="library_myLibrary_libraryDescription">Some text</string>
    <string name="library_myLibrary_libraryVersion">10.1.1</string>
    <string name="library_myLibrary_libraryWebsite">https://mikepenz.dev</string>
    <!-- you can also reference custom licenses here e.g. myLicense -->
    <string name="library_myLibrary_licenseIds">apache_2_0</string>
    <string name="library_myLibrary_isOpenSource">true</string>
    <string name="library_myLibrary_repositoryLink">https://mikepenz.dev</string>
    <!-- Custom variables section -->
    <string name="library_myLibrary_owner">Owner</string>
    <string name="library_myLibrary_year">2020</string>
</resources> 

Usage WITHOUT gradle plugin (deprecated)

If you do not want to use the gradle plugin, you need to add the legacy definition files, which will then be included in the built apk, and resolved via reflection during runtime.

NOTE: This is not recommended. Please migrate to use the gradle plugin

implementation "com.mikepenz:aboutlibraries-definitions:${latestAboutLibsRelease}"

ProGuard

ProGuard / R8 rules are bundled internally with the core module.

Please check the configuration in regards to passing in the fields .withFields(R.string::class.java.fields)

Disclaimer

This library uses all compile time dependencies (and their sub dependencies) as defined in your build.gradle file, this could lead to dependencies which are only used during compilation (and not actually distributed in your app) to be listed or missing in the attribution screen. It might also fail to identify licenses if the dependencies do not define it properly in their pom.xml file.

Careful optimisation and review of all licenses is recommended to really include all required dependencies. The use of the gradle commands like findLibraries can help doing this.

It is also important that native sub dependencies can not be resolved automatically as they are not included via gradle. Additional dependencies can be provided via this plugins API to extend and provide any additional details.

Used by

(feel free to send me new projects)

Developed By

License

Copyright 2021 Mike Penz

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Comments
  • v10 Feedback

    v10 Feedback

    v10 is the brand new and major upgrade to AboutLibraries. It comes with a whole new data structure, a kotlin multiplatform core, and a new kotlin multiplatform compose (desktop / android) module.

    Significantly simplified and cleaned up code base.

    Use the plugin to generate the dependency information

    • automatically for android builds -> always new information
    • partially automatic for all gradle builds -> commit as part of SCM and be in full control

    v10 also comes with a new design, with an early simplified UI showing the major details about used dependencies.


    Getting started

    Build

    // Root build.gradle
    classpath "com.mikepenz.aboutlibraries.plugin:aboutlibraries-plugin:10.0.0-b06"
    
    // App build.gradle
    apply plugin: 'com.mikepenz.aboutlibraries.plugin'
    
    // Compose UI | App build.gradle
    implementation "com.mikepenz:aboutlibraries-compose:10.0.0-b06"
    

    App

    LibrariesContainer(
        Modifier.fillMaxSize(),
        contentPadding = rememberInsetsPaddingValues(
            insets = LocalWindowInsets.current.systemBars,
            applyTop = true,
            applyBottom = true,
        )
    )
    

    https://github.com/mikepenz/AboutLibraries/blob/feature/remote_licenses/app/src/main/java/com/mikepenz/aboutlibraries/sample/ComposeActivity.kt#L44-L51


    v10 is currently developed on this branch



    v10 is still in alpha, which is the perfect time to get feedback and learn about additional needs to make the v10 the best release of it ever!

    enhancement help wanted question feature 
    opened by mikepenz 34
  • Some library metadata is not recognized or is 'null'

    Some library metadata is not recognized or is 'null'

    Follow-up of https://github.com/mikepenz/AboutLibraries/issues/460#issue-544532388 for cases when more than license is missing. Environment is the same.

    Some data like author, group, description is either missing or shown as literal null. Some of them may be caused by no data provided by authors.

    Affected libraries:

    • https://github.com/tommybuonomo/dotsindicator
    • https://github.com/zxing/zxing
    • https://github.com/ota4j-team/opentest4j
    • https://github.com/ChuckerTeam/chucker
    • https://github.com/square/okhttp
    • https://github.com/junit-team/junit5

    Actual results: image image image image

    enhancement 
    opened by koral-- 26
  • Jetpack Compose UI?

    Jetpack Compose UI?

    About this issue

    • Briefly describe the issue The current app I am working on is built completely with Jetpack Compose UI components. Is there a plan to implement the Licenses UI with Compose? The reason for this would be to rely in Design tokens (theme, fonts, colors) from the Compose Theming functionality.

    Details

    • [ 8.9.4]Β Used library version
    • [ ]Β Used support library version
    • [ ]Β Used gradle build tools version
    • [ 2020.3.1 patch 3]Β Used tooling / Android Studio version
    • [ ]Β Other used libraries, potential conflicting libraries

    Checklist

    enhancement 
    opened by adrianlandborn 23
  • Minify + Shrink resources removes String resources

    Minify + Shrink resources removes String resources

    Obviously this is the case, and it can be fixed by keeping the R class, but I was wondering if there is hopefully a better alternative somehow. -keepresources looked promising but it seems to be a dexguard feature rather than a proguard feature.

    In comparison, keeping all the R classes adds around 60kb to a < 3mb app, which is somewhat significant.

    question 
    opened by AllanWang 20
  • LibsActivity leaked 61KB

    LibsActivity leaked 61KB

    LeakCanary

    • com.mikepenz.aboutlibraries.ui.LibsActivity has leaked:
    • GC ROOT static android.os.UserManager.sInstance
    • references android.os.UserManager.mContext
    • references android.app.ContextImpl.mOuterContext
    • leaks com.mikepenz.aboutlibraries.ui.LibsActivity instance

    Details:

    • Class android.os.UserManager

    | static DISALLOW_ADJUST_VOLUME = java.lang.String@1869326016 (0x6f6ba6c0) | static DISALLOW_CONFIG_BLUETOOTH = java.lang.String@1869326104 (0x6f6ba718) | static DISALLOW_SAFE_BOOT = java.lang.String@1869327352 (0x6f6babf8) | static sInstance = android.os.UserManager@321253488 (0x1325f070) | static DISALLOW_CONFIG_WIFI = java.lang.String@1869326472 (0x6f6ba888) | static ALLOW_PARENT_PROFILE_APP_LINKING = java.lang.String@1869038592 (0x6f674400) | static DISALLOW_SMS = java.lang.String@1869327448 (0x6f6bac58) | static DISALLOW_WALLPAPER = java.lang.String@1869327648 (0x6f6bad20) | static DISALLOW_FUN = java.lang.String@1869326808 (0x6f6ba9d8) | static DISALLOW_ADD_USER = java.lang.String@1869325976 (0x6f6ba698) | static DISALLOW_DEBUGGING_FEATURES = java.lang.String@1869326696 (0x6f6ba968) | static DISALLOW_SHARE_LOCATION = java.lang.String@1869327392 (0x6f6bac20) | static DISALLOW_CROSS_PROFILE_COPY_PASTE = java.lang.String@1869326624 (0x6f6ba920) | static DISALLOW_RECORD_AUDIO = java.lang.String@1869327256 (0x6f6bab98) | static DISALLOW_CONFIG_MOBILE_NETWORKS = java.lang.String@1869326296 (0x6f6ba7d8) | static DISALLOW_CONFIG_CELL_BROADCASTS = java.lang.String@1869326160 (0x6f6ba750) | static DISALLOW_CREATE_WINDOWS = java.lang.String@1869326568 (0x6f6ba8e8) | static DISALLOW_APPS_CONTROL = java.lang.String@1869326520 (0x6f6ba8b8) | static TAG = java.lang.String@1869005856 (0x6f66c420) | static DISALLOW_CONFIG_VPN = java.lang.String@1869326424 (0x6f6ba858) | static DISALLOW_REMOVE_USER = java.lang.String@1869327304 (0x6f6babc8) | static DISALLOW_INSTALL_APPS = java.lang.String@1869326840 (0x6f6ba9f8) | static DISALLOW_UNMUTE_MICROPHONE = java.lang.String@1869327536 (0x6f6bacb0) | static DISALLOW_CONFIG_TETHERING = java.lang.String@1869326368 (0x6f6ba820) | static KEY_RESTRICTIONS_PENDING = java.lang.String@1869407304 (0x6f6ce448) | static ENSURE_VERIFY_APPS = java.lang.String@1869233952 (0x6f6a3f20) | static $staticOverhead = byte[312]@1873721977 (0x6faeba79) | static PIN_VERIFICATION_FAILED_INCORRECT = -3 | static DISALLOW_USB_FILE_TRANSFER = java.lang.String@1869327592 (0x6f6bace8) | static DISALLOW_MOUNT_PHYSICAL_MEDIA = java.lang.String@1869327200 (0x6f6bab60) | static DISALLOW_MODIFY_ACCOUNTS = java.lang.String@1869326960 (0x6f6baa70) | static DISALLOW_INSTALL_UNKNOWN_SOURCES = java.lang.String@1869326888 (0x6f6baa28) | static PIN_VERIFICATION_FAILED_NOT_SET = -2 | static DISALLOW_OUTGOING_BEAM = java.lang.String@1869327064 (0x6f6baad8) | static PIN_VERIFICATION_SUCCESS = -1 | static DISALLOW_CONFIG_CREDENTIALS = java.lang.String@1869326232 (0x6f6ba798) | static DISALLOW_UNINSTALL_APPS = java.lang.String@1869327480 (0x6f6bac78) | static DISALLOW_OUTGOING_CALLS = java.lang.String@1869327112 (0x6f6bab08) | static DISALLOW_NETWORK_RESET = java.lang.String@1869327016 (0x6f6baaa8) | static DISALLOW_FACTORY_RESET = java.lang.String@1869326760 (0x6f6ba9a8)

    • Instance of android.os.UserManager

    | static DISALLOW_ADJUST_VOLUME = java.lang.String@1869326016 (0x6f6ba6c0) | static DISALLOW_CONFIG_BLUETOOTH = java.lang.String@1869326104 (0x6f6ba718) | static DISALLOW_SAFE_BOOT = java.lang.String@1869327352 (0x6f6babf8) | static sInstance = android.os.UserManager@321253488 (0x1325f070) | static DISALLOW_CONFIG_WIFI = java.lang.String@1869326472 (0x6f6ba888) | static ALLOW_PARENT_PROFILE_APP_LINKING = java.lang.String@1869038592 (0x6f674400) | static DISALLOW_SMS =

    question 
    opened by Rainer-Lang 18
  • License text(s) incorrect?

    License text(s) incorrect?

    About this issue

    • Briefly describe the issue I'm not completely sure but shouldnt the license text for Eg. Apache 2.0 license also include these rows. Because the 'License' should/must include version and year/date of original Apache license and not only the lib Copyright year and owner.
    Apache License
    Version 2.0, January 2004
    http://www.apache.org/licenses/
    

    (source https://www.apache.org/licenses/LICENSE-2.0 and https://www.apache.org/licenses/LICENSE-2.0.txt)

    And then to follow your layout move this part with copyright to the top.

    Copyright [yyyy] [name of copyright owner]
    
    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at
    

    This should be valid for all licenses, not only Apache.

    • How can the issue be reproduced / sample code

    Details

    • [ ]Β Used library version
    • [ ]Β Used support library version
    • [ ]Β Used gradle build tools version
    • [ ]Β Used tooling / Android Studio version
    • [ ]Β Other used libraries, potential conflicting libraries

    Checklist

    enhancement help wanted 
    opened by adrianlandborn 16
  • Trim license before duplicate check

    Trim license before duplicate check

    I noticed that Apache 2.0 license sometimes begins with a newline character, sometimes not. This implies two 99.999% equal licenses in the output.

    I believe you could trim whitespaces when performing the check for duplicates.

    enhancement 
    opened by znakeeye 15
  • Problems with new Gradle Plugin

    Problems with new Gradle Plugin

    About this issue

    I am in the process of migrate my app to latest materialdrawer, iconics and aboutlibrares. The new Gradle Plugin works great, but produces some odd things which I wanted to report.

    | okhttp-brotli | iconics | LeakCanary | -- | -- | -- | | Screenshot_20200412-134318 | Screenshot_20200412-134334 | Screenshot_20200412-134359 |

    • okhttp-brotli seems to not resolve the name correctly (POM).
    • Iconics shows up twice (propably because of the internal library definition)? Happens for other libs with an internal definition also.
    • leakcanarys ObjectWatcher shows up many times (Not sure if these are multiple dependencies, but can't see because of the truncated title).

    Usage

    LibsBuilder()
        .withAutoDetect(false)
        .withShowLoadingProgress(false)
        .withAboutVersionShown(false)
        .withAboutIconShown(false)
        .withVersionShown(false)
        .withOwnLibsActivityClass(MyLibsActivity::class.java)
        .withActivityTitle(getString(R.string.about_licenses_activity_title))
        .start(requireActivity())
    

    Details

    • Used library version: 8.1.1
    • Used support library version: appcompat 1.2.0-beta01
    • Used gradle build tools version: 6.3
    • Used tooling / Android Studio version: 4.0.0-beta03
    • Other used libraries, potential conflicting libraries: None

    Checklist

    question 
    opened by rubengees 15
  • Licenses are missing in multi-module/multi-flavor project

    Licenses are missing in multi-module/multi-flavor project

    About this issue

    Some of the licenses are missing in our multi-module/multi-flavor project.

    I've run this code:

    val noLicenses = libraries.filter { it.license == null || it.license?.licenseName?.isEmpty() ?: false }.map { it.libraryName }
            Log.d("licenses", noLicenses.joinToString { "$it\n" })
    

    and got:

          AppsFlyerSDK
        , Android SDK Answers
        , Facebook-Common-Android-SDK
        , Facebook-Core-Android-SDK
        , Facebook-Login-Android-SDK
        , Stetho
        , Stetho OkHttp 3 module
        , Jackson-annotations
        , Aspsine/FragmentNavigator
        , robotoworks/composter
        , AutoValue Annotations
        , Gson
        , Guava InternalFutureFailureAccess and InternalFutures
        , Guava: Google Core Libraries for Java
        , Guava ListenableFuture only
        , Protocol Buffers [Lite]
        , ZXing Core
        , Onfido Android SDK Core
        , Bolts-Android
        , Bolts-AppLinks
        , Bolts-Tasks
        , OkHttp Logging Interceptor
        , MockWebServer
        , OkHttp
        , OkHttp URLConnection
        , OkHttp Logging Interceptor
        , OkHttp
        , Okio
        , Picasso
        , Adapter: RxJava 2
        , Converter: Gson
        , Converter: Java Scalars
        , Retrofit
        , Mobile Chat SDK
        , Mobile Chat API
        , Apache Commons CLI
        , Animal Sniffer Annotations
        , Hamcrest Core
        , reactive-streams
        , SLF4J API Module
        , ThreeTen backport
    

    I've also checked generated xml, for example for okhttp:

    <string name="define_plu_com_squareup_okhttp__okhttp"></string>
      <string name="library_com_squareup_okhttp__okhttp_libraryName">OkHttp</string>
      <string name="library_com_squareup_okhttp__okhttp_libraryDescription"><![CDATA[]]></string>
      <string name="library_com_squareup_okhttp__okhttp_libraryVersion"></string>
      <string name="library_com_squareup_okhttp__okhttp_libraryArtifactId">com.squareup.okhttp:okhttp:</string>
    
    enhancement 
    opened by ar-g 14
  • Problems with Proguard

    Problems with Proguard

    Thank you for your help all the time and also this time in advance!

    I have the following problem: When I build my App as a debug release, all the Libs show up. But when I build a release version with Proguard there are not all Libs. I tried to investigate why this happens, but I can't find a solution. I saw that all Libs with internal declarations are there (your other libs and my own) and also SOME other. It is really weird. For example the Lib 'Android Flow Layout' shows up, but 'Hello Charts' does not. Andorid Flow Layout does not have a proguard file that blocks obfuscation on it. (Or at least I dind't found it)

    I added the R class to my proguard-rules as you suggested in your README. These are my proguard rules:

    -keepclassmembers class * implements android.os.Parcelable {
        static android.os.Parcelable$Creator CREATOR;
    }
    
    //For Crashlytics
    -keepattributes SourceFile,LineNumberTable
    
    //For support libs
    -keep class !android.support.v7.internal.view.menu.**,android.support.** {*;}
    
    //For Play Services
    -dontwarn org.apache.http.**
    -dontwarn android.net.http.AndroidHttpClient
    -dontwarn com.google.android.gms.**
    -dontwarn com.android.volley.toolbox.**
    
    //For AboutLibraries
    -keep class .R
    -keep class .R$* {
        <fields>;
    }
    

    This is how I build the Activity:

    new LibsBuilder().withAboutIconShown(true).withAboutVersionShownName(true)
    .withAnimations(true).withAboutAppName(getString(R.string.app_name)).withAboutDescription("Some text")
    .withActivityTitle(getString(R.string.activity_about_title)).withFields(R.string.class.getFields())
    .withActivityStyle(Libs.ActivityStyle.LIGHT_DARK_TOOLBAR).start(getActivity());
    //Started from a Fragment
    

    This is a part of my build.gradle:

     release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
     }
    

    Note: Yes I tried plain proguard-android also.

    question 
    opened by rubengees 14
  • license information is not correctly shown

    license information is not correctly shown

    Version: 8.9.4

    In one of my projects, I include a third party library via a git submodule and wanted to add its library information to the about dialog. For that I created app/src/main/res/values/about_libraries.xml, containing

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
    
        <string name="define_plu_cert4android" translatable="false" />
        <string name="library_cert4android_author" translatable="false">Ricki Hirner</string>
        <string name="library_cert4android_authorWebsite" translatable="false">https://www.davx5.com/</string>
        <string name="library_cert4android_libraryName" translatable="false">cert4android</string>
        <string name="library_cert4android_libraryDescription" translatable="false">Android service + TrustManager for managing custom certificates in an app-private key store.</string>
        <string name="library_cert4android_libraryVersion" translatable="false">68f51b8</string>
        <string name="library_cert4android_repositoryLink" translatable="false">https://github.com/bitfireAT/cert4android</string>
        <string name="library_cert4android_isOpenSource" translatable="false">true</string>
        <string name="library_cert4android_licenseIds" translatable="false">gpl_3_0</string>
    
    </resources>
    

    In app/build.gradle, I added

    aboutLibraries {
        // Since no other library uses GPL 3.0 we need to include it manually.
        additionalLicenses {
            gpl_3_0
        }
    }
    

    The resulting about info activity looks like this: Screenshot_1640788425

    There are two issues here:

    • Instead of the string "gpl_3_0" I was expecting "GNU GPL 3.0"
    • Tapping on the license string does not show the license text or open a web browser redirecting to the license homepage
    question 
    opened by mbiebl 13
  • License for library Apache Commons CSV is empty

    License for library Apache Commons CSV is empty

    About this issue

    For all my used libraries the licenses are included but for library Apache Commons CSV it is empty. I checked the generated JSON file, too.

    Details

    • [x] Used library version: 10.5.2
    • [ ] Used support library version
    • [x] Used gradle build tools version: 7.3.1
    • [ ] Used tooling / Android Studio version
    • [ ] Other used libraries, potential conflicting libraries

    Checklist

    opened by chrgernoe 1
  • Support for third_party_licenses files from Google Play Services libraries

    Support for third_party_licenses files from Google Play Services libraries

    About this issue

    Can this plugin also include libraries depended upon by the Google Play services libraries, like the Google oss-licenses-plugin does?

    The list of licenses also includes the full license text of any library that is depended upon by the transitive closure of Google Play services libraries used by the app. This means that the list includes any open source libraries that are used to create the Google Play services libraries that are compiled into your app. https://developers.google.com/android/guides/opensource#how-licenses-are-determined

    In my case, compared to AboutLibraries, oss-licenses-plugin included additional 17 libraries because of Google Play services, and I'd prefer not to have to maintain it semi-manually and have to keep using oss-licenses-plugin to extract these licenses.

    From what I was able to find out, .aar files for Google libraries include third_party_licenses.json and third_party_licenses.txt files that are parsed to extract these libraries and their licenses. Unfortunately in this case there is no "artifact ID" that would correspond to the uniqueId from AboutLibraries, only the name.

    As an example of how this looks in the .aar file: https://stackoverflow.com/a/74617118/1916449

    Details

    • [x] Used library version: 10.5.2
    • [ ] Used support library version
    • [ ] Used gradle build tools version
    • [ ] Used tooling / Android Studio version
    • [ ] Other used libraries, potential conflicting libraries

    Checklist

    help wanted 
    opened by arekolek 6
  • Feature Request - exportPath dynamic for each build variant.

    Feature Request - exportPath dynamic for each build variant.

    About this issue

    • Briefly describe the issue I currently use a command like this to generate my aboutlicense.json file

    ./gradlew app:exportLibraryDefinitions -PaboutLibraries.exportPath=src/main/assets/ -PaboutLibraries.exportVariant=dimensionRelease

    Where dimension is different components of my build variant. Different variants will possibly have different included libraries e.g. a "pro" version of my app might include an extra library.

    When building the different versions of my app, free/pro etc, I'd like the output json file placed in the correct src/free/assets or src/pro/assets folders.

    It'd be great if exportPath could use the configuration of exportVariant to know where to place the file, perhaps making the path relative to dimension. e.g. -PaboutLibraries.exportPath=/assets/ PaboutLibraries.exportVariant=proRelease would place the file in src/pro/assets

    Details

    • [ ]Β Used library version - 10.5.1
    • [ ]Β Used support library version
    • [ ]Β Used gradle build tools version - 7.3.3
    • [ ]Β Used tooling / Android Studio version - Android Studio Flamingo, Canary 8
    • [ ]Β Other used libraries, potential conflicting libraries - Jetpack Compose 1.3

    Checklist

    question 
    opened by apkelly 3
  • Gradle task collectDependencies fails

    Gradle task collectDependencies fails

    About this issue

    I'm trying to integrate the plugin to collect dependencies in my project, this is my setup:

    in the plugins block of the project build.gradle.kts

    plugins {
        alias(libs.plugins.kotlin) apply false
        alias(libs.plugins.android) apply false
        alias(libs.plugins.googleServices) apply false
        alias(libs.plugins.firebaseCrashlytics) apply false
        alias(libs.plugins.navigationSafeArgs) apply false
        alias(libs.plugins.sentry) apply false
        alias(libs.plugins.fladle) apply false
        alias(libs.plugins.licenses) apply false
    }
    

    in my app build.gradle.kts

    plugins {
        id(libs.plugins.android.get().pluginId)
        id(libs.plugins.kotlin.get().pluginId)
        id("kotlin-parcelize")
        id(libs.plugins.googleServices.get().pluginId)
        id(libs.plugins.firebaseCrashlytics.get().pluginId)
        id(libs.plugins.navigationSafeArgs.get().pluginId)
        id(libs.plugins.sentry.get().pluginId)
        id(libs.plugins.fladle.get().pluginId)
        id(libs.plugins.licenses.get().pluginId)
    }
    

    I've tried running the plugin on a wide number of version of the plugin (10, 10.0.1, 10.1.0, 10.3.1) and everytime i get this error, while building or running only the collectDependencies task

    > Task :app:collectDependencies FAILED
    
    FAILURE: Build failed with an exception.
    
    * What went wrong:
    Execution failed for task ':app:collectDependencies'.
    > java.lang.StackOverflowError (no error message)
    
    * Try:
    > Run with --info or --debug option to get more log output.
    > Run with --scan to get full insights.
    
    * Exception is:
    org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:collectDependencies'.
            at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.lambda$executeIfValid$1(ExecuteActionsTaskExecuter.java:147)
            at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:282)
            at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:145)
            at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:133)
            at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:77)
            at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
            at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)
            at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
            at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
            at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
            at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
            at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
            at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
            at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
            at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
            at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
            at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
            at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
            at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
            at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
            at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
            at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
            at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:74)
            at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:333)
            at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:320)
            at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:313)
            at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:299)
            at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:143)
            at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:227)
            at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:218)
            at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:140)
            at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
            at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
    Caused by: java.lang.StackOverflowError
            at org.gradle.api.internal.artifacts.DefaultResolvedDependency$ResolvedArtifactComparator.compare(DefaultResolvedDependency.java:205)
            at org.gradle.api.internal.artifacts.ivyservice.ArtifactCollectingVisitor.visitArtifact(ArtifactCollectingVisitor.java:47)
            at org.gradle.api.internal.artifacts.ivyservice.resolveengine.artifact.ArtifactBackedResolvedVariant$SingleArtifactSet.visit(ArtifactBackedResolvedVariant.java:143)
            at org.gradle.api.internal.artifacts.ivyservice.resolveengine.artifact.ParallelResolveArtifactSet$VisitingSet$StartVisitAction.visitResults(ParallelResolveArtifactSet.java:100)
            at org.gradle.api.internal.artifacts.ivyservice.resolveengine.artifact.ParallelResolveArtifactSet$VisitingSet.visit(ParallelResolveArtifactSet.java:69)
            at org.gradle.api.internal.artifacts.DefaultResolvedDependency.sort(DefaultResolvedDependency.java:129)
            at org.gradle.api.internal.artifacts.DefaultResolvedDependency.getModuleArtifacts(DefaultResolvedDependency.java:107)
            at org.gradle.api.internal.artifacts.DefaultResolvedDependency.getAllModuleArtifacts(DefaultResolvedDependency.java:113)
            at org.gradle.api.internal.artifacts.DefaultResolvedDependency.getAllModuleArtifacts(DefaultResolvedDependency.java:115)
            at org.gradle.api.internal.artifacts.DefaultResolvedDependency.getAllModuleArtifacts(DefaultResolvedDependency.java:115)
      at org.gradle.api.internal.artifacts.DefaultResolvedDependency.getAllModuleArtifacts(DefaultResolvedDependency.java:115)
            at org.gradle.api.internal.artifacts.DefaultResolvedDependency.getAllModuleArtifacts(DefaultResolvedDependency.java:115)
            at org.gradle.api.internal.artifacts.DefaultResolvedDependency.getAllModuleArtifacts(DefaultResolvedDependency.java:115)
            at org.gradle.api.internal.artifacts.DefaultResolvedDependency.getAllModuleArtifacts(DefaultResolvedDependency.java:115)
            at org.gradle.api.internal.artifacts.DefaultResolvedDependency.getAllModuleArtifacts(DefaultResolvedDependency.java:115)
            at org.gradle.api.internal.artifacts.DefaultResolvedDependency.getAllModuleArtifacts(DefaultResolvedDependency.java:115)
            at org.gradle.api.internal.artifacts.DefaultResolvedDependency.getAllModuleArtifacts(DefaultResolvedDependency.java:115)
            at org.gradle.api.internal.artifacts.DefaultResolvedDependency.getAllModuleArtifacts(DefaultResolvedDependency.java:115)
            at org.gradle.api.internal.artifacts.DefaultResolvedDependency.getAllModuleArtifacts(DefaultResolvedDependency.java:115)
    
    

    on the legacy 8.9.4 version there are no issues.

    Details

    • gradle 7.4.2 other plugin versions:
    • googleServices = "4.3.10"
    • firebaseCrashlytics = "2.9.1"
    • sentry = "3.1.2"
    • kotlin = "1.7.0"
    • android = "7.2.1"
    • fladle = "0.17.4"
    • navigation safe args = "2.5.0-rc02"
    help wanted 
    opened by eriksquare 8
  • Missing AboutLibraries dependency in collected dependencies

    Missing AboutLibraries dependency in collected dependencies

    About this issue

    Just like in the title, for some reason AboutLibraries is not listed as dependency in the licenses output. This happens in my free-time project, a lot is going on here, so not sure what part caused this error: https://github.com/ILikeYourHat/Large-Scale-Android-App

    AboutLibraries configuration is located in 'gradle/extension/libs/about_libraries.gradle'. Also note dependencies are generated from ':app' module, but consumed in ':settings' module.

    Details

    • :white_check_mark:Β Used library version - 10.0.0
    • :white_check_mark:Β Used gradle build tools version - 7.1.2
    • :white_check_mark:Β Used tooling / Android Studio version - AS Bumblebee Path 2
    • :white_check_mark:Β Other used libraries, potential conflicting libraries - many πŸ™‚

    Checklist

    help wanted 
    opened by ILikeYourHat 18
Releases(v10.6.0-b01)
It makes a preview from an url, grabbing all the information such as title, relevant texts and images. This a version for Android of my web link preview https://github.com/LeonardoCardoso/Link-Preview

LeoCardz Link Preview for Android It makes a preview from an url, grabbing all the information such as title, relevant texts and images. Visual Exampl

Leonardo Cardoso 420 Nov 19, 2022
Google core libraries for Java

Guava: Google Core Libraries for Java Guava is a set of core Java libraries from Google that includes new collection types (such as multimap and multi

Google 46.5k Jan 1, 2023
Purpose for this base architectural project is to load it with all latest components and libraries So it become reference for all kind of Android projects

The purpose of this base architectural project is to load it with all the latest components and libraries, So it becomes a reference for all kinds of Android projects

null 7 Dec 7, 2021
****. Use the native and support library variants instead - https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml.html. An android library that makes it easy to add custom fonts to edittexts and textviews

Add to your project Add this line to your dependencies in build.gradle compile 'in.workarounds.typography:typography:0.0.8' Using the views There are

Workarounds 43 Nov 6, 2021
Starter-Android-Library - Starter Android Library is an Android Project with Modular Architecture.

Starter-Android-Library - Starter Android Library is an Android Project with Modular Architecture.

OpenBytes 1 Feb 18, 2022
ZXing ("Zebra Crossing") barcode scanning library for Java, Android

Project in Maintenance Mode Only The project is in maintenance mode, meaning, changes are driven by contributed patches. Only bug fixes and minor enha

ZXing Project 30.5k Dec 27, 2022
An android library for displaying fps from the choreographer and percentage of time with two or more frames dropped

DEPRECATED TinyDancer is deprecated. No more development will be taking place. Check out the Google Android developer documentation for UI performance

Friendly Robot 1.9k Jan 3, 2023
Android Library to help you with your runtime Permissions.

PermissionHelper Android Library to help you with your runtime Permissions. Demo Android M Watch it in action. Pre M Watch it in action. Nexus 6 (M) N

Kosh Sergani 1.2k Dec 14, 2022
Android validation library which helps developer boil down the tedious work to three easy steps.

AwesomeValidation Introduction Implement validation for Android within only 3 steps. Developers should focus on their awesome code, and let the librar

Jing Li 1.1k Dec 17, 2022
A plug and play ;) android library for displaying a "rate this app" dialog

Easy Rating Dialog This lib provides a simple way to display an alert dialog for rating app. Default conditions to show: User opened the app more than

Fernando MartΓ­nez 111 Dec 30, 2022
Android library that manages your app's cached data with ease.

Teller Android library that makes your apps faster. Teller facilitates the downloading, saving, and reading of the cached data of your app. Keep your

Levi Bostian 14 Apr 2, 2022
Tutorial For openJDK 11 and AGP 7.0.0+ | Tutorial Multi Library Android in 1 Project | Groovy

jitpack-library-guide For openJDK 11 and AGP 7.0.0 + Please read every single note for detail Tutorial Click Here Kotlin DSL Click Here Repository for

Faisal Amir 7 Dec 10, 2022
Makes Google play in app purchase library (BillingClient) into a flowable that can easily be used in compose world

Billy the android Our goal is to make a modern api of BillingClient so that it is easier to use in compose world. This library is still early beta and

Stefan WΓ€rting 16 Dec 14, 2022
Simple Artificial Neural Network java library

SANN Simple Artificial Neural Network java library WIP Creating neural network Variant 1 //create new net (input, hidden, default len, output) Net net

Korpusov Maxim 14 Oct 11, 2022
Using Resilience4J, this is a Demo project which uses a Library as background and manages all its requests.

Using Resilience4J, this is a Demo project which uses a Library as background and manages all its requests. This library can rent books online and the usage rate is extremely high. There is a reactive way to access, which is the one normally used, but sometimes, the system needs a bit of help from an old machine running a non-reactive MVC Spring application using JPA. Let's make this in Kotlin and find the best solution!

JoΓ£o Filipe Sabino Esperancinha 2 Jan 10, 2022
A library to display pokemon with Shakespearean descriptions

Pokemon Shakespeare SDK A library to display pokemon with Shakespearean descriptions Dependencies Java 11 Retrofit Picasso Material Appcompat Usage Cr

Keenen Charles 0 Nov 12, 2021
ArduinoJava - A project that uses the JSSC library

ArduinoJava este es un proyecto que utiliza la libreria JSSC para connectarse al

null 0 Jan 24, 2022
Editframe Kotlin Client library

Editframe Kotlin Client library Installing Add the project to your gradle dependencies.

editframe 2 Apr 7, 2022
Open-source Desktop library to connect Alsat pardakht peyment API

Open-source Desktop library to connect Alsat pardakht peyment API

Alsat Pardakht 3 Apr 4, 2022