Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Обновить NewPipeExtractor так, чтобы не потерять совместимость со старыми андроидами #95

Closed
sadr0b0t opened this issue Aug 26, 2021 · 3 comments
Labels
enhancement New feature or request

Comments

@sadr0b0t
Copy link
Owner

sadr0b0t commented Aug 26, 2021

  • NewPipeExtractor нужно обновить, т.к. в версии 0.20.2 давно поломался ютюб и немного PeerTube
  • Проблема в том, что при обновлении до следующей версии (например, 0.21.9), она перестаёт работать на старом планшете Самсунг с 4-м андроидом: всё компилируется, но при попытке открыть плейлист PeerTube вылетает эксепшен
2021-08-27 00:59:46.164 14410-14443/su.sadrobot.yashlang W/art: Unresolved exception class when finding catch block: java.time.format.DateTimeParseException
2021-08-27 00:59:46.167 14410-14443/su.sadrobot.yashlang E/AndroidRuntime: FATAL EXCEPTION: arch_disk_io_1
    Process: su.sadrobot.yashlang, PID: 14410
    java.lang.NoClassDefFoundError: Failed resolution of: Ljava/time/Instant;
        at org.schabi.newpipe.extractor.services.peertube.PeertubeParsingHelper.parseDateFrom(PeertubeParsingHelper.java:38)
        at org.schabi.newpipe.extractor.services.peertube.extractors.PeertubeStreamInfoItemExtractor.getUploadDate(PeertubeStreamInfoItemExtractor.java:80)
        at org.schabi.newpipe.extractor.stream.StreamInfoItemsCollector.extract(StreamInfoItemsCollector.java:75)
        at org.schabi.newpipe.extractor.stream.StreamInfoItemsCollector.commit(StreamInfoItemsCollector.java:106)
        at org.schabi.newpipe.extractor.stream.StreamInfoItemsCollector.commit(StreamInfoItemsCollector.java:33)
        at org.schabi.newpipe.extractor.services.peertube.PeertubeParsingHelper.collectStreamsFrom(PeertubeParsingHelper.java:102)
        at org.schabi.newpipe.extractor.services.peertube.PeertubeParsingHelper.collectStreamsFrom(PeertubeParsingHelper.java:67)
        at org.schabi.newpipe.extractor.services.peertube.extractors.PeertubeAccountExtractor.getPage(PeertubeAccountExtractor.java:147)
        at org.schabi.newpipe.extractor.services.peertube.extractors.PeertubeAccountExtractor.getInitialPage(PeertubeAccountExtractor.java:120)
        at su.sadrobot.yashlang.view.VideoItemOnlyNewOnlineDataSource.loadInitial(VideoItemOnlyNewOnlineDataSource.java:87)
        at androidx.paging.ItemKeyedDataSource.dispatchLoadInitial(ItemKeyedDataSource.java:254)
        at androidx.paging.ContiguousPagedList.<init>(ContiguousPagedList.java:175)
        at androidx.paging.PagedList.create(PagedList.java:216)
        at androidx.paging.PagedList$Builder.build(PagedList.java:388)
        at androidx.paging.LivePagedListBuilder$1.compute(LivePagedListBuilder.java:206)
        at androidx.paging.LivePagedListBuilder$1.compute(LivePagedListBuilder.java:171)
        at androidx.lifecycle.ComputableLiveData$2.run(ComputableLiveData.java:101)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
        at java.lang.Thread.run(Thread.java:762)
     Caused by: java.lang.ClassNotFoundException: Didn't find class "java.time.Instant" on path: DexPathList[[zip file "/data/app/su.sadrobot.yashlang-1/base.apk"],nativeLibraryDirectories=[/data/app/su.sadrobot.yashlang-1/lib/arm, /system/lib, /vendor/lib]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:380)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:312)

смысл эксепшена:

Didn't find class "java.time.Instant

https://stackoverflow.com/questions/49851379/java-lang-noclassdeffounderror-failed-resolution-of-ljava-time-instant

If you open the sdk documentation https://developer.android.com/reference/java/time/Instant.html you see in the upper right corner "added in API level 26" which means the class is not available on older android devices.

API level 26 - это Android 8.0
https://developer.android.com/about/versions/oreo/android-8.0

У меня в настройках сейчас стоит:

minSdkVersion 17

Т.е. чтобы обновить NewPipeExtractor, нужно или дропнуть поддержку всех андроидов младше 8.0 (в т.ч. мой планшет), или каким-то образом обойти эти историю.

у TeamNewPipe есть проект NewPipe-legacy https://github.com/TeamNewPipe/NewPipe-legacy , который запускается на старых андроидах, в т.ч. 4-й ветки.

А на странице NewPipeExtractor есть прямая инструкция
https://github.com/TeamNewPipe/NewPipeExtractor

Note: To use NewPipe Extractor in projects with a minSdkVersion below 26, API desugaring is required.

что за API desugaring написано по ссылке:

Java 8+ API desugaring support (Android Gradle Plugin 4.0.0+)
https://developer.android.com/studio/write/java8-support#library-desugaring

там как раз упоминается

A subset of java.time

Нужно обновить плагин gradle (попробую обновить сразу всю студию) и добавить настройки как написано в app.gradle там. (попробовал добавить настройки в старой студии 2019 - не прокатило, пишет ошибки).

@sadr0b0t sadr0b0t added the enhancement New feature or request label Aug 26, 2021
@sadr0b0t
Copy link
Owner Author

Просто обновить студию не достаточно (или не нужно), нужно было указать новый грейдл в настройках проекта - он сам после этого выкачивает и подключает нужную версию, как с остальными модулями.

https://developer.android.com/studio/releases/gradle-plugin#updating-plugin

@sadr0b0t
Copy link
Owner Author

sadr0b0t commented Aug 27, 2021

После этого тоже сходу не скомпилировалось, ругалось так:

In order to use core library desugaring, please enable java 8 language desugaring with D8 or R8.

в инструкциях про это ничего не было написано, нашел как-то в gradle.properties:

# https://stackoverflow.com/questions/52783212/how-to-resolve-multiple-d8-warnings-class-x-was-not-found-it-is-required-for
android.enableD8.desugaring=false

скорее всего сам включил раньше, чтобы убрать ошибки или ворнинги при компиляции.

Выключил эту строку - скомпилялось (из заодно исчез вечный ворнинг из-за этой настройки).

@sadr0b0t
Copy link
Owner Author

Обновил ок 7f0636c

попутно исправилось несколько багов:

# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

1 participant