从我的Android库访问应用程序R类

时间:2017-04-17 08:52:42

标签: java android reflection android-resources

我正在开发一个需要访问实现它的应用程序的布局项的库。我知道怎么做的唯一方法就是反思。换句话说,如果我为我的库API创建一个构造函数,如下所示:

public MyLibraryAPI(String packageName) {
    Class appR = Class.forName(String.format("%s.R", packageName));
    ...
}

开发人员将使用包名作为构造函数中的参数来实例化库。

我最终需要的是让我的内部类知道开发人员布局(.xml文件)中使用的Android视图 - 包括id和类型。有没有办法在没有反射的情况下实现这一目标并避免性能开销?我确定无法做到,但要求以防专家看到我没注意到的事情。

编辑:此外,默认情况下,proguard会对代码进行模糊处理,但结果却无法为JVM提供在运行时实现反射的方法,所以如果我使用反射,我必须要求开发人员关闭对他或她的R级进行的混淆,这是一个无赖。

1 个答案:

答案 0 :(得分:1)

对Android的反思非常昂贵。一些善意和受欢迎的图书馆如Roboguice已经倒闭,部分原因是反思的表现成本。

我怀疑某种代码生成是正确的解决方案。 Dagger 2Butter KnifeData Binding Library是使用代码生成的Android库的成功示例。由于数据绑定库会对XML执行检查,因此它必须可用于构建中该阶段的代码生成库,您可以将实现基于以下内容:此处是指向source jars at Maven Central的链接

除此之外,似乎在易用性和难以实施之间会有一些妥协。如果强制消费者使用注释对其类进行注释,则使用起来会变得更加困难,但实现起来可能要容易得多。如果您限制自己检查XML和生成的R文件并从中生成代码,那么我认为您的工作将变得更加困难。另一方面,使用注释已变得相当普遍,对用户而言可能不是这样的问题。

祝你好运!