[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 로 할 것을 권장한다.
-
위에서는 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은... 부터는 대충 무슨 이야기인지는 알겠지만, 실제 사용해봐야 정확히 이해할 수 있을 것 같다. )
-
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();
}
}
'프로그래밍 놀이터 > 안드로이드, Java' 카테고리의 다른 글
[android] Oreo 에서는 Wakelock 이 소용 없다?! (0) | 2018.12.02 |
---|---|
[android] WakefulBroadcastReceiver 를 알아보자! (2) | 2018.12.01 |
[android] Cookie 는 android 단말에서 world wide 한가? (0) | 2018.11.29 |
[android] JobIntentService 소개 (tutorial) (0) | 2018.11.28 |
[android] AAC 로 app 의 background, foreground 상태 알기 (1) | 2018.11.24 |
댓글