向后兼容Android/Java代码
问题描述:
我正在编写一些代码,这些代码将被一些维护SDK的合作伙伴使用。 Android 1.5到2.3.7的开发人员使用SDK。我的代码使用仅在2.2及更高版本上可用的功能。如何编写我的代码,以便使用合作伙伴SDK的开发人员在Android < 2.2上不会收到编译错误?向后兼容Android/Java代码
我试过使用反射和避免导入/声明使用2.2之前不可用的类,但代码没有工作后2.2由于未能派发到方法,我已经将所需的类类型更改为对象。
答
您可以尝试将代码拆分为基准(Android 1.5)并为更高的API级别提供额外的JAR,类似于Android compat librabry与Android 1.6兼容的“v4”风格以及“ v11“适用于Android 3.2及更高版本。
在某些情况下,您可能也可以从AOSP获取代码并将选定的2.2功能回溯。我这样做了,例如能够在API级别7使用getExternalCacheDir()
:
private static File getExternalCacheDir(final Context context) {
// return context.getExternalCacheDir(); API level 8
// e.g. "<sdcard>/Android/data/<package_name>/cache/"
final File extCacheDir = new File(Environment.getExternalStorageDirectory(),
"/Android/data/" + context.getApplicationInfo().packageName + "/cache/");
extCacheDir.mkdirs();
return extCacheDir;
}
反思,重码将是维护的噩梦 - 就像你要避免红色的那些编译器错误加密狗为您的客户/合作伙伴,你想以查看它们而不是反射代码中过时常量引起的一些模糊的运行时异常。
因此,听起来像任何基于非反射的解决方案都需要对最终用户(开发人员)的部分操作。我希望避免这种情况,因为我怀疑我们能够说服我们的合作伙伴要求SDK用户进行更复杂的集成。 – richcollins
根据android:minSdkVersion,他们需要将正确的JAR放入'lib'文件夹中,这不应该太难。与非代码质量/稳定性相提并论,这种代码质量/稳定性是基于非最小反射的方法 - 通常直接转化为更低的代价。 –