AboutLibraries
.. 在编译时收集所有依赖项的详细信息(包括许可证),并提供简单的API在应用程序中可视化这些信息。 无运行时开销。 强大的缓存。支持任何gradle依赖。
包含内容 🚀 • 设置 🛠️ • Gradle API️ • SDK文档 📖 • 插件文档 📖 • 迁移指南 🧬 • 示例应用
包含内容 🚀
- 支持Kotlin多平台(包括wasm)
- 轻量级多平台核心模块
- 访问所有生成的信息
- 构建自定义UI
- Compose UI模块
- Gradle插件
- 生成依赖/许可证元数据
- 不同的导出选项,合规性报告
- 识别可能的项目资金
- 许可证严格模式
- 简单快速集成
截图
设置
最新发布版本 🛠
- Kotlin 2.x && 多平台 && Compose && 插件 | v11.2.2
Gradle插件
AboutLibraries v10包含一个完全重做的插件,支持构建缓存。它包括根据gradle配置找到的所有依赖项。
gradle插件通过Gradle Plugins托管。
使用plugins DSL(单个模块)
// 根build.gradle
id 'com.mikepenz.aboutlibraries.plugin' version "${latestAboutLibsRelease}" apply false
// 应用build.gradle
id 'com.mikepenz.aboutlibraries.plugin'
使用plugins DSL(整个项目)
// 根build.gradle
id 'com.mikepenz.aboutlibraries.plugin' version "${latestAboutLibsRelease}"
使用传统插件应用方式
// 根build.gradle
classpath "com.mikepenz.aboutlibraries.plugin:aboutlibraries-plugin:${latestAboutLibsRelease}"
// 应用build.gradle
apply plugin: 'com.mikepenz.aboutlibraries.plugin'
Gradle插件配置
Gradle插件配置
可以通过gradle插件提供自定义配置/调整自动检测。
aboutLibraries {
// - 如果禁用了自动注册的android任务,可以手动实现类似功能
// - `./gradlew app:exportLibraryDefinitions -PaboutLibraries.exportPath=src/main/res/raw`
// - 生成的文件可以作为SCM的一部分添加
registerAndroidTasks = false
// 定义输出文件名。修改此项将禁用支持平台的自动元数据发现。
outputFileName = "aboutlibraries.json"
// 定义配置文件所在的路径。例如额外的库、要添加到目标.json的许可证
// 警告:请不要使用模块的父文件夹作为路径,这可能会导致问题。更多详情:https://github.com/mikepenz/AboutLibraries/issues/936
configPath = "config"
// 允许启用"离线模式",将禁用插件的任何网络检查(包括[fetchRemoteLicense]或拉取spdx许可证文本)
offlineMode = false
// 启用获取"远程"许可证。使用支持的源主机的API
// 参见 https://github.com/mikepenz/AboutLibraries#special-repository-support
fetchRemoteLicense = true
// 启用获取"远程"资金信息。使用支持的源主机的API
// 参见 https://github.com/mikepenz/AboutLibraries#special-repository-support
fetchRemoteFunding = true
// (可选)GitHub令牌,用于提高API请求限制以允许获取更多许可证
gitHubApiToken = getLocalOrGlobalProperty("github.pat")
// 此处提到的许可证ID的完整许可证文本将被包含,即使没有检测到依赖项使用它们。
additionalLicenses = ["mit", "mpl_2_0"]
// 允许从生成的元数据字段中排除一些字段。
excludeFields = ["developers", "funding"]
// 启用在库报告中包含`platform`依赖项
includePlatform = true
// 定义严格模式,如果项目使用不允许的许可证将失败
// - 这只会自动对启用了`registerAndroidTasks`的Android项目失败
// 对于非Android项目,执行`exportLibraryDefinitions`
strictMode = com.mikepenz.aboutlibraries.plugin.StrictMode.FAIL
// 允许使用的许可证集合,此项目将能够使用而不会导致构建失败
allowedLicenses = ["Apache-2.0", "asdkl"]
// 启用重复模式,允许合并或链接相关的依赖项
duplicationMode = com.mikepenz.aboutlibraries.plugin.DuplicateMode.LINK
// 配置重复规则,以匹配"重复项"
duplicationRule = com.mikepenz.aboutlibraries.plugin.DuplicateRule.SIMPLE
// 为生成的JSON文件启用美化打印
prettyPrint = false
// 允许在`collectDependencies`步骤中只收集特定变体的依赖项。
filterVariants = ["debug", "release"]
}
所有可用gradle插件配置的完整文档:https://github.com/mikepenz/AboutLibraries/blob/develop/plugin-build/plugin/src/main/kotlin/com/mikepenz/aboutlibraries/plugin/AboutLibrariesExtension.kt
修改库/许可证
插件提供了在定义的configPath
下的libraries
和licenses
目录中指定添加额外库或许可证的能力。
可以在这里看到:https://github.com/mikepenz/AboutLibraries/blob/develop/config/
库
通过每个库的.json
文件提供额外的或修改现有的库。
如果uniqueId
重叠,将进行合并。
{
"uniqueId": "com.mikepenz:materialdrawer",
"developers": [
{
"name": "Mike Penz",
"organisationUrl": "https://mikepenz.dev"
}
],
"description": "(合并)灵活、易用、适用于您的Android项目的一体化抽屉库。",
"name": "ABC MaterialDrawer Library",
"website": "https://github.com/mikepenz/MaterialDrawer"
}
许可证
通过每个许可证的.json
文件提供额外的或修改现有的许可证。
{
这是Android软件开发工具包许可协议
1. 简介
1.1 Android软件开发工具包(在本许可协议中称为"SDK",特别包括Android系统文件、打包的API和Google API附加组件)根据本许可协议的条款授权给您。本许可协议在您使用SDK方面构成您与Google之间具有法律约束力的合同。
1.2 "Android"是指为设备提供的Android软件栈,该软件栈可在Android开源项目下获得,网址为:http://source.android.com/,并会不时更新。
1.3 "兼容实现"是指任何符合以下条件的Android设备:(i)符合Android兼容性定义文档,该文档可在Android兼容性网站(http://source.android.com/compatibility)上找到,并可能不时更新;以及(ii)成功通过Android兼容性测试套件(CTS)。
1.4 "Google"是指Google LLC,一家特拉华州公司,主要营业地点位于美国加利福尼亚州山景城安菲剧院大道1600号,邮编94043。
2. 接受本许可协议
2.1 要使用SDK,您必须首先同意本许可协议。如果您不接受本许可协议,则不得使用SDK。
2.2 通过点击接受,您特此同意本许可协议的条款。
2.3 如果您是根据美国或其他国家(包括您居住或使用SDK的国家)法律被禁止接收SDK的人,则您不得使用SDK,也不得接受本许可协议。
2.4 如果您代表您的雇主或其他实体同意受本许可协议约束,则您声明并保证您拥有使您的雇主或该实体受本许可协议约束的全部法律权力。如果您没有必要的权力,则不得代表您的雇主或其他实体接受本许可协议或使用SDK。
3. Google授予的SDK许可
3.1 根据本许可协议的条款,Google授予您有限的、全球范围内的、免版税的、不可转让的、非独占的和不可再许可的许可,仅用于为Android的兼容实现开发应用程序。
3.2 您不得使用此SDK开发其他平台(包括不兼容的Android实现)的应用程序或开发另一个SDK。当然,您可以自由开发其他平台的应用程序,包括不兼容的Android实现,但不得将此SDK用于该目的。
3.3 您同意Google或第三方拥有SDK的所有法律权利、所有权和利益,包括SDK中存在的任何知识产权。"知识产权"是指专利法、版权法、商业秘密法、商标法以及任何其他所有权利下的任何和所有权利。Google保留所有未明确授予您的权利。
3.4 您不得将SDK用于本许可协议未明确允许的任何目的。除适用的第三方许可要求外,您不得复制(备份目的除外)、修改、改编、重新分发、反编译、反向工程、反汇编或创建SDK或其任何部分的衍生作品。
3.5 根据开源软件许可证获得许可的SDK组件的使用、复制和分发仅受该开源软件许可证的条款约束,而不受本许可协议约束。
3.6 您同意Google提供的SDK的形式和性质可能会在不事先通知您的情况下发生变化,并且SDK的未来版本可能与在SDK先前版本上开发的应用程序不兼容。您同意Google可自行决定永久或暂时停止向您或一般用户提供SDK(或SDK内的任何功能),而无需事先通知您。
3.7 本许可协议不赋予您使用Google任何商号、商标、服务标志、徽标、域名或其他显著品牌特征的权利。
3.8 您同意不会删除、遮蔽或更改可能附加或包含在SDK内的任何所有权声明(包括版权和商标声明)。
4. 您对SDK的使用
4.1 Google同意,根据本许可协议,它不会从您(或您的许可方)获得您使用SDK开发的任何软件应用程序的任何权利、所有权或利益,包括这些应用程序中存在的任何知识产权。
4.2 您同意仅将SDK用于以下目的,并仅编写符合以下要求的应用程序:(a)本许可协议允许的目的,以及(b)相关司法管辖区内任何适用法律、法规或普遍接受的做法或准则允许的目的(包括有关从美国或其他相关国家进出口数据或软件的任何法律)。
4.3 您同意,如果您使用SDK为普通公众用户开发应用程序,您将保护这些用户的隐私和法律权利。如果用户向您提供用户名、密码或其他登录信息或个人信息,您必须让用户意识到该信息将可供您的应用程序使用,并且您必须为这些用户提供法律上充分的隐私通知和保护。如果您的应用程序存储用户提供的个人或敏感信息,它必须安全地进行存储。如果用户向您的应用程序提供Google帐户信息,您的应用程序只能在用户允许的范围内,并且仅出于用户授权的有限目的使用该信息访问用户的Google帐户。
4.4 您同意不会从事任何干扰、破坏、损害或未经授权访问任何第三方(包括但不限于Google或任何移动通信运营商)的服务器、网络或其他财产或服务的SDK相关活动,包括应用程序的开发或分发。
4.5 您同意,对于您通过Android和/或Android应用程序创建、传输或显示的任何数据、内容或资源,以及您这样做的后果(包括Google可能遭受的任何损失或损害),您自行承担全部责任(Google对您或任何第三方不承担任何责任)。
4.6 您同意,对于您违反本许可协议、任何适用的第三方合同或服务条款、任何适用法律或法规的义务,以及任何此类违反的后果(包括Google或任何第三方可能遭受的任何损失或损害),您自行承担全部责任(Google对您或任何第三方不承担任何责任)。
5. 您的开发者凭据
5.1 您同意,您有责任维护Google可能向您颁发的或您可能自行选择的任何开发者凭据的机密性,并且您将对使用您的开发者凭据开发的所有应用程序承担全部责任。
6. 隐私和信息
6.1 为了不断创新和改进SDK,Google可能会从软件中收集某些使用统计数据,包括但不限于唯一标识符、相关IP地址、软件版本号以及有关SDK中哪些工具和/或服务正在被使用以及如何使用它们的信息。在收集任何此类信息之前,SDK将通知您并寻求您的同意。如果您拒绝同意,则不会收集这些信息。
6.2 收集的数据将以汇总方式进行检查,以改进SDK,并按照Google的隐私政策进行维护。
7. 第三方应用程序
7.1 如果您使用SDK运行由第三方开发的应用程序或访问第三方提供的数据、内容或资源,您同意Google对这些应用程序、数据、内容或资源不承担责任。您理解,您可能通过此类第三方应用程序访问的所有数据、内容或资源均由其来源方全权负责,Google对您因使用或访问任何此类第三方应用程序、数据、内容或资源而可能遭受的任何损失或损害不承担责任。
7.2 您应该意识到,通过此类第三方应用程序向您呈现的数据、内容和资源可能受提供者(或代表他们的其他个人或公司)拥有的知识产权保护。除非您已获得相关所有者的特别许可,否则您不得修改、出租、租赁、借出、销售、分发或创建基于这些数据、内容或资源(无论是全部还是部分)的衍生作品。
7.3 您承认,您使用此类第三方应用程序、数据、内容或资源可能受您与相关第三方之间的单独条款约束。在这种情况下,本许可协议不影响您与这些第三方的法律关系。
8. 使用Android API
8.1 Google数据API
8.1.1 如果您使用任何API从Google检索数据,您承认该数据可能受Google或提供数据的各方(或代表他们的其他个人或公司)拥有的知识产权保护。您使用任何此类API可能受额外的服务条款约束。除非相关服务条款允许,否则您不得修改、出租、租赁、借出、销售、分发或创建基于此数据(无论是全部还是部分)的衍生作品。
8.1.2 如果您使用任何API从Google检索用户数据,您承认并同意,您只有在获得用户明确同意的情况下,并且仅在用户允许的范围内和有限目的内检索数据。如果您使用Android语音识别服务API(文档位于以下URL:https://developer.android.com/reference/android/speech/RecognitionService,并会不时更新),您承认使用该API受数据处理附录的约束,该附录适用于Google作为数据处理者的产品,位于以下URL:https://privacy.google.com/businesses/gdprprocessorterms/,并会不时更新。
时间。点击接受即表示您同意数据处理附录中Google作为数据处理者的产品条款。
9. 终止本许可协议
9.1 本许可协议将继续适用,直到您或Google按以下规定终止为止。
9.2 如果您想终止许可协议,可以停止使用SDK和任何相关的开发者凭证。
9.3 在以下情况下,Google可随时终止与您的许可协议:
(A) 您违反了许可协议的任何条款;或
(B) Google依法被要求这样做;或
(C) 与Google合作向您提供SDK某些部分(如API)的合作伙伴已终止与Google的关系或不再向您提供SDK的某些部分;或
(D) Google决定不再向您所在国家/地区的用户提供SDK或SDK的某些部分,或Google自行决定向您提供SDK或某些SDK服务在商业上不再可行。
9.4 当许可协议终止时,您和Google所享有、受约束或随时间累积的所有法律权利、义务和责任(或在许可协议有效期内表示无限期继续的条款)不受影响,第14.7段的规定将继续无限期适用于这些权利、义务和责任。
10. 免责声明
10.1 您明确理解并同意,使用SDK的风险完全由您自己承担,SDK按"原样"和"可用"状态提供,Google不提供任何类型的保证。
10.2 您使用SDK和通过使用SDK下载或以其他方式获得的任何材料的风险由您自行承担,您对因使用而导致的计算机系统或其他设备的任何损坏或数据丢失负全部责任。
10.3 Google进一步明确声明不承担任何种类的所有明示或暗示的保证和条件,包括但不限于适销性、特定用途适用性和非侵权的暗示保证和条件。
11. 责任限制
11.1 您明确理解并同意,在任何责任理论下,Google、其子公司和关联公司以及其许可方均不对您承担任何直接、间接、附带、特殊、后果性或惩戒性损害赔偿责任,包括任何数据损失,无论Google或其代表是否被告知或应当意识到任何此类损失发生的可能性。
12. 赔偿
12.1 在法律允许的最大范围内,您同意为Google、其关联公司及其各自的董事、高管、员工和代理人辩护、赔偿并使其免受任何索赔、诉讼、suit或程序,以及由以下原因引起的任何损失、责任、损害、成本和费用(包括合理的律师费):(a)您使用SDK,(b)您在SDK上开发的任何应用程序侵犯任何人的版权、商标、商业秘密、外观设计、专利或其他知识产权,或诽谤任何人或侵犯其公开权或隐私权,以及(c)您不遵守许可协议。
13. 许可协议的变更
13.1 Google可能会在分发SDK新版本时对许可协议进行修改。当这些更改发生时,Google将在提供SDK的网站上提供许可协议的新版本。
14. 一般法律条款
14.1 本许可协议构成您与Google之间的完整法律协议,规定了您使用SDK的条件(不包括Google可能根据单独的书面协议向您提供的任何服务),并完全取代您与Google之前就SDK达成的任何协议。
14.2 您同意,如果Google未行使或执行许可协议中包含的(或Google根据任何适用法律享有的)任何法律权利或救济,这不应被视为Google正式放弃其权利,Google仍可使用这些权利或救济。
14.3 如果任何有管辖权决定此事项的法院裁定许可协议的任何条款无效,则该条款将从许可协议中删除,而不影响许可协议的其余部分。许可协议的其余条款将继续有效并可执行。
14.4 您承认并同意,Google作为母公司的集团公司的每个成员都应是许可协议的第三方受益人,这些公司有权直接执行并依赖许可协议中赋予他们利益(或有利于他们的权利)的任何条款。除此之外,任何其他人或公司都不应成为许可协议的第三方受益人。
14.5 出口限制。SDK受美国出口法律和法规的约束。您必须遵守适用于SDK的所有国内和国际出口法律和法规。这些法律包括对目的地、最终用户和最终用途的限制。
14.6 未经另一方事先书面批准,您或Google均不得转让或转移许可协议授予的权利。未经另一方事先书面批准,您或Google均不得委托他人履行许可协议规定的责任或义务。
14.7 许可协议以及您与Google在许可协议下的关系应受加利福尼亚州法律管辖,不考虑其法律冲突规定。您和Google同意将任何由许可协议引起的法律事务提交给位于加利福尼亚州圣克拉拉县的法院专属管辖。尽管如此,您同意Google仍可在任何司法管辖区申请禁令救济(或同等类型的紧急法律救济)。
"hash": "asdkl", "url": "https://developer.android.com/studio/terms.html", "name": "Android 软件开发工具包许可协议" }
</p>
</details>
## 核心模块
> AboutLibraries 库已发布到 [Maven Central](https://search.maven.org/artifact/com.mikepenz/aboutlibraries-core)。
```gradle
implementation "com.mikepenz:aboutlibraries-core:${latestAboutLibsRelease}"
(高级)用法
访问生成的库详情
要创建个性化集成,可以通过核心模块以编程方式访问生成的库信息。
val libs = Libs.Builder()
.withJson(aboutLibsJson) // 提供元数据(可用替代 API)
.build()
val libraries = libs.libraries // 检索元数据中定义的所有库
val licenses = libs.licenses // 检索元数据中定义的所有许可证
for (lib in libraries) {
Log.i("AboutLibraries", "${lib.name}")
}
UI 模块
implementation "com.mikepenz:aboutlibraries-compose:${latestAboutLibsRelease}"
// 替代的基于 Material3 的模块
implementation "com.mikepenz:aboutlibraries-compose-m3:${latestAboutLibsRelease}"
用法
// Android(使用默认资源位置时)
LibrariesContainer(
Modifier.fillMaxSize()
)
// Compose 资源 API
val libraries by rememberLibraries {
Res.readBytes("files/aboutlibraries.json").decodeToString()
}
// Compose 手动
val libraries by rememberLibraries {
useResource("aboutlibraries.json") { res -> res.bufferedReader().readText() }
}
LibrariesContainer(libraries, Modifier.fillMaxSize())
Compose-jb
核心模块和 Compose 模块是 Kotlin 多平台项目。
在 app-desktop
模块中可以找到示例应用。它展示了如何手动生成依赖元信息并将其作为 SCM 的一部分包含在内。
生成依赖信息
./gradlew :app-desktop:exportLibraryDefinitions -PaboutLibraries.exportPath=src/main/resources/
# 通过传递 `-PaboutLibraries.exportVariant==<VARIANT>` 按变体过滤导出的定义
./gradlew :app-wasm:exportLibraryDefinitions -PaboutLibraries.exportPath=src/main/resources/ -PaboutLibraries.exportVariant=wasmJs
./gradlew :app-wasm:exportLibraryDefinitions -PaboutLibraries.exportPath=src/main/resources/ -PaboutLibraries.exportVariant=jvm
运行演示应用
# JVM 桌面应用
./gradlew :app-desktop:run
# WASM Web 应用
./gradlew :app-wasm:run
截图
(旧版)UI 模块
implementation "com.mikepenz:aboutlibraries:${latestAboutLibsRelease}"
用法
使用方法
可以通过几种不同的方式使用这个库。创建自定义活动,包括自定义样式或仅使用其生成的信息。或者simply使用内置的 Activity 或 Fragment,只需传递要包含的库。
注意:新版本需要以新的 Material3 主题作为基础。
Activity
LibsBuilder()
.start(this) // 启动活动
该活动使用工具栏,需要适当的主题。有关更多详细信息,请参阅设置 AboutLibraries 样式
Fragment
val fragment = LibsBuilder()
.supportFragment()
关于此应用 UI
AboutLibraries
库还提供创建"关于此应用"界面的功能。
将以下 .xml 文件(或仅字符串 - 键必须相同)添加到项目中。
<resources>
<string name="aboutLibraries_description_showIcon">true</string>
<string name="aboutLibraries_description_showVersion">true</string>
<string name="aboutLibraries_description_text">在此处放置描述 :D</string>
</resources>
或使用构建器并添加以下内容:
.withAboutIconShown(true)
.withAboutVersionShown(true)
.withAboutDescription("这是一个可以在关于我的应用描述文件中设置的小示例。<br /><b>用 HTML 标记样式化它 :D</b>")
设置 AboutLibraries 样式 🖌️
为 AboutLibraries UI 创建自定义样式。
// 定义自定义样式
<style name="CustomAboutLibrariesStyle" parent="">
<!-- AboutLibraries 特定值 -->
<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>
// 为主题定义自定义样式
<style name="SampleApp" parent="Theme.MaterialComponents.Light.NoActionBar">
...
<item name="aboutLibrariesStyle">@style/CustomAboutLibrariesStyle</item>
...
</style>
企业版
从 AboutLibraries 插件的 v10 版本开始,可以禁用插件任务作为构建系统一部分的自动注册。
aboutLibraries {
registerAndroidTasks = false
}
这对于需要完全控制包含的 aboutlibraries.json
的企业环境特别有益。
禁用集成后,可以手动更新定义,或在 CI 环境中进行更新。
./gradlew app:exportLibraryDefinitions -PaboutLibraries.exportPath=src/main/res/raw/ -PaboutLibraries.exportVariant=release
此生成的文件可以包含在您的 SCM 中,每次构建都将使用这个确切的经过验证和批准的状态。 此外,这有助于确保在应用程序交付阶段不会发生任何问题,因为相应的文件已经生成并包含在内。
该库提供了完全定制的功能,可以根据需要调整生成文件的位置或名称。
以下是手动提供 Libs
的完整 Compose 代码示例:
LibrariesContainer(
librariesBlock = { ctx ->
Libs.Builder().withJson(ctx, R.raw.aboutlibraries).build()
}
)
Gradle API
默认情况下,Gradle 插件会自动为 Android 项目执行,生成库元数据,并被 ui
模块自动发现。
对于其他环境或更高级的用法,该插件提供了额外的 API。
# 在提供的位置手动生成依赖元数据。允许将其提交到 SCM
# 在相对于模块根目录的 `src/main/resources/` 中导出元数据
./gradlew app-desktop:exportLibraryDefinitions -PaboutLibraries.exportPath=src/main/resources/
# 仅为特定变体导出:`release`
./gradlew app-desktop:exportLibraryDefinitions -PaboutLibraries.exportPath=src/main/resources/ -PaboutLibraries.exportVariant=release
# 以 CSV 格式将依赖导出到 CLI
./gradlew exportLibraries
./gradlew exportLibraries${Variant}
# 输出所有依赖项的名称、版本及其标识符
./gradlew findLibraries
# 以有助于合规报告的格式导出所有依赖项。
# 默认情况下,在项目根目录中写入 `export.csv` 和 `export.txt` 以及 `dependencies` 文件夹。
./gradlew exportComplianceLibraries${Variant}
# 列出包含项目的所有资助选项(通过例如 GitHub API 识别)
./gradlew fundLibraries
特殊仓库支持
主机 | 许可证 | 资助 |
---|---|---|
GitHub | x | x |
免责声明
本库使用 build.gradle
文件中定义的所有编译时依赖(及其子依赖)。
这可能导致仅在编译期间使用(实际上并未在应用程序中分发)的依赖项被列出或在归属界面中缺失。
如果依赖项未在其 pom.xml 文件中正确定义许可证,也可能无法识别许可证。
建议仔细优化和审查所有许可证,以真正包含所有必需的依赖项。使用 findLibraries
等 Gradle 命令可以帮助完成此操作。
还需要注意的是,原生子依赖项无法自动解析,因为它们不是通过 Gradle 包含的。 可以通过插件 API 提供额外的依赖项,以扩展和提供任何其他详细信息。
开发者
许可证
Copyright 2024 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.