You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tika.apache.org by "Andrei Dobrescu (Jira)" <ji...@apache.org> on 2021/08/23 07:39:00 UTC
[jira] [Closed] (TIKA-3534) Latest Android Studio will fail
building Android project with Tika Core 2.0.0 included - issues with
MethodHandle API usage
[ https://issues.apache.org/jira/browse/TIKA-3534?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Andrei Dobrescu closed TIKA-3534.
---------------------------------
Resolution: Won't Fix
> Latest Android Studio will fail building Android project with Tika Core 2.0.0 included - issues with MethodHandle API usage
> ---------------------------------------------------------------------------------------------------------------------------
>
> Key: TIKA-3534
> URL: https://issues.apache.org/jira/browse/TIKA-3534
> Project: Tika
> Issue Type: Bug
> Components: core
> Affects Versions: 2.0.0
> Reporter: Andrei Dobrescu
> Priority: Major
>
> I use Tika Core on top of my Android projects in order to detect mime types of files.
> Recently, build started to fail with this error:
> {code:java}
> com.android.tools.r8.internal.m1: MethodHandle.invoke and MethodHandle.invokeExact are only supported starting with Android O (--min-api 26)
> {code}
> MethodHandle API was included in Android Oreo. I could set minimum SDK version to Oreo, but I still have users with Android L,M,N (API level 21 to 25).
> By exploring Tika Core source code, I observed that the MethodHandle API is only used only on this class: [org.apache.tika.io.MappedBufferCleaner|[https://github.com/apache/tika/blob/main/tika-core/src/main/java/org/apache/tika/io/MappedBufferCleaner.java]] This class doesn't seem to be used anywhere else in the project. It also contains some huge hacks, with sun.misc.Unsafe (which is also unavailable on Android).
>
> What is the purpose of this class? Why is it here?
> Why is not used anywhere else inside the project?
> Can you please remove this class on the next Tika release?
>
> Dirty working workaround:
> In theory, one can use JarJar gradle plugin to modify contents of the imported Tika Core jar dependency:
> {code:java}
> buildscript {
> dependencies {
> classpath 'org.anarres.jarjar:jarjar-gradle:1.0.1'
> }
> }
> dependencies {
> implementation jarjar.repackage {
> from 'org.apache.tika:tika-core:2.0.0'
> classDelete 'org.apache.tika.io.MappedBufferCleaner'
> }
> }
> {code}
> However, JarJar gradle plugin is a bit outdated and I couldn't make it work. An alternative would be to tell gradle to download the jar file, create a modified jar file that includes all of the original jar's contents, excluding MappedBufferCleaner, then import the modified jar file:
> {code:java}
> task tikaAndroidJar(type: Zip) {
> if (!buildDir.exists())
> buildDir.mkdir()
> def originalJarFile = new File("$buildDir/tika-core-original.jar")
> def originalJarUrl = 'https://repo1.maven.org/maven2/org/apache/tika/tika-core/2.0.0/tika-core-2.0.0.jar'
> new URL(originalJarUrl).withInputStream { i -> originalJarFile.withOutputStream{ o -> o << i }}
> from zipTree(originalJarFile)
> include '**/*.class'
> exclude 'org/apache/tika/io/MappedBufferCleaner.class'
> exclude 'org/apache/tika/io/MappedBufferCleaner$BufferCleaner.class'
> archiveName 'tika-core-modified.jar'
> destinationDir(file("$buildDir/"))
> }
> dependencies {
> implementation files("$buildDir/tika-core-modified.jar") {
> builtBy "tikaAndroidJar"
> }
> }
> {code}
> Still, it's an ugly solution. The library works fine without MappedBufferCleaner class, the project builds and at runtime it can detect mime types of files.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)