Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 不公开我所依赖的jar文件_Android_Android Gradle Plugin_Android Library - Fatal编程技术网

Android 不公开我所依赖的jar文件

Android 不公开我所依赖的jar文件,android,android-gradle-plugin,android-library,Android,Android Gradle Plugin,Android Library,我有一个AAR库,它依赖于某个lib.jar。我通过以下操作将其添加到AAR中: dependencies { implementation files('myexternallibs/lib.jar') ... } 在生成的AAR中,我仍然可以访问lib.jar中的类。根据SO中的许多答案,关键字实现应该可以防止这种情况发生。我错过了什么 实现将阻止访问由lib.jar实现的库,而不是此库 例如: Library1 |-> Class1 |-> Class

我有一个AAR库,它依赖于某个
lib.jar
。我通过以下操作将其添加到AAR中:

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

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

实现将阻止访问由
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)

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

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

以提供可访问的方法的完全控制


请参阅。

您是否定义了api

请参见gradle网站上的示例:


我将
implementation
更改为
compileOnly
。成功了

注:

如果使用此配置,则库模块必须包括 检查依赖项是否可用的运行时条件,以及 然后优雅地改变它的行为,这样它仍然可以正常工作 没有提供

为此,需要检查类路径,如下所示:

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

我很确定
api
是不会公开它的。@user1506104您能定义
我仍然可以访问lib.jar中的类的意思吗?您可以访问lib.jar类或它的依赖类吗?是的,这与我的情况类似。我有lib.jar(图中的Library1)。这是我的项目的一个依赖项,它通过使用“implementation'lib.jar”(图中的Library2)生成.aar。从该项目中,我可以访问lib.jar的类。当我从该项目生成一个.aar并在project2(图中的YourProject)中使用它时,即使我使用了@usee1506104我认为这是由生成.aar引起的。我认为实现是为模块和存储依赖性设计的,因为生成.jar(我不知道它是否与.aar相同)将把所有类放在一起(甚至是继承的类)@user1506104大多数库都没有混淆;请参阅-除非您能够控制它的构建,否则您无法完全控制可访问的内容;双包装(正如@Martin所建议的)可能是一种选择-但似乎有点糟糕。从未尝试过,只是想知道会有什么影响。
try {
    Class.forName("com.company.ClassName");
}
catch (ClassNotFoundException ex) {
    // class is not available
}