Open kirin233x opened 2 years ago
java.time相关API不好脱糖吧?具体脱糖相关的技术我也不了解
java.time相关API不好脱糖吧?具体脱糖相关的技术我也不了解
https://developer.android.com/studio/write/java8-support-table?hl=zh-cn 我看这里面是支持java8 time的api的。
看似可行,但怎么改,你能帮提PR到这个分支么? https://github.com/alibaba/fastjson2/tree/2.0.16.android
公司电脑不允许不提交代码,我回家研究一下然后尝试改一下。
@wenshao 我试了一下,直接在Androir的demo里面配置脱糖,Date相关的类是没有报异常的。主要是一些Collections的方法没有脱糖,是不支持的。 脱糖的方法:
android里面添加:
compileOptions {
coreLibraryDesugaringEnabled true
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
依赖里面添加:
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.2.0'
具体可以通过脱糖调用的Collections方法: https://developer.android.com/studio/write/java8-support-table?hl=zh-cn
Fastjson2里面用了很多
static final Class CLASS_SINGLETON_MAP = Collections.singletonMap(1, 1).getClass();
static final Class CLASS_EMPTY_MAP = Collections.EMPTY_MAP.getClass();
static final Class CLASS_EMPTY_SORTED_MAP = Collections.emptySortedMap().getClass();
static final Class CLASS_EMPTY_NAVIGABLE_MAP = Collections.emptyNavigableMap().getClass();
static final Class CLASS_UNMODIFIABLE_MAP = Collections.unmodifiableMap(Collections.emptyMap()).getClass();
static final Class CLASS_UNMODIFIABLE_SORTED_MAP = Collections.unmodifiableSortedMap(Collections.emptySortedMap()).getClass();
static final Class CLASS_UNMODIFIABLE_NAVIGABLE_MAP = Collections.unmodifiableNavigableMap(Collections.emptyNavigableMap()).getClass();
public static ObjectReaderImplMap INSTANCE = new ObjectReaderImplMap(null, HashMap.class, HashMap.class, 0, null);
public static ObjectReaderImplMap INSTANCE_OBJECT = new ObjectReaderImplMap(null, JSONObject.class, JSONObject.class, 0, null);
这些通过脱糖解决不了,不过我理解你们如果能够把这些方法替换掉,理论上是可以在低版本Android上使用的。 报错的示例如下:
W/System.err: java.lang.NoSuchMethodError: No static method emptySortedMap()Ljava/util/SortedMap; in class Ljava/util/Collections; or its super classes (declaration of 'java.util.Collections' appears in /system/framework/core-libart.jar)
W/System.err: at com.alibaba.fastjson2.reader.ObjectReaderImplMap.<clinit>(ObjectReaderImplMap.java:22)
W/System.err: at com.alibaba.fastjson2.reader.ObjectReaderProvider.<init>(ObjectReaderProvider.java:331)
W/System.err: at com.alibaba.fastjson2.JSONFactory.<clinit>(JSONFactory.java:212)
W/System.err: at com.alibaba.fastjson2.JSONReader.of(JSONReader.java:2330)
W/System.err: at com.alibaba.fastjson2.JSON$-CC.parseObject(JSON.java:137)
W/System.err: at com.huawei.fastjson2.MainActivity.fastjsonTest(MainActivity.java:86)
W/System.err: at com.huawei.fastjson2.MainActivity.access$000(MainActivity.java:29)
W/System.err: at com.huawei.fastjson2.MainActivity$1.onClick(MainActivity.java:50)
W/System.err: at android.view.View.performClick(View.java:5273)
W/System.err: at android.view.View$PerformClick.run(View.java:21315)
W/System.err: at android.os.Handler.handleCallback(Handler.java:743)
W/System.err: at android.os.Handler.dispatchMessage(Handler.java:95)
W/System.err: at android.os.Looper.loop(Looper.java:150)
W/System.err: at android.app.ActivityThread.main(ActivityThread.java:5659)
W/System.err: at java.lang.reflect.Method.invoke(Native Method)
W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:822)
W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:712)
成功了吗?不过我感觉没成功,要是成功了2.0.21.android 就不会报错了
没成功, 一些没有脱糖的类没法用。
目前仅支持Android8.0以上的版本,我在其他issue中看到是因为java.time的问题 目前Android通过脱糖可以支持java.time的接口而无需设置最低平台版本号。这种方式可行吗?