处理库项目中的依赖项

时间:2016-11-19 21:16:54

标签: android android-gradle android-permissions

我有一个Android open source library project,其中我一直在为logging使用一个单独的库(这也是由我开发的)。

日志库并不重要,但它使开发和调试更容易(对我和主库的用户都是如此)。 我正在使用gradle(和Jitpack)来使用这两个库。现在,Logging库实际上在清单中几乎没有额外的权限(用于将日志写入文件,主库不需要)。

现在有一位用户要求我删除额外的权限。我不知道如何在不删除日志库(或更改日志库本身的功能)的情况下这样做。 我甚至意识到很少有人可能根本不需要日志库,所以有没有办法让它可选,比如如果用户没有在他们的build.gradle中包含Logging库,它就不会导入哪个我可以检测到而不是调用日志记录功能?

我知道这听起来令人困惑,但我想知道如何解耦两个库。事实上,如果您从任何受欢迎的图书馆了解任何此类示例,请告诉我。

1 个答案:

答案 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.gradleprovided文件中定义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 =]

快乐的编码。