在我的android项目中,我想包装一个第三方库,以便防止从应用程序模块直接访问第三方类。
在包装库中,我通过implementation
添加了第三方库的依赖项。包装库的AppWorker
扩展了第三方库的XWorker
,但是当我在应用模块中调用AppWorker.doWork
时,出现了编译错误:“无法访问XWorker”。
如果AppWorker
不扩展XWorker
而是创建一个XWorker
成员以供使用,则不会有错误,但是这种方法仅在某些情况下有效,因为有时我们必须使用继承,例如,我需要自定义的BroadcastReceiver
,它扩展了BroadcastReceiver
的第三方库。
如果我在包装库的依赖项中使用api
而不是implementation
,也将没有错误。但这会在应用模块中使用包装库时打开对第三方类的访问。
所以,看来我不能继承来自实现依赖的类,然后在另一个模块中使用它。这是gralde的错误吗?如果没有,为什么?
下面是三个模块的示例代码:
第三方
public class XWorker {
public void doWorkX() {
}
}
wraplibrary
dependencies {
implementation project(":thirdparty")
}
public class AppWorker extends XWorker {
public void doWork() {
// do some preparatory work
super.doWorkX();
}
}
应用
dependencies {
implementation project(":wraplibrary")
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AppWorker worker = new AppWorker();
worker.doWork(); // compile error: cannot access XWorker
}