不要使用android内置的org.json

时间:2015-11-19 12:17:49

标签: java android json android-gradle org.json

我已经编写了一个使用json.org org.json(A)的库,假设Android使用相同的(在android中它也被称为org.json( B),只是它错过了一些相对关键的功能)。现在我要做的就是设置我的gradle,以便我的项目使用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的实现。我怎么能解决这个问题?

2 个答案:

答案 0 :(得分:1)

  

我该如何解决这个问题?

将您的org.json更改为org.something.else。您不能将系统提供的软件包替换为应用程序中的软件包,即使对于您自己的进程也是如此。您无法控制运行时类路径,固件始终会获胜。

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

答案 1 :(得分:0)

您可以将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')
}