如何解决android studio多个library库含有相同引用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何解决android studio多个library库含有相同引用相关的知识,希望对你有一定的参考价值。

1.把项目所需要引入第三方的library和公司的公共library库引入到LibraryManager。这个和普通的引入第三方library没什么区别,相信大家都知道怎么做,这里就不多啰嗦了。2.打开HBSCustomerProject项目的settings.gradle文件,添加如下代码include':LibraryManager'//引入LibraryManager项目project(':LibraryManager').projectDir=newFile('../LibraryManager')//最关键的代码,newFile中是LibraryManager项目的路径。include':LibraryManager:hbslibrary'//公司的公共库include':LibraryManager:pullrefreshview-master'//第三方的下拉刷新库这里引入多少第三方library这里就写多少哦3.打开HBSCustomerProject项目的app/build.gradle文件,在dependencies代码块中添加如下代码dependencies..compileproject(':LibraryManager:hbslibrary')compileproject(':LibraryManager:pullrefreshview-master')到这里就ok了,然后清空一下项目,重新build。 参考技术A 如果可以的话,建议使用 dependencies compile 'com.google.code.gson:gson:2.2.4' compile 'com.braintreepayments.api:braintree:1.+' compile 'com.umeng.analytics:analytics:latest.integration' 这种引用方式本回答被提问者采纳 参考技术B 保留一个compile,其它的改为provided(只参与编译不加入源码) 参考技术C 一、修改android Studio(以下简称AS)的内存配置
因为在导入源码时需要消耗大量内存,所以先修改IDEA_HOME/bin/studio64.vmoptions(x86的机器修改studio.vmoptions)中-Xms和-Xmx的值。文档中使用的是748m, 可自行修改。
二、配置AS的JDK、SDK
在IDE中添加一个没有classpath的JDK, 这样可以确保使用源码里的库文件
并将其作为要使用的SDK的Java SDK。
三、生成导入AS所需配置文件(*.ipr)
①编译源码(为了确保生成了.java文件,如R.java;如果编译过,则无需再次编译)
②检查out/host/linux-x86/framework/目录下是否有idegen.jar
如果idegen.jar不存在,执行:
mmm development/tools/idegen/
在5.0.1的源码中会生成res.java的文件夹,导致idegen.jar运行时抛FileNotFoundException,这是idegen的代码不够严谨造成的。
我的分享里有修改这个bug的patch,或者直接使用我分享的idegen.jar。
③执行
development/tools/idegen/idegen.sh
等待出现类似下面的结果:
Read excludes: 5ms
Traversed tree: 44078ms
这时会在源码的根目录下生成android.ipr和android.iml两个IntelliJ IDEA(AS是基于IntelliJ IDEA社区版开发的)的配置文件
Tips:
AS在导入代码时比较慢,建议先修改android.iml,将自己用不到的代码exclude出去.可以仿照过滤.repo文件夹的语法,如:
<excludeFolder url="file://$MODULE_DIR$/.repo" />
<excludeFolder url="file://$MODULE_DIR$/abi" />
<excludeFolder url="file://$MODULE_DIR$/art" />
删除掉所有不需要的module-library项
这样在导入时就会跳过abi和art文件夹.过滤的越多,AS的处理速度就会越快.
④在AS中打开源码根目录下新生成的android.ipr
如果在导入时AS出现
则建议按照其给定的解决方法来解决(网址:http://confluence.jetbrains.com/display/IDEADEV/Inotify+Watches+Limit)
四、解决源码中跳转错误问题
①为当前工程设置正确的SDK和JDK
②设置'Modules'的依赖
先将所有依赖删掉(注意:这里删除全部只是为了方便。如果确实用到了.jar,在将它们的路径添加进来就可以了.
如:5.0.1的ContactsCommon用到了geocoder-2.9.jar和libphonenumber-6.2.jar)
点击指向的'Jars or directories'选项,依次将frameworks和external文件夹添加进来.如:
注:推荐把frameworks和external这两个移到最上面,这样在代码跳转时会优先从这两个文件夹下查找,而不是在Android.jar中查找。
其它版本的代码在添加frameworks时可能会显示成:
没有关系,只是显示问题,点击OK还是会把frameworks路径添加进去的.
如果还有代码跳转错误,请仿照上面的步骤将相应代码的路径或jar文件添加到其Dependencies标签页中即可.
五、DEBUG源码
可以通过给刚导入的工程在'Modules'中添加'Android Framework'来让AS将它作为一个Android工程,从而方便调试代码.
可以来添加Android Framework支持.
在代码中加断点,然后选择'Run'->'Attach debugger to Android process'
在弹出的选择进程(Choose Process)对话框中,勾选显示所有进程,选择要DEBUG的代码所在的进程,点击OK即可.
六、其它
代码中很多地方提示Call requires API Level x.... 出现这个问题是因为AS将工程当做安卓应用程序工程了,且源码中没有指定minSdkVersion.
只需在源码根目录加一个声明minSdkVersion的AndroidManifest.xml文件即可(分享了一个AndroidManifest.xml)。
也可以考虑使用build.gradle来解决该问题。

在 android 中集成 org.apache.poi 和 javax.xml.stream.* 包 (stax-api) - 如何在 Android Studio 中设置 --core-libra

【中文标题】在 android 中集成 org.apache.poi 和 javax.xml.stream.* 包 (stax-api) - 如何在 Android Studio 中设置 --core-library 参数?【英文标题】:integrating org.apache.poi and the javax.xml.stream.* package (stax-api) in android - how to set the --core-library argument in Android Studio? 【发布时间】:2016-04-09 07:21:25 【问题描述】:

我使用的是 Android Studio 1.5.1

我想在我的 android 项目中包含 org.apache.poi-ooxml 库。要包含该库,我需要包含一些其他库依赖项,其中包括 stax-api 库。

stax api 的问题在于它包含 javax.* 中的所有包,这是一个“核心库”。 Java jdk 包含所有这些库,所以如果我要在 Java SE 中使用它,我就不需要那个 stax-api 库。另一方面,Android 有一个“部分”的 stax-api 库。对于 android,我只需要 javax.xml.stream.* 包。这意味着我需要提取 stax-api,删除除 javax.xml.stram 包之外的所有内容,然后重新打包。

所以我想在 Android 中使用这个修改后的库是安全的。但是,它有 javax.* 包,根据 Android Studio,它是一个核心库,所以 Android Studio(或 Android Studio 中的任何组件)会给我一个警告:

问题处理“javax/xml/stream/EventFilter.class”:

在以下情况下对核心类(java.* 或 javax.*)的不明智或错误使用 不构建核心库。

这通常是由于无意中包含了核心库文件 您的应用程序的项目,当使用 IDE(例如 Eclipse)时。如果 你确定你不是故意定义一个核心类,那么这个 是对正在发生的事情的最可能的解释。

但是,您实际上可能正在尝试在核心中定义一个类 命名空间,您可能已经获取了它的来源,例如,从 非安卓虚拟机项目。这肯定不会 工作。至少,它会危害您的应用程序与 平台的未来版本。它也经常是有问题的 合法性。

如果你真的打算建立一个核心库——这只是 适合作为创建完整虚拟机分发的一部分, 而不是编译应用程序 - 然后使用 “--core-library”选项来禁止显示此错误消息。

如果您继续使用“--core-library”,但实际上是在构建一个 应用程序,然后预先警告您的应用程序仍然会失败 在某个时候构建或运行。请为愤怒的顾客做好准备 例如,他们发现您的应用程序停止运行一次 他们升级他们的操作系统。你将为此负责 问题。

如果您合法地使用某些恰好位于核心中的代码 包装,那么您拥有的最简单安全的替代方法是重新包装 那个代码。也就是说,将有问题的类移动到您自己的包中 命名空间。这意味着它们永远不会与核心冲突 系统类。 JarJar 是一个可以帮助您完成这项工作的工具。 如果你发现你不能做到这一点,那么这表明你 你所走的道路最终会导致痛苦、苦难、悲伤, 和悲叹。

所以,我想使用这个 --core-library 选项。但是在哪里设置呢?

我已经查看了Android Studio ignore --core-library flag,但这对我没有帮助。我认为这些答案已经过时,这就是我提出新问题的原因。

我做了什么尝试:

    build.gradle:

    dexOptions 
      coreLibrary true;
    
    

    build.gradle:

    dexOptions 
      preDexLibraries = false
    
    
    project.tasks.withType(com.android.build.gradle.tasks.Dex) 
      additionalParameters=['--core-library']
    
    

    文件 --> 其他设置 --> 默认设置 --> 编译器 --> Android 编译器 并检查“添加 --core-library 标志”

这些都不起作用。有没有办法设置该选项?


编辑:为什么需要 STAX: 我正在为 .xlsx 文件使用 Workbook、Sheet、Columns、Cells 做一些事情。 当我只包含poi-ooxml-3.14-beta1-20151223.jar 时,我在构建时收到错误消息class file for org.apache.poi.ss.usermodel.Workbook not found

在运行时包含 poi-3.14-beta1-20151223.jar 后,我得到了Could not find method org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbook.isSetBookViews, referenced from method org.apache.poi.xssf.usermodel.XSSFWorkbook

在运行时包含 poi-ooxml-schemas-3.14-beta1-20151223.jar 时,我会得到 Failed resolving Lorg/openxmlformats/schemas/spreadsheetml/x2006/main/CTWorkbook; interface 59 'Lorg/apache/xmlbeans/XmlObject;java.lang.VerifyError: org/apache/poi/xssf/usermodel/XSSFWorkbook 等。

在运行时包含xmlbeans-2.6.0.jar 时,我会得到Could not find method javax.xml.stream.events.Namespace.getPrefix, referenced from method org.apache.poi.openxml4j.opc.internal.marshallers.PackagePropertiesMarshaller.getQNamejava.lang.NoClassDefFoundError: javax.xml.stream.XMLEventFactory at org.apache.poi.openxml4j.opc.internal.marshallers.PackagePropertiesMarshaller.&lt;clinit&gt;(PackagePropertiesMarshaller.java:41) 等。

更新 所以,来自http://poi.apache.org/faq.html#faq-N1017E

18.为什么我会收到 java.lang.NoClassDefFoundError: javax/xml/stream/XMLEventFactory.newFactory()

此错误表明 类 XMLEventFactory 不提供的功能 POI 取决于。可能有许多不同的原因 这个:

过时的 xml-apis.jar、stax-apis.jar 或 xercesImpl.jar:

Java 5 及更低版本需要这些库,但实际上并不需要符合规范的 Java 6 实现,因此请尝试 从类路径中删除这些库。如果这是不可能的, 尝试升级到这些 jar 文件的新版本。 运行 IBM Java 6(可能作为 WebSphere Application Server 的一部分):IBM Java 6 不提供 XML 标准,似乎只有 IBM Java 7 提供了正确的 接口,因此请尝试升级您的 JDK。 Sun/Oracle Java 6 的补丁级别过时:某些接口仅包含/修复在 Java 6 的某些补丁级别中。尝试 使用最新的可用补丁级别运行,甚至更好地使用 Java 7/8,此功能应在所有情况下都可用。

所以,如果我没看错的话,在 Android 中,我确实需要一个“截断”的 STAX api。

【问题讨论】:

最新版本的 Apache POI 不需要 STAX。如果您尝试升级会发生什么? 我更新了问题以“证明”使用 STAX 的合理性 查看 the Apache POI components page 了解 POI 的哪些位具有哪些依赖项的详细信息 - 遵循那里的建议将解决您丢失的类问题 我读到了。我想我仍然需要 Android 上的 STAX api 这听起来像你有版本冲突。为什么不使用 maven 并对那些有冲突的子库进行排除?我不是 gradle 用户,但我确信那里也可以排除特定的库,就像在任何其他现代依赖管理工具中一样。 【参考方案1】:

当您尝试使用 Apache POI 时会遇到很多问题,它依赖于 Android 应用程序中的库。其中 xmlbeans.jar 中有重复的类,“javax.*”包被 Android 编译器和其他一些禁止。

目前有两个项目试图解决这些问题:

https://github.com/andruhon/android5xlsx https://github.com/centic9/poi-on-android/(我维护)

android5xlsx 提供了现成的 jar 文件以包含在您的应用程序中,但目前使用的是有点过时的 POI 版本。 poi-on-android 基于 POI 3.15-beta1 并且可以很容易地为新版本的 POI 重新编译。 这两个项目都适用于 Android 5+,并附带示例代码,应该允许在 Android 上基本使用 Apache POI。

【讨论】:

感谢您的辛勤工作!我可以问你两个问题吗?首先,为什么大多数这样的项目只支持 Android 5+?同时支持低版本有什么问题吗?其次,如果我需要为 Android 4.4 及更高版本编写代码,哪个项目最适合我?我看到您在其他答案中也提到了 AndroidReadXLSX。 (该应用需要同时读取 XLS 和 XLSX!) 哦,我也忘了问这个问题。您在使用这些项目时遇到过任何内存问题吗?我没有在 Android 上使用 Excel 文件的经验,所以有点担心低端设备。 ad Android 支持:我对 Android 没有太多经验,但我认为有些事情在早期版本中是不可能的,例如需要multidex,类数非常多。 广告记忆:您需要尝试使用您的实际文件。对于大型或复杂文件,大型 Excel 文件会在 POI 中消耗大量内存,因此取决于实际文件的数量。 谢谢!对于我当前的应用程序,我想我需要另一种解决方法,但我肯定会很快尝试你的。非常感谢:)【参考方案2】:

在您的应用程序build.gradle 中添加implementation 'javax.xml.stream:stax-api:1.0',因为错过了一些核心课程

【讨论】:

以上是关于如何解决android studio多个library库含有相同引用的主要内容,如果未能解决你的问题,请参考以下文章

如何解决android studio多个library库含有相同引用

如何解决“在Android独立路径中找到多个文件'project.properties'”Android Studio 3.0 Beta-6中的错误

将 GDPR 添加到 Android Studio

清单合并失败并出现多个错误:Android Studio Java

LibGdx 与 Android Studio 有多个错误

如何在 Android Studio 的代码中选择多个位置(崇高)?