프로그래밍 놀이터/안드로이드, Java

[android] NoClassDefFoundError for SafeBrowsingResponse

돼지왕 왕돼지 2018. 11. 30. 13:30
반응형

[android] NoClassDefFoundError for SafeBrowsingResponse



-

아래와 같은 로그를 보았다. (@ 26(8.0 OOS) device, targetSDK 23(6.0 MOS) )

그래서 research 를 해보았다.

I/zygote64: Rejecting re-init on previously-failed class java.lang.Class<vp>: java.lang.NoClassDefFoundError: Failed resolution of: Landroid/webkit/SafeBrowsingResponse;

        at void com.android.webview.chromium.WebViewChromium.init(java.util.Map, boolean) (PG:53)

        at void android.webkit.WebView.<init>(android.content.Context, android.util.AttributeSet, int, int, java.util.Map, boolean) (WebView.java:651)

        at void android.webkit.WebView.<init>(android.content.Context, android.util.AttributeSet, int, int) (WebView.java:581)

        at void android.webkit.WebView.<init>(android.content.Context, android.util.AttributeSet, int) (WebView.java:564)

        at void android.webkit.WebView.<init>(android.content.Context, android.util.AttributeSet) (WebView.java:551)

        at void android.webkit.WebView.<init>(android.content.Context) (WebView.java:541)



-

https://stackoverflow.com/questions/49633271/what-is-android-webkit-safebrowsingresponse-error


위에서는 OOS 이상에서 WebViewSetting 의 safeBrowsingEnabled 를 false 로 할 것을 권장한다.



-

http://www.masterqna.com/android/84568/7-1-1-%EA%B0%A4%EB%9F%AD%EC%8B%9C%EC%97%90%EC%84%9C-webview-%EA%B0%80-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EB%B3%B4%EC%9D%B4%EC%A7%80-%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4


위에서는 targetSdk 버전이 27(8.1 Oreo MR1) 혹은 기기 버전이 27 이상인 경우 마찬가지로 safeBrowsingEnabled 가 false 가 아닐 때 발견된다고 하며..

url 로딩은 제대로 되었다는 제보가 있다. (실제 테스트는 못함)



-

https://github.com/googleads/googleads-consent-sdk-android/issues/27


위를 보면 해당 로그는 crash 는 아니고 WebView 가 warning 을 보여주는 것이라 한다.



-

그래서 Safe Browsing 이 뭔지 먼저 찾아보았다.

https://developers.google.com/safe-browsing/


Safe Browsing 은 Google 의 service 로 Google 이 관리하는 unsafe web resource 에 매칭되는 URL 에 대한 검사를 수행한다.

Unsafe web 이라 하면 phishing, deceptive(탈취) site 를 이야기하며, malware 나 원하지 않는 software 를 설치하는 site 들을 포함한다.



-

Safe Browsing 으로 할 수 있는 것은..


page 가 Safe Browsing list 에 있는지 확인하고, threat type 도 확인할 수 있다.

user 가 link 를 클릭하기 전에 경고를 해줄 수 있다.

user 가 link 를 가져가는 것을 방지할 수 있다.


2018 10 1 기준 v4 버전을 사용한다. (v3 는 deprecated)



-

SafeBrowsingResponse 도 뭔지 찾아보았다.

https://developer.android.com/reference/android/webkit/SafeBrowsingResponse


먼저 이 녀석은 API Level 27(OOS MR1) 에 등장했다.


이 녀석은 malicious URL 을 hit 했을 때 작동하는 녀석이라고 한다.

WebView 에 의해 생성되고 WebViewClient.onSafeBrowsingHit(WebView, WebResourceRequest, int, SafeBrowsingResponse) 을 callback 으로 호출한다.


host app 은 WebView 의 response 를 Safe Browsing hit 으로 설정하기 위해 반드시 showInterstitial(boolean), proceed(boolean) 혹은 backToSafety(boolean) 을 호출해주어야 한다.


만약 enable 이 된다면 모든 report 는 privacy policy 에 명시된 곳으로 전송된다.

WebView.getSafeBrowsingPrivacyPolicyUrl()

(host app은... 부터는 대충 무슨 이야기인지는 알겠지만, 실제 사용해봐야 정확히 이해할 수 있을 것 같다. )



-

https://developer.android.com/reference/android/webkit/WebSettings.html#setSafeBrowsingEnabled(boolean)


WebViewSetting.setSafeBrowsingEnabled 는 API Level 26(OOS) 부터 사용 가능하다.


SafeBrowsing 은 malware 나 phishing attack 으로부터 안전하게 지켜준다.

manifest tag 를 통해 모든 WebView 에 값을 적용할 수도 있다.

manifest 를 통한 설정은 API 를 통한 설정보다 우선순위가 낮다.


SafeBrowsing 은 support 하는 단말이라면 기본으로 enable 되어 있다.



-

https://developer.android.com/guide/webapps/managing-webview#safe-browsing


WebView 는 Google Safe Browsing 기능을 사용할 수 있으며, 이를 통해 위험한 사이트를 피할 수 있다.

EnableSafeBrowsing 의 기본값은 true 이다. 그리고 Safe Browsing 을 조건부로 enable 시키거나 disable 시키는 일은 흔치 않을 것이다.

Android 8.0 (API Level 26, O ) 이상에서는 setSafeBrowsingEnabled() API 를 사용할 수 있다.

하위 api level 을 사용하는 경우에는 EnableSafeBrowsing 을 manifest 를 통해 false 로 두어 모든 WebView 에 대해 disable 시켜주어야 한다.


target 이 Android 7.1( API Level 25, N MR1 ) 이하인 경우 meta data 를 통해 옵셔널 하게 설정할 수 있다.

<manifest>

    <application>

        <meta-data android:name="android.webkit.WebView.EnableSafeBrowsing"

                   android:value="false" />

        ...

    </application>

</manifest>



-

사용은 아래와 같이 한다.

mSuperSafeWebView.setWebViewClient(new MyWebViewClient());

mSuperSafeWebView.startSafeBrowsing(this, new ValueCallback<Boolean>() {

        @Override

        public void onReceiveValue(Boolean success) {

            mSafeBrowsingIsInitialized = true;

            if (!success) {

                Log.e("MY_APP_TAG", "Unable to initialize Safe Browsing!");

            }

        }

    });


public class MyWebViewClient extends WebViewClient {

    // Automatically go "back to safety" when attempting to load a website that

    // Google has identified as a known threat. An instance of WebView calls

    // this method only after Safe Browsing is initialized, so there's no

    // conditional logic needed here.

    @Override

    public void onSafeBrowsingHit(WebView view, WebResourceRequest request, int threatType, SafeBrowsingResponse callback) {

        // The "true" argument indicates that your app reports incidents like this one to Safe Browsing.

        callback.backToSafety(true);

        Toast.makeText(view.getContext(), "Unsafe web page blocked.",Toast.LENGTH_LONG).show();

    }

}




반응형