java - 如何在 Android 上添加 Java 库兼容性的持续集成检查?

标签 java android gradle

我有许多 Java 库,旨在用于桌面 Java 环境和 Android Java 环境。

我希望能够在 Java 库中集成某种基于 Gradle 的 lint 检查,以确保我不会使用 Android 上不可用的类/方法。我已经看到 Android Lint 实用程序可以检查此类内容(并输出允许其工作的最低 Android 套件)。

我知道引入整个 Android SDK 是可行的,但最好不要在打算在 Android 世界之外共享的较小基础库上进行此操作。

其中一个原因是我想使用可通过 Retrolambda 获得的 Java 8 功能,但在持续集成时会收到警告,我使用的 API 在之前的 SDK 中不可用。

最佳答案

Proguard 似乎能够有效地检查所有引用的类是否存在。它做了很多我不需要它做的其他事情,但它可以配置为执行以下操作:

  • 获取输入 jar/classpath(新编译的 Java 库)
  • 不需要输出 jar(无需保存优化/混淆版本)
  • 采用一组输入库来解析引用
    • 允许使用 Java 7 的运行时库作为基础引用

这使我能够使用 Java 8 功能进行编译,并且可以合理地确定它应该在 Android 上兼容 - 通过 Retrolambda 或新的 Jack 编译器。

使用 Proguard 进行此用途的 Gradle 部分:

buildscript {
    dependencies {
        classpath 'net.sf.proguard:proguard-base:5.2.1'
    }
}

task proguardCheck(type: proguard.gradle.ProGuardTask, dependsOn: assemble) {
    injars project.jar.archivePath
    libraryjars files(System.getenv("JAVA7_HOME") + "/jre/lib/rt.jar")
    libraryjars files(System.getenv("JAVA7_HOME") + "/jre/lib/jce.jar")
    libraryjars files(configurations.compile)
    // Don't really try to do anything, we just want this tool for it's bytecode lint
    dontshrink
    dontobfuscate
    dontoptimize
    // Don't fail if LambdaMetafactory is missing - it would be handled by Retrolambda / Jack
    dontwarn 'java.lang.invoke.LambdaMetafactory'
}

兼容性的有力保证是引用给定的目标 Android 最低兼容版本的 android.jar。然而,如果不引入 Andorid SDK,Java 6 对于真正旧的 Android 来说是一个很好的目标,对于 Android SDK >= 4.4 来说,Java 7 是一个很好的目标(尽管 NIO 2.0 缺失,可能还有其他 API)。

关于java - 如何在 Android 上添加 Java 库兼容性的持续集成检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38819601/

相关文章:

java - 从java获取gradle构建路径文件夹

java - 在 JTable 上动态调整行高

java - 仅注释 ORM 框架的建议 (Java)

java - 使用 Hibernate Criteria 获取具有最大 id 的记录

android - android中imageview的登录验证

java - 将匿名函数传递给方法,存储它并执行它?

java - 如何在 Gradle 中隐藏传递依赖?

java - 如何使用 Selenium 和 Java 单击将鼠标悬停在 ebay.com 内的元素上后可见的元素

android - Android 在特定时间向用户发送通知

gradle - 如何在多模块项目中访问 gradle 中的测试 jar