不暴露我依赖的jar文件

Not to expose the jar file that I depend on

我有一个依赖于某个 lib.jar 的 AAR 库。我通过以下方式将其添加到我的 AAR 中:

dependencies {
    implementation files('myexternallibs/lib.jar')
    ...
}

在生成的 AAR 中,我仍然可以访问 lib.jar 中的 类。根据 SO 中的许多答案,关键字 implementation 应该可以防止这种情况发生。我错过了什么吗?

实现将阻止访问由 lib.jar 实现的库,而不是这个库

例如:

Library1
  |-> Class1
  |-> Class2

Library2 (implementation 'Library1')
  |-> Class3 (this library can access Class1 and Class2)

YourProject (implementation 'Library2')
  |-> Main (this library can access Class3, but not Class1 and Class2)

应使用普通 implementation,以及正确编写和构建的库。

简单地将 .jar 代码添加为 Java 模块可能是最简单的 -

为了完全控制哪些方法可以访问。

参见 Java Library Plugin

你定义了api吗?

请参阅 gradle 站点中的示例:https://docs.gradle.org/current/userguide/java_library_plugin.html#sec:java_library_separation

dependencies {
    api 'commons-httpclient:commons-httpclient:3.1'
    implementation 'org.apache.commons:commons-lang3:3.5'
}

我把implementation改成了compileOnly。成功了。

来自documentation的注释:

If you use this configuration, then your library module must include a runtime condition to check whether the dependency is available, and then gracefully change its behavior so it can still function if it's not provided.

为此,您需要像这样检查类路径:

try {
    Class.forName("com.company.ClassName");
}
catch (ClassNotFoundException ex) {
    // class is not available
}