alibaba / fastjson2

🚄 FASTJSON2 is a Java JSON library with excellent performance.
Apache License 2.0
3.79k stars 495 forks source link

[QUESTION] 通过Android的脱糖能支持8.0以下的版本吗? #850

Open kirin233x opened 2 years ago

kirin233x commented 2 years ago

目前仅支持Android8.0以上的版本,我在其他issue中看到是因为java.time的问题 目前Android通过脱糖可以支持java.time的接口而无需设置最低平台版本号。这种方式可行吗?

wenshao commented 2 years ago

java.time相关API不好脱糖吧?具体脱糖相关的技术我也不了解

kirin233x commented 2 years ago

java.time相关API不好脱糖吧?具体脱糖相关的技术我也不了解

https://developer.android.com/studio/write/java8-support-table?hl=zh-cn 我看这里面是支持java8 time的api的。

wenshao commented 2 years ago

看似可行,但怎么改,你能帮提PR到这个分支么? https://github.com/alibaba/fastjson2/tree/2.0.16.android

kirin233x commented 2 years ago

公司电脑不允许不提交代码,我回家研究一下然后尝试改一下。

kirin233x commented 2 years ago

@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)
andrewliu1345 commented 1 year ago

成功了吗?不过我感觉没成功,要是成功了2.0.21.android 就不会报错了

kirin233x commented 1 year ago

没成功, 一些没有脱糖的类没法用。