不要使用 android 的内置 org.json

Don't use android's built in org.json

我编写了一个使用 org.json (A) from json.org, under the assumption that Android used the same (in android it's also called org.json (B), just that it misses some relatively critical features). Now what I'd like to do is set up my gradle, so that my project uses org.json (A) 而不是 org.json (B) 的库。我尝试将以下内容添加到我的 app.gradle:

android {
    blabla
    defaultConfig {
        blabla
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    sourceSets{
        main{
            java{
                exclude 'org/json/**'
            }
        }
    }

}

但是,这似乎不起作用。我仍然可以使用 Android 的 org.json (B),并且在键入 new JSONObject() 时它仍然使用 Android 的实现。我该如何解决这个问题?

How could I fix this?

将您的 org.json 更改为 org.something.else。您不能将系统提供的包替换为来自应用程序的包,即使对于您自己的进程也是如此。你不控制运行时类路径,固件总是赢。

或者,从 org.json 切换到性能更好的东西,例如 Gson 或 Jackson。

您可以将 org.json 依赖项重新定位到另一个包名称。 这可以通过 gradle shadow 插件来完成。

插件项目:https://github.com/johnrengelman/shadow
插件文档:https://imperceptiblethoughts.com/shadow/

我的工作示例:
提示:我在我的 Android 项目中使用 java 库项目 "lib",它依赖于 org.json.

lib/build.gradle

apply plugin: 'java-library'
apply plugin: 'com.github.johnrengelman.shadow'

buildscript {
    repositories {
        maven {
            url "https://plugins.gradle.org/m2/"
        }
    }
    dependencies {
        classpath 'com.github.jengelman.gradle.plugins:shadow:4.0.3'
    }
}

shadowJar {
    relocate 'org.json', 'shadow.org.json'
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation('org.json:json:20180813')
}

sourceCompatibility = "1.7"
targetCompatibility = "1.7"

app/build.gradle

apply plugin: 'com.android.application'

android {
    [..]
}

dependencies {
    [..]
    implementation project(path: ':lib', configuration: 'shadow')
}