Android: List.of() (API 30+) used in core since 0.24.0 contradicts the README's "minimum API level is 19"

オープン
#457 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

評価

難易度
4/5
見積もり時間
3〜5日
初心者へのやさしさ
74/100
issue の種類
バグ
明瞭さ
明確に書かれている
活発さ
活発
技術スタック
android, java
領域
mobile-dev

調査の方向性

まず、commonmark モジュールにある List.of、Set.of、Map.of の記載された使用箇所と、.github/workflows/ci.yml の Android テスト設定を確認します。core library desugaring なしで API 24~29 の失敗を再現し、そのうえで、選択した解決策によって README、実行時の動作、Android サポートに関する想定の整合性が保たれることを確認します。

索引モデルが issue の本文から書いたものです。

説明

Summary

Since 0.24.0 the core commonmark module uses java.util.List.of(...) (and a few Set.of/Map.of). On Android these methods exist only from API 30 (Android 11). The README still says:

It works on Android too, but that is on a best-effort basis, please report problems. For Android the minimum API level is 19

An app with minSdk < 30 that does not enable core library desugaring crashes on the first parse on API < 30 devices:

java.lang.NoSuchMethodError: No static method of(Ljava/lang/Object;)Ljava/util/List;
    at org.commonmark.internal.InlineParserImpl.parse(InlineParserImpl.java)

This is the same class of problem as #366 / #373 (Objects.requireNonNullElseGet, fixed by #369). The List.of usages were introduced deliberately in #322 as a Java 11 clean-up, so this is a report that the clean-up and the Android support statement now disagree — not a claim that the change was wrong.

Steps to reproduce

Android app, minSdk 24, no coreLibraryDesugaring, org.commonmark:commonmark:0.30.0, run on an API 24–29 emulator:

Parser.builder().build().parse("*a*")   // NoSuchMethodError: List.of

With isCoreLibraryDesugaringEnabled = true + com.android.tools:desugar_jdk_libs:2.1.5 the same code works on API 24 (verified on an API 24 emulator).

Where the API 30+ calls live (0.30.0, commonmark module)

List.of / Set.of / Map.of occurrences by file:

File Count
internal/InlineParserImpl.java 8
renderer/markdown/CoreMarkdownNodeRenderer.java 3
renderer/html/CoreHtmlNodeRenderer.java 3
parser/Parser.java 3 (incl. Javadoc example)
internal/ParagraphParser.java 2
internal/IndentedCodeBlockParser.java 2
renderer/text/CoreTextContentNodeRenderer.java, renderer/markdown/MarkdownRenderer.java, renderer/html/HtmlWriter.java, renderer/html/DefaultUrlSanitizer.java, parser/block/AbstractBlockParser.java, node/SourceSpans.java 1 each

0.22.0 had none; 0.24.0 introduced 8 in InlineParserImpl.

Why CI did not catch it

commonmark-android-test is only run through ./gradlew :app:lint in .github/workflows/ci.yml (minSdk 19, no emulator run), so a runtime NoSuchMethodError never surfaces there.

Possible resolutions

Either would be fine from a consumer's point of view — the important part is that the README and the code agree:

  1. Keep API 19 support — replace the factory calls with Java 8 equivalents (Collections.emptyList() / singletonList(x) / unmodifiableList(Arrays.asList(a, b)), same for Set/Map). Mechanical, ~26 sites, keeps immutability. I can send a PR if you want this.
  2. Document the new requirement — state in the README that Android needs API 30+ or core library desugaring, and ideally have commonmark-android-test run on an emulator (or fail lint on NewApi) so future regressions are visible.

Context: I hit this while building an Android Markdown renderer on top of commonmark-java (https://github.com/Jimmy-Jung/RichMarkdown-Android). We chose minSdk 30 for now, so this is not blocking us — reporting because the README statement is likely to mislead other Android users.

主要言語
Java
スター
2.7k
フォーク
336
PR マージ指標
30日以内にマージされた PR はありません

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

commonmark/commonmark-java のほかの issue

commonmark/commonmark-java の issue をすべて見る

似ている issue

Java の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。