commonmark / commonmark/commonmark-java

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 で見る

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

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

説明

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.

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

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

はじめの一歩

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

調査の方向性

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

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

評価

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

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

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