从我的 Android 库访问应用 R class
Accessing app R class from my Android library
我正在开发一个库,需要访问实现它的应用程序的布局项。我知道怎么做的唯一方法就是反思。换句话说,如果我像这样为我的库 API 创建一个构造函数:
public MyLibraryAPI(String packageName) {
Class appR = Class.forName(String.format("%s.R", packageName));
...
}
并且开发人员会在构造函数中将其包名作为参数来实例化库。
我最终需要的是让我内心的 classes 知道开发人员布局(.xml 文件)中使用的 Android 视图 - ID 和类型。有没有办法在没有反射的情况下实现这一目标并避免性能开销?我敢肯定这是做不到的,但请问是否有专家看到我没有注意到的事情。
编辑:此外,proguard 默认情况下会混淆保护代码,但结果是无法为 JVM 提供在运行时实现反射的方法,因此如果我使用反射,我将不得不要求开发人员为他或她的 R class 关闭 proguard 混淆,这是一个无赖。
对 Android 的反思是非常昂贵的。一些善意和流行的库,如 Roboguice 已经倒下,部分原因是反射的性能成本。
我怀疑某种代码生成是这里的正确解决方案。 Dagger 2, Butter Knife and the Data Binding Library are successful examples of Android libraries that employ code generation. Since the data binding library performs inspections on the XML, it must be available to code generation libraries at that stage in the build and you may be able to base your implementation on that: here's a link to the source jars at Maven Central.
除此之外,是的,似乎在易用性和实施难度之间会有一些折衷。如果您强迫您的消费者使用您的注释来注释他们的 类,它会变得更难使用,但可能更容易实现。如果您限制自己检查 XML 和生成的 R
文件并从中生成代码,那么我认为您的工作会困难得多。另一方面,使用注释已经变得相当普遍,对您的用户来说可能不是这样的问题。
祝你好运!
我正在开发一个库,需要访问实现它的应用程序的布局项。我知道怎么做的唯一方法就是反思。换句话说,如果我像这样为我的库 API 创建一个构造函数:
public MyLibraryAPI(String packageName) {
Class appR = Class.forName(String.format("%s.R", packageName));
...
}
并且开发人员会在构造函数中将其包名作为参数来实例化库。
我最终需要的是让我内心的 classes 知道开发人员布局(.xml 文件)中使用的 Android 视图 - ID 和类型。有没有办法在没有反射的情况下实现这一目标并避免性能开销?我敢肯定这是做不到的,但请问是否有专家看到我没有注意到的事情。
编辑:此外,proguard 默认情况下会混淆保护代码,但结果是无法为 JVM 提供在运行时实现反射的方法,因此如果我使用反射,我将不得不要求开发人员为他或她的 R class 关闭 proguard 混淆,这是一个无赖。
对 Android 的反思是非常昂贵的。一些善意和流行的库,如 Roboguice 已经倒下,部分原因是反射的性能成本。
我怀疑某种代码生成是这里的正确解决方案。 Dagger 2, Butter Knife and the Data Binding Library are successful examples of Android libraries that employ code generation. Since the data binding library performs inspections on the XML, it must be available to code generation libraries at that stage in the build and you may be able to base your implementation on that: here's a link to the source jars at Maven Central.
除此之外,是的,似乎在易用性和实施难度之间会有一些折衷。如果您强迫您的消费者使用您的注释来注释他们的 类,它会变得更难使用,但可能更容易实现。如果您限制自己检查 XML 和生成的 R
文件并从中生成代码,那么我认为您的工作会困难得多。另一方面,使用注释已经变得相当普遍,对您的用户来说可能不是这样的问题。
祝你好运!