Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up
for free
AndroidX Webkit
Kurun
November 27, 2019
Technology
3
540
AndroidX Webkit
Kurun
November 27, 2019
Tweet
Share
More Decks by Kurun
See All by Kurun
kurunpan
1
1.2k
kurunpan
0
520
kurunpan
1
1.2k
kurunpan
4
1.1k
kurunpan
0
540
kurunpan
2
1.3k
kurunpan
4
540
kurunpan
4
1.2k
Other Decks in Technology
See All in Technology
chomado
0
270
michigari
0
150
ishiitetsuji
0
110
kawanamiyuu
4
700
line_developers
PRO
2
370
futo23
1
1.1k
lain21
12
5.1k
charity
9
10k
prog893
14
3.6k
tatsy
0
110
picardparis
4
2.4k
noriyukitakei
0
1.1k
Featured
See All Featured
skipperchong
8
780
lauravandoore
10
1.7k
mza
80
4.2k
orderedlist
PRO
330
36k
qrush
285
19k
davidbonilla
70
3.6k
rocio
155
11k
mongodb
23
3.9k
chriscoyier
498
130k
gr2m
83
11k
robhawkes
52
2.9k
revolveconf
200
9.7k
Transcript
AndroidX Webkit ू·ΕKotlin͖ʂKotlinѪձ Vol.17 (2019/11/27) @kurun_pan
• ຊۀ ‣ Linux Software Engineer ✓ Linux kernel, Driver,
Middleware, Application ͳͲඞཁͳΒԿͰ ✓ ࠷ۙUIϑϨʔϜϫʔΫؔ࿈ • ϓϥΠϕʔτ ‣ ੵۃతʹษڧձʹࢀՃˍొஃத ‣ ओʹAndroidΞϓϦΛ։ൃ Self-introduction @kurun_pan @Kurun-pan
• Webkit֓ཁ ‣ Webkitͱʁ ‣ WebKitͱͷҧ͍ΞʔΩςΫνϟͳͲ • AndroidX WebKitͷ৽ػೳ ‣
ຊ།ҰͷKotlinཁૉɻKotlinཁૉ͕ബͯ͘͢Έ·ͤΜ… • ͦͷଞ ຊͷ༰
• AndroidX JetpackϥΠϒϥϦͷҰͭ ‣ Support Libraryͷஔ͖͑ ✓ API Level 14Ҏ্ͷαϙʔτ
• ԼҐޓੑҎ֎ʹఏڙ͞ΕΔػೳ ‣ WebViewʹؔΘΔศརͳઃఆ • ެࣜใ ‣ APIϦϑΝϨϯε ✓ https://developer.android.com/reference/androidx/webkit/package-summary ‣ ϦϦʔεϊʔτ ✓ https://developer.android.com/jetpack/androidx/releases/webkit ‣ ιʔείʔυ ✓ https://android.googlesource.com/platform/frameworks/support/+/androidx-master-dev/webkit Webkitͱʁ
ϨϯμϦϯάΤϯδϯ ϕʔε 4BGBSJ 8FC,JU ,)5.- $ISPNF #MJOL 8FC,JU 'JSFGPY
(FDLP 4FSWPʹஔ͖͑த ͱ͍͏͜ͱͰɺandroidx.webkitͱ͍͏໊લ͕एׯࠞཚΛট͔͘ ʢandroid.webkitͷ࣌ํ͕ແ͍ʹͯ͠ɺAndroidXಉ͡Ͱ͔͢ʣ WebkitͱWebKitͷҧ͍ AndroidͷWebkitͱɺAndroidҎ֎ͷWebKitҧ͍·͢
HTMLϨϯμϦϯάΤϯδϯͷྗਤ 8FC,JU #MJOL (FDLP 4BGBSJ $ISPNF 'JSFGPY 14ϒϥβ .JDSPTPGU&EHF 0QFSB
ϚΠφʔͳϒϥβͳΒʜ
• WebView ϨϯμϦϯάΤϯδϯ ‣ Android ʙ4.3ɿWebKit ‣ Android 4.4ʙɿBlink •
WebViewͷόΠϯσΟϯάઌ ‣ Android ʙ4.4ɿAndroid OSΈࠐΈ ‣ Android ʙ6.0ɿSystem WebViewಠཱʢapkͰಠཱ৴͞ΕɺPlayετΞͰߋ৽ʣ ‣ Android 7.0ʙɿChrome or System WebViewʢChrome༏ઌʣ ‣ Android 10ɿSystem WebView ✓ System WebViewͱChrome WebView͕ڞ௨Խ͞ΕɺTrichromeͱݺΕ͍ͯΔΒ͍͠ - ϥΠϒϥϦ໊ࣗମ·ͨલͷlibmonochrome.so - https://chromium.googlesource.com/chromium/src.git/+/master/docs/ android_native_libraries.md Androidʹ͓͚ΔWebkitͷྺ࢙
AndroidX WebkitΞʔΩςΫνϟ BOESPJEYXFCLJU 6TFS"QQMJDBUJPO $ISPNJVN "OESPJE8FC7JFX'SBNFXPSL $ISPNF'SBNFXPSL #MJOLMJCSBSZ TP
+/* /BUJWF8FC$PSF 4LJB %HSBQIJDTϥΠϒϥϦ /BUJWF+BWB4DSJQU$PSF /BUJWF#MJOL*OUFSGBDF "1* ڊେͳ ϥΠϒϥϦ "OESPJEҎ߱ ೖΓޱ͕ดʁ )8 (16
• ҎԼandroid.webkitʹͳ͍ɺ৽͍͠ػೳͰ͢ ‣ WebViewFeature ‣ ProxyController ‣ WebViewAssetLoader ‣ Dark
Mode Controlʢ࣍ͷόʔδϣϯͰରԠ༧ఆʣ AndroidX Webkit৽ػೳ
Build.gradle dependencies { implementation “androidx.webkit:webkit:1.1.0” } ͍࢝ΊΔʹ·ͣҎԼΛՃ͠·͠ΐ͏
WebViewFeature if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) { WebView.startSafeBrowsing(this.applicationContext) { value ->
Log.d(TAG, "WebView.startSafeBrowsing: $value") } } if (WebViewFeature.isFeatureSupported(WebViewFeature.START_SAFE_BROWSING)) { WebViewCompat.startSafeBrowsing(this.applicationContext) { value -> Log.d(TAG, "WebViewCompat.startSafeBrowsing: $value") } } όʔδϣϯίʔυ͔Βɺػೳαϙʔτ༗ແͰஅɻ͜Εخ͍͠
ProxyController if (WebViewFeature.isFeatureSupported(WebViewFeature.PROXY_OVERRIDE)) { // proxy1.com͕ࣦഊͨ͠Βɺ࣍proxy2.comͷΑ͏ʹ্͔Βॱ൪ʹࢼ͍ͯ͘͠ val proxyConfig = ProxyConfig.Builder()
.addProxyRule("proxy1.com") .addProxyRule("proxy2.com", ProxyConfig.MATCH_HTTP) .addProxyRule("proxy3.com", ProxyConfig.MATCH_HTTPS) .addBypassRule("www.google.*") // ϓϩΩγઃఆআ֎ͷϗετ .build() // Executor val executor = Executor { Log.d(TAG, "${Thread.currentThread().name} : executor") } // ϓϩΩγઃఆมߋ͕ड͞Εͨ࣌ʹݺΕΔʁݺΕͳ͍Α͏ͳ… val listener = Runnable { Log.d(TAG, "${Thread.currentThread().name} : listener") } // WebViewͷϓϩΩγઃఆΛγεςϜઃఆ͔Β্ॻ͖ ProxyController.getInstance().setProxyOverride(proxyConfig, executor, listener) // γεςϜͷઃఆʹ͢ ProxyController.getInstance().clearProxyOverride(executor, listener) } ϓϩΩγઃఆ͕؆୯ʹઃఆग़དྷΔΑ͏ʹʂʢө֘ΞϓϦͷWebVievͷΈʣ ࠓ·Ͱ8FC7JFXͷϓϩΩγઃఆͷඪ४తͳํ ๏ແ͔ͬͨͰ͢ΑͶʁʢग़དྷΔํ๏͋Γˣʣ IUUQTTUBDLPWFSqPXDPNRVFTUJPOT XFCWJFXBOESPJEQSPYZ
WebViewAssetLoader val assetLoader = WebViewAssetLoader.Builder() .addPathHandler("/assets/", AssetsPathHandler(this)) // main/assetsσΟϨΫτϦͷొ .addPathHandler("/res/",
ResourcesPathHandler(this)) // main/resσΟϨΫτϦͷొ .build() webView.webViewClient = object : WebViewClient() { // ϦΫΤετURLΛϑοΫͯ͠ϩʔΧϧͷϑΝΠϧΛදࣔɻWebVieͰಡΈࠐΜͩશϦΫΤετͷURLඞͣ͜͜Λ௨Δ override fun shouldInterceptRequest( view: WebView, request: WebResourceRequest ): WebResourceResponse? { return assetLoader.shouldInterceptRequest(request.url) } } // ΞϓϦͷσϑΥϧτυϝΠϯ"appassets.androidplatform.net" // main/assets/www/index.htmlΛϩʔυ webView.loadUrl("https://appassets.androidplatform.net/assets/www/index.html") ϩʔΧϧHTMLϑΝΠϧͷϩʔυํ๏͜Ε·Ͱͱେͯ͠มΘΒͳ͍
Dark Mode Control for WebView if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) { //WebSettingsCompat.setForceDark(webView.settings, WebSettingsCompat.FORCE_DARK_AUTO)
//WebSettingsCompat.setForceDark(webView.settings, WebSettingsCompat.FORCE_DARK_OFF) WebSettingsCompat.setForceDark(webView.settings, WebSettingsCompat.FORCE_DARK_ON) } ͏͙͢ϦϦʔε͞ΕΔ࣍ظόʔδϣϯͷ1.2.0ͰWebViewͷμʔΫϞʔυ͕Մೳग़དྷΔΒ͍͠ʂ ύϥϝʔλ આ໌ '03$&@%"3,@"650 γεςϜઃఆʹै͏ '03$&@%"3,@0'' ڧ੍0'' '03$&@%"3,@0/ ڧ੍0/
• ϩʔΧϧίϯςϯπʢʴϦϯΫઌͷݻఆαΠτఔʣͷදࣔ ‣ WebViewΛͬͨํָ͕ • ϒϥβͱͯ͠ෆಛఆଟͷαΠτΛදࣔ ‣ Chrome Custom TabsΛར༻ͨ͠ํ͕҆શͰָ
‣ ϒϥβ૬ͷڍಈΛ͢Δʹ͔ͳΓ࡞ΓࠐΈ͕ඞཁͳͣ ‣ ηΩϡϦςΟ؍ͰɺWebViewΛ͏ͷ͋·Γྑ͘ͳ͍ WebView or Chrome Custom Tabs ?
࠷ޙʹ • AndroidX Webkitߋ৽ස͕ߴ͘ɺൃల్্ ‣ android.webkitʹ͔͠ͳ͍ػೳ͋ΔͨΊɺ྆ํ͏͜ͱʹ ‣ ͦͯ͠ใগͳ͍ ✓ ࠓճͷ༰ޙ΄ͲQiitaʹιʔείʔυ
ؚΊͯ·ͱΊ༧ఆͰ͢ • Chrome (Blink) ͷϨϯμϦϯάपΓʹ͍ͭͯɺͲ͔͜ͷษڧձͰLT͠ ͍ͨͳͱࢥ͍ͬͯ·͢