- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
背景
我的任务是为开发人员提供一种方法,将单个依赖项添加到 Android 项目的 build.gradle 文件中,以使用我准备的一些(混淆的)SDK(AAR 文件 - Android 库)。
SDK 本身使用各种依赖项,因此它们将在最终代码中可用很重要,这意味着使用 SDK 的人不会看到由于 class-not-found 而导致的崩溃。
SDK 作为私有(private)存储库存储在 Github 上,开发人员可以通过 Jitpack 使用,它会扫描存储库中的 POM 文件和其他一些文件。
单独使用 AAR 文件,您必须设置与 SDK 相同(或更新)的依赖项。
但是,如果您在发布时使用 POM 文件,则使用者(使用 SDK 的人)不需要编写 SDK 上的每个依赖项,因为它是从 POM 文件中添加的。
问题
出于某种原因,这种行为对我来说不存在。这意味着好像 SDK 不使用任何依赖项,所以如果我尝试使用任何依赖项,我将无法访问类,并且如果我在使用某些依赖项时尝试使用 SDK,则会导致异常ClassNotFoundException。
起初我认为这是因为一些 Proguard 规则,但后来我注意到它也发生在 debug-variant 上(使用 SDK 的应用程序)。
例如,当库在依赖项中使用它时:
implementation 'androidx.security:security-crypto:1.1.0-alpha03'
如果我不使用它,我将无法访问此依赖项的任何类,如果 SDK 尝试访问它的任何类,应用程序将崩溃。
plugins {
id 'com.android.library'
id 'kotlin-android'
id 'kotlin-kapt'
id 'kotlin-parcelize'
id 'io.michaelrocks.paranoid'
id 'maven-publish'
id 'com.github.dcendents.android-maven'
}
android {
compileSdkVersion 30
defaultConfig {
minSdkVersion 21
targetSdkVersion 30
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
consumerProguardFiles 'consumer-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
configurations {
all {
exclude module: 'httpclient'
}
}
packagingOptions {
//for google login token
exclude 'META-INF/DEPENDENCIES'
}
}
dependencies {
api "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
api 'androidx.core:core-ktx:1.6.0-alpha01'
api 'androidx.collection:collection-ktx:1.2.0-alpha01'
api 'androidx.security:security-crypto:1.1.0-alpha03'
def room_version = "2.2.6"
api "androidx.room:room-runtime:$room_version"
kapt "androidx.room:room-compiler:$room_version"
api "androidx.room:room-ktx:$room_version"
api 'com.squareup.retrofit2:retrofit:2.9.0'
api 'com.squareup.retrofit2:converter-gson:2.9.0'
api 'com.squareup.okhttp3:okhttp:5.0.0-alpha.2'
api 'com.squareup.okhttp3:logging-interceptor:5.0.0-alpha.2'
api('com.google.android.gms:play-services-auth:19.0.0')
api('com.google.auth:google-auth-library-oauth2-http:0.25.0')
api('com.google.apis:google-api-services-people:v1-rev99-1.22.0') {
exclude group: 'com.google.guava'
}
api 'io.michaelrocks:libphonenumber-android:8.12.20'
}
afterEvaluate {
publishing {
publications {
release(MavenPublication) {
from components.release
}
}
}
}
运行“generatePomFileForReleasePublication”任务,我得到了 POM 文件“pom-default.xml”:
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<!-- This module was also published with a richer model, Gradle metadata, -->
<!-- which should be used instead. Do not delete the following line which -->
<!-- is to indicate to Gradle or any Gradle module metadata file consumer -->
<!-- that they should prefer consuming it instead. -->
<!-- do_not_remove: published-with-gradle-metadata -->
<modelVersion>4.0.0</modelVersion>
<groupId>MySdk</groupId>
<artifactId>library</artifactId>
<version>unspecified</version>
<packaging>aar</packaging>
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib</artifactId>
<version>1.4.32</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<artifactId>httpclient</artifactId>
<groupId>*</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>androidx.core</groupId>
<artifactId>core-ktx</artifactId>
<version>1.6.0-alpha01</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<artifactId>httpclient</artifactId>
<groupId>*</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>androidx.collection</groupId>
<artifactId>collection-ktx</artifactId>
<version>1.2.0-alpha01</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<artifactId>httpclient</artifactId>
<groupId>*</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>androidx.security</groupId>
<artifactId>security-crypto</artifactId>
<version>1.1.0-alpha03</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<artifactId>httpclient</artifactId>
<groupId>*</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>androidx.room</groupId>
<artifactId>room-runtime</artifactId>
<version>2.2.6</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<artifactId>httpclient</artifactId>
<groupId>*</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>androidx.room</groupId>
<artifactId>room-ktx</artifactId>
<version>2.2.6</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<artifactId>httpclient</artifactId>
<groupId>*</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.squareup.retrofit2</groupId>
<artifactId>retrofit</artifactId>
<version>2.9.0</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<artifactId>httpclient</artifactId>
<groupId>*</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.squareup.retrofit2</groupId>
<artifactId>converter-gson</artifactId>
<version>2.9.0</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<artifactId>httpclient</artifactId>
<groupId>*</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>5.0.0-alpha.2</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<artifactId>httpclient</artifactId>
<groupId>*</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>logging-interceptor</artifactId>
<version>5.0.0-alpha.2</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<artifactId>httpclient</artifactId>
<groupId>*</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.google.android.gms</groupId>
<artifactId>play-services-auth</artifactId>
<version>19.0.0</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<artifactId>httpclient</artifactId>
<groupId>*</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.google.auth</groupId>
<artifactId>google-auth-library-oauth2-http</artifactId>
<version>0.25.0</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<artifactId>httpclient</artifactId>
<groupId>*</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.google.apis</groupId>
<artifactId>google-api-services-people</artifactId>
<version>v1-rev99-1.22.0</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<artifactId>httpclient</artifactId>
<groupId>*</groupId>
</exclusion>
<exclusion>
<artifactId>*</artifactId>
<groupId>com.google.guava</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.michaelrocks</groupId>
<artifactId>libphonenumber-android</artifactId>
<version>8.12.20</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<artifactId>httpclient</artifactId>
<groupId>*</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-parcelize-runtime</artifactId>
<version>1.4.32</version>
<scope>runtime</scope>
<exclusions>
<exclusion>
<artifactId>httpclient</artifactId>
<groupId>*</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.michaelrocks</groupId>
<artifactId>paranoid-core</artifactId>
<version>0.3.3</version>
<scope>runtime</scope>
<exclusions>
<exclusion>
<artifactId>httpclient</artifactId>
<groupId>*</groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
根据各种网站的说法,这似乎是有效且好的,但遗憾的是,正如我所写,当我使用它时,好像这些依赖项都不存在,我需要在消费者端声明它们。
install:
- FILE="-Dfile=library-release.aar"
- mvn install:install-file $FILE -DgroupId=my-sdk -DartifactId=MySdk -Dversion=1.0 -Dpackaging=aar -DgeneratePom=true
我尝试了什么:
scope
来自所有dependency
标签。没有帮助。 transitive = true
在消费者方面,但这并没有做任何事情,可能是因为无论如何它都是默认的。 publishToMavenLocal
任务,我得到了另一个文件(“module.json”),甚至把它而不是pom-default.xml
单独的文件(也作为一个完整的替代品),它没有帮助。 packagingOptions {exclude 'META-INF/DEPENDENCIES' }
的部分?在消费者方面? 最佳答案
好的,我找到了这样做的方法。答案来自 Jitpack 支持本身。首先,来自他们的报价:
This is caused by the install command and ' -DgeneratePom=true'parameter. It will generate a new pom file but it doesn't knowanything about dependencies.
If you already have a pom file with all the dependencies then youcould add it to the GitHub repository. Instead of '-DgeneratePom=true' you could use '-DpomFile='
We recommend trying that command locally before running on JitPack.
The other option is to put all the source code of the library onJitPack and build from source.
-DgroupId=my-sdk -DartifactId=MySdk -Dversion=1.0
):install:
- FILE="-Dfile=library-release.aar"
- mvn install:install-file $FILE -Dpackaging=aar -DpomFile=pom-default.xml
-DgroupId=my-sdk -DartifactId=MySdk -Dversion=1.0
的目的是什么?部分?在“jitpack.yml”文件中还是在库的 gradle 文件中?我认为他们根本没有做任何事情......似乎 Github 存储库本身决定了消费者如何使用它。关于android - 为什么不能使用pom文件中的maven依赖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66983761/
我最近在/ drawable中添加了一些.gifs,以便可以将它们与按钮一起使用。这个工作正常(没有错误)。现在,当我重建/运行我的应用程序时,出现以下错误: Error: Gradle: Execu
Android 中有返回内部存储数据路径的方法吗? 我有 2 部 Android 智能手机(Samsung s2 和 s7 edge),我在其中安装了一个应用程序。我想使用位于这条路径中的 sqlit
这个问题在这里已经有了答案: What's the difference between "?android:" and "@android:" in an android layout xml f
我只想知道 android 开发手机、android 普通手机和 android root 手机之间的实际区别。 我们不能从实体店或除 android marketplace 以外的其他地方购买开发手
自Gradle更新以来,我正在努力使这个项目达到标准。这是一个团队项目,它使用的是android-apt插件。我已经进行了必要的语法更改(编译->实现和apt->注释处理器),但是编译器仍在告诉我存在
我是android和kotlin的新手,所以请原谅要解决的一个非常简单的问题! 我已经使用导航体系结构组件创建了一个基本应用程序,使用了底部的导航栏和三个导航选项。每个导航选项都指向一个专用片段,该片
我目前正在使用 Facebook official SDK for Android . 我现在正在使用高级示例应用程序,但我不知道如何让它获取应用程序墙/流/状态而不是登录的用户。 这可能吗?在那种情
我在下载文件时遇到问题, 我可以在模拟器中下载文件,但无法在手机上使用。我已经定义了上网和写入 SD 卡的权限。 我在服务器上有一个 doc 文件,如果用户单击下载。它下载文件。这在模拟器中工作正常但
这个问题在这里已经有了答案: What is the difference between gravity and layout_gravity in Android? (22 个答案) 关闭 9
任何人都可以告诉我什么是 android 缓存和应用程序缓存,因为当我们谈论缓存清理应用程序时,它的作用是,缓存清理概念是清理应用程序缓存还是像内存管理一样主存储、RAM、缓存是不同的并且据我所知,缓
假设应用程序 Foo 和 Eggs 在同一台 Android 设备上。任一应用程序都可以获取设备上所有应用程序的列表。一个应用程序是否有可能知道另一个应用程序是否已经运行以及运行了多长时间? 最佳答案
我有点困惑,我只看到了从 android 到 pc 或者从 android 到 pc 的例子。我需要制作一个从两部手机 (android) 连接的 android 应用程序进行视频聊天。我在想,我知道
用于使用 Android 以编程方式锁定屏幕。我从 Stackoverflow 之前关于此的问题中得到了一些好主意,并且我做得很好,但是当我运行该代码时,没有异常和错误。而且,屏幕没有锁定。请在这段代
文档说: android:layout_alignParentStart If true, makes the start edge of this view match the start edge
我不知道这两个属性和高度之间的区别。 以一个TextView为例,如果我将它的layout_width设置为wrap_content,并将它的width设置为50 dip,会发生什么情况? 最佳答案
这两个属性有什么关系?如果我有 android:noHistory="true",那么有 android:finishOnTaskLaunch="true" 有什么意义吗? 最佳答案 假设您的应用中有
我是新手,正在尝试理解以下 XML 代码: 查看 developer.android.com 上的文档,它说“starStyle”是 R.attr 中的常量, public static final
在下面的代码中,为什么当我设置时单选按钮的外观会发生变化 android:layout_width="fill_parent" 和 android:width="fill_parent" 我说的是
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 9
假设我有一个函数 fun myFunction(name:String, email:String){},当我调用这个函数时 myFunction('Ali', 'ali@test.com ') 如何
我是一名优秀的程序员,十分优秀!