如何限制对Android库的某些API的访问

14 浏览
0 Comments

如何限制对Android库的某些API的访问

我想构建一个Android库,使得除了一个类之外的所有类对于使用该库的应用程序都不可访问。我该怎么做?

0
0 Comments

问题的原因是开发者想要限制对Android库中某些API的访问。解决方法是将这些API标记为私有,与传统的Java JAR中的做法相同。这样,这些API在库内的所有其他类和包中可见,但在库外不可见。这类似于.NET中的internal关键字。使用默认的包私有(package-private)作用域也可以达到相同的效果,但是开发者仍然可以在使用的包中编写自己的类,并因此访问这些API。这样,常规应用代码只能访问公共(public)(以及如果进行子类化的话,受保护的(protected))的内容。包私有的作用域不适用于该库,因为该库包含很多包。开发者希望有类似于不导出某些包或禁止对其访问的功能。然而,很抱歉,我不知道在Java中有任何实现这一点的方法。在Java中,没有"导出"JAR中的概念。您的代码、应用程序的代码和其他库的代码都是对等的,受到Java的private等作用域规则的约束。您可以尝试在库上使用ProGuard,对您不认为是公共API的部分进行混淆。这不会阻止开发者调用您的内部实现,但它会让他们很难无意中这样做。开发者的目的不是防止代码被黑客或发现,而是为了方便客户。该库只有少量公共API,但功能非常广泛。开发者希望明确地将公共接口与内部实现分开。很抱歉,但在Java中确实没有任何满足开发者需求的方法。开发者可以按照我提到的任何方法进行操作,或者将文档限制为公共API,并保持实际代码不变。关于android.jar中的Java Build Path,它有一个访问规则,禁止访问android.internal.*包。在打包库时,开发者如何实现类似的访问限制?我不知道android.jar中有任何android.internal类,而且在android.jar中也找不到这些类。源代码中有一些com.android.internal类,其中只有一个(名为com.android.internal.util.Predicate的接口)出现在android.jar中。开发者当然可以在代码中使用Predicate,但这样做是不明智的。

0
0 Comments

问题出现的原因:当使用JAR文件打包SDK时,无法直接限制访问某些API。但是,可以通过创建两个JAR文件来模拟Android SDK中隐藏的内部API。一个JAR文件是常规库,另一个是剥离了部分API的库。

解决方法:创建一个完整的库(sdk-runtime.jar),其中包含一个类Api,其中有一个public的init()方法和anotherPublicMethod()方法。然后创建一个剥离了anotherPublicMethod()的库(sdk-api.jar),只暴露出init()方法。然后,让SDK的使用者按照以下配置来配置他们的应用程序依赖关系:

dependencies {

provided files('libs/sdk-api.jar')

apk files('libs/sdk-runtime.jar')

}

通过以上配置,依赖库会被添加到编译路径,但不会被添加到APK中。这样,由于已经从sdk-api.jar中剥离了anotherPublicMethod(),因此它对SDK的使用者是不可用的。

最后,作者提供了一个简单的应用程序示例项目,该项目使用了上述的SDK。

文章链接:https://github.com/alipov/android-sdk-hide-implementation-sample

0