我有一个Android open source library project,其中我一直在为logging使用一个单独的库(这也是由我开发的)。
日志库并不重要,但它使开发和调试更容易(对我和主库的用户都是如此)。 我正在使用gradle(和Jitpack)来使用这两个库。现在,Logging库实际上在清单中几乎没有额外的权限(用于将日志写入文件,主库不需要)。
现在有一位用户要求我删除额外的权限。我不知道如何在不删除日志库(或更改日志库本身的功能)的情况下这样做。 我甚至意识到很少有人可能根本不需要日志库,所以有没有办法让它可选,比如如果用户没有在他们的build.gradle中包含Logging库,它就不会导入哪个我可以检测到而不是调用日志记录功能?
我知道这听起来令人困惑,但我想知道如何解耦两个库。事实上,如果您从任何受欢迎的图书馆了解任何此类示例,请告诉我。
答案 0 :(得分:0)
是的,你可以用一些巧妙的技巧来做到这两点。
第1部分。许可
关于清单权限。它非常简单,不要将权限添加到日志库,而是在运行时检查它。像这样:
if (context.checkPermission(
Manifest.permission.WRITE_EXTERNAL_STORAGE,
android.os.Process.myPid(),
Process.myUid()) == PackageManager.PERMISSION_GRANTED) {
carry on with your write to disk operation ...
}
然后在您的文档中写道,如果使用该库的开发人员想要进行本地日志记录,则必须在清单上声明WRITE_EXTERNAL_STORAGE。
第2部分。(不是)导入LIB
我要写的所有内容都是真心的,100%未经过测试。可能(将)会有一些错误,你必须转移,但希望我能传递一个坚实的想法。
首先在NoobCameraFlash库中,您将使用LumberJack
而不是build.gradle
在provided
文件中定义compile
。这将使编译器知道LumberJack
编译可以通过,但它不会将其包含在实际构建中。
然后在NoobCameraFlash库中创建一个类,它是库函数的镜像。这意味着方法d(String, String)
,e(String, String)
等。
然后你在这个镜像类中,你会像下面这样检查伐木工人是否真的可用。
private static boolean lumberJackAvailable = false;
private static boolean lumberJackTested = false;
private static boolean isLumberJackAvailable() {
if(lumberJackTested) return lumberJackAvailable;
lumberJackTested = true;
try {
if(Class.forName("") != null) {
lumberJackAvailable = true;
}
} catch(Throwable e){
// ClassNotFoundException, LinkageError, ExceptionInInitializerError
}
return lumberJackAvailable;
}
public static LumberJackMirror create() {
// could also be a singleton
if(isLumberJackAvailable() return new LumberJackMirror();
else return null;
}
然后你必须检查if(lumberJackMirror != null)
。因此,您可以看到它不是最直接的做事方式。
另一种简化这一点的方法是在不同的库中创建一个接口,镜像和实际的LumberJack实现并使用工厂可以返回一个空的接口实现,而不是必须null检查所有的时间。
同样,在文档中包含,如果开发人员希望拥有日志记录功能,则必须将其添加到build.gradle
。像compile 'your_groud_id:lumberjack:version'
修改强>
另一种常见的方法是在NoobCameraFlash初始化代码上使其显式化。类似的东西:
NoobCameraFlash.config()
.setLogger(new LumberJack());
因此迫使开发人员了解LumberJack而不是通过Class
进行检查。但这意味着你需要一些不仅仅是static
方法的LumberJack版本。
<强> end_edit 强>
但希望只是删除许可就足够了,你不必做这个部分.2 =]
快乐的编码。