【问题标题】:Android : Override a certain class in a library dependencyAndroid:覆盖库依赖项中的某个类
【发布时间】:2018-01-23 08:02:42
【问题描述】:

我在我的项目中使用人行横道作为 webview,现在我想出于某些目的覆盖替换类。

原班

org.xwalk.core.internal

imports....

class SslUtil {

    public static boolean shouldDenyRequest(int error) {
        switch(error) {
            case NetError.ERR_CERT_COMMON_NAME_INVALID:
            case NetError.ERR_CERT_DATE_INVALID:
            case NetError.ERR_CERT_AUTHORITY_INVALID:
            case NetError.ERR_CERT_WEAK_SIGNATURE_ALGORITHM:
            case NetError.ERR_CERT_WEAK_KEY:
            case NetError.ERR_CERT_NAME_CONSTRAINT_VIOLATION:
            case NetError.ERR_CERT_VALIDITY_TOO_LONG:
            case NetError.ERR_CERT_CONTAINS_ERRORS:
            case NetError.ERR_CERT_REVOKED:
            case NetError.ERR_CERT_INVALID:
            case NetError.ERR_SSL_WEAK_SERVER_EPHEMERAL_DH_KEY:
            case NetError.ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN:
            return true;
        default:
            break;
        }
        return false;
    }
}

现在我要做的是通过复制包名和类名来替换它。

org.xwalk.core.internal

imports....

class SslUtil {

    public static boolean shouldDenyRequest(int error) {
        //I'll do my custom handling of error
        return false;
    }
}

当我刚刚使用 Android Studio 运行时,这是可能的,因为 IDE 会询问我应该使用什么 SslUtil。但是由于文件重复,我将无法生成签名的 APK

(org.xwalk.core.internal.SslUtil)

现在有没有一种方法可以从我的依赖项中排除这个特定文件并使用我创建的文件?还是不可能?

【问题讨论】:

  • 没有从编译库中删除该类,我认为您在这里没有很多选择。顺便说一句,请注意,如果您的计划是放宽 SSL 验证(使无效连接变为有效),您的应用可能无法在 Play 商店和其他应用分发渠道上分发。
  • @CommonsWare 是的,我知道这一点,我只是想尝试一下。关于 SSL 验证,我已经使用 API >= 24 (android:networkSecurityConfig) 对其进行了修复,但是 API
  • 一种选择是在 Gradle 项目中滥用 buildSrc。它的类加载器具有优先权,因此可以通过将库中的类放入正确的包中来完全替换它。

标签: android gradle crosswalk


【解决方案1】:

如果您要覆盖一个类,为什么希望它与该类在同一个包中。因为它是你个人的优先权,所以把它放在你的包里。

your.own.package.here

imports....

class SslUtilNew extends SslUtil {

    public static boolean shouldDenyRequest(int error) {
        // Call Super if you want to otherwise use your own method
        //I'll do my custom handling of error
        return false;
    }
}

然后当你想使用它时,将它与你的包一起导入。您仍然可以继续使用其他旧的类方法,并且只使用您覆盖的新方法。

【讨论】:

  • 我只是编辑了它,replace 没有覆盖。 :),这个方法是由库(依赖/人行横道中的另一个类)而不是我调用的。
猜你喜欢
  • 2014-03-18
  • 1970-01-01
  • 2012-08-15
  • 1970-01-01
  • 2020-04-12
  • 2021-03-02
  • 1970-01-01
  • 2015-11-21
  • 2015-01-06
相关资源
最近更新 更多