본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[android] NoClassDefFoundError for SafeBrowsingResponse

by 돼지왕 왕돼지 2018. 11. 30.
반응형

[android] NoClassDefFoundError for SafeBrowsingResponse


android.webkit.WebView.EnableSafeBrowsing, backToSafety, Callback, Crash, deceptive, deprecate, EnableSafeBrowsing manifest, enablesafebrowsing meta data, EnableSafeBrowsing metadata, getSafeBrowsingPrivacyPolicyUrl, Malware, manifest tag, meta data, NoClassDefFoundError, onSafeBrowsingHit, phishing, Proceed, safe browsing version, safeBrowsingEnabled, SafeBrowsingResponse, setSafeBrowsingEnabled, showInterstitial, targetsdk, unsafe web resource, v3 v4, Warning, WebViewChromium.init, webviewclient, WebViewClient.onSafeBrowsingHit, WebViewSetting, what is safe browsing, [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();

    }

}




반응형

댓글