Download - Zacepin
![Page 1: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/1.jpg)
Александр Зацепин
р а з р а б о т ч и к , М о б и л ь н а я п о ч т а / П о ч т а
a l e x a n d e r . z a t s e p i n @ m a i l . r u
![Page 2: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/2.jpg)
Работа с сетью в Android
![Page 3: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/3.jpg)
0
100 000
200 000
300 000
400 000
500 000
600 000
700 000
800 000
2009 2010 2011 2012
Приложения
![Page 4: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/4.jpg)
Более 800000 приложений
![Page 5: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/5.jpg)
Server
![Page 6: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/6.jpg)
![Page 7: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/7.jpg)
![Page 8: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/8.jpg)
![Page 9: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/9.jpg)
![Page 10: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/10.jpg)
Сокеты
Client
Socket
Server
Server
Socket
![Page 11: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/11.jpg)
Частые опросы (Polling)
Server
![Page 12: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/12.jpg)
Длинные опросы (Long-Polling)
Server
![Page 13: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/13.jpg)
Пуш-нотификации
GCM
Server
Long-polling
App
subscribes
regId
System
![Page 14: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/14.jpg)
1. Сокеты
2. Длинные опросы (Long-polling)
3. Пуш-нотификации (Google Cloud Messaging(GCM))
4. Частые опросы сервера (Polling)
Виды возможных сетевых взаимодействий в Андроид
![Page 15: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/15.jpg)
1. Сокеты
2. Длинные опросы (Long-polling)
3. Пуш-нотификации (Google Cloud Messaging(GCM))
4. Частые опросы сервера (Polling)
Виды возможных сетевых взаимодействий в Андроид
![Page 16: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/16.jpg)
1. Сокеты
2. Длинные опросы (Long-polling)
3. Пуш-нотификации (Google Cloud Messaging(GCM))
4. Частые опросы сервера (Polling)
Виды возможных сетевых взаимодействий в Андроид
![Page 17: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/17.jpg)
HttpUrlConnection Server
![Page 18: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/18.jpg)
HttpUrlConnection Server
HttpContext
HttpClient
HttpRequest
HttpResponse
HttpEntity
HttpEntity
Server
![Page 19: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/19.jpg)
HttpUrlConnection connection = null; try { URL url = new URL("http://example.com"); connection = (HttpUrlConnection) url.openConnection();
![Page 20: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/20.jpg)
HttpUrlConnection connection = null; try { URL url = new URL("http://example.com"); connection = (HttpUrlConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setRequestProperty("Accept", "text/plain");
![Page 21: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/21.jpg)
HttpUrlConnection connection = null; try { URL url = new URL("http://example.com"); connection = (HttpUrlConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setRequestProperty("Accept", "text/plain"); connection.connect();
![Page 22: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/22.jpg)
HttpUrlConnection connection = null; try { URL url = new URL("http://example.com"); connection = (HttpUrlConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setRequestProperty("Accept", "text/plain"); connection.connect(); int statusCode = connection.getResponseCode(); ...
![Page 23: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/23.jpg)
HttpUrlConnection connection = null; try { URL url = new URL("http://example.com"); connection = (HttpUrlConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setRequestProperty("Accept", "text/plain"); connection.connect(); int statusCode = connection.getResponseCode(); ... readTextFromServer(); } catch (Exception e) { e.printStackTrace(); } finally { if (connection != null) { connection.disconnect(); } }
![Page 24: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/24.jpg)
try { HttpGet request = new HttpGet("http://example.com");
![Page 25: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/25.jpg)
try { HttpGet request = new HttpGet("http://example.com"); request.setHeader("Accept", "text/plain");
![Page 26: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/26.jpg)
try { HttpGet request = new HttpGet("http://example.com"); request.setHeader("Accept", "text/plain"); HttpResponse response = getHttpClient().execute(request);
![Page 27: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/27.jpg)
try { HttpGet request = new HttpGet("http://example.com"); request.setHeader("Accept", "text/plain"); HttpResponse response = getHttpClient().execute(request); int statusCode = response.getStatusLine().getStatusCode(); ...
![Page 28: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/28.jpg)
try { HttpGet request = new HttpGet("http://example.com"); request.setHeader("Accept", "text/plain"); HttpResponse response = getHttpClient().execute(request); int statusCode = response.getStatusLine().getStatusCode(); ... return EntityUtils.toString(response.getEntity()); } catch (Exception e) { e.printStackTrace(); }
![Page 29: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/29.jpg)
HttpUrlConnection Server
HttpContext
HttpClient
HttpRequest
HttpResponse
HttpEntity
HttpEntity
Server
![Page 30: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/30.jpg)
Server
HttpUrlConnection
HttpUrlConnection
HttpUrlConnection
…
App
![Page 31: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/31.jpg)
Server
Server
HttpUrlConnection
HttpUrlConnection
HttpUrlConnection
…
App
HttpContext
HttpClient
HttpRequest
HttpResponse
HttpEntity
HttpEntity
App
![Page 32: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/32.jpg)
Потокобезопасность
Thread N
1 2
HttpUrlConnection
![Page 33: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/33.jpg)
Потокобезопасность
Thread N
1 2
HttpUrlConnection
![Page 34: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/34.jpg)
Thread N
1 2
HttpClient
Потокобезопасность
![Page 35: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/35.jpg)
Thread N
1 2
HttpClient
ThreadSafeClientConnManager
. . .
connection 1
connection N
connection 2
1
2
Потокобезопасность
![Page 36: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/36.jpg)
Потокобезопасность static { ... HttpParams params = new BasicHttpParams(); ConnManagerParams.setMaxTotalConnections(params, 10);
![Page 37: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/37.jpg)
Потокобезопасность static { ... HttpParams params = new BasicHttpParams(); ConnManagerParams.setMaxTotalConnections(params, 10); ConnManagerParams.setMaxConnectionsPerRoute(params, new ConnPerRoute() { @Override public int getMaxForRoute(HttpRoute route) { return 5; } });
![Page 38: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/38.jpg)
Потокобезопасность static { ... HttpParams params = new BasicHttpParams(); ConnManagerParams.setMaxTotalConnections(params, 10); ConnManagerParams.setMaxConnectionsPerRoute(params, new ConnPerRoute() { @Override public int getMaxForRoute(HttpRoute route) { return 5; } }); ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager(params, schemeRegistry); }
![Page 39: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/39.jpg)
Потокобезопасность static { ... HttpParams params = new BasicHttpParams(); ConnManagerParams.setMaxTotalConnections(params, 10); ConnManagerParams.setMaxConnectionsPerRoute(params, new ConnPerRoute() { @Override public int getMaxForRoute(HttpRoute route) { return 5; } }); ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager(params, schemeRegistry); httpClient = new DefaultHttpClient(cm, params); }
![Page 40: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/40.jpg)
Server
Application
request request ... request request
![Page 41: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/41.jpg)
Server
Application
request request ... request request
TCP TCP TCP TCP
![Page 42: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/42.jpg)
Server
Application
request request ... request request
TCP TCP TCP TCP + + …+… = traffic
![Page 43: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/43.jpg)
Keep-alive cоединение
![Page 44: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/44.jpg)
Keep-alive cоединение
Server
Application
request request ... request request
TCP
![Page 45: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/45.jpg)
Keep-alive cоединение
Server
Application
request request ... request request
TCP
+ …+… + = traffic
![Page 46: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/46.jpg)
Номер запроса
Время(ms) KeepAlive = false
1 2098
2 2157
3 2037
4 2096
5 1944
6 2055
7 1865
8 2119
9 1986
10 1965
≈2032,2
![Page 47: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/47.jpg)
Номер запроса
Время(ms) KeepAlive = false
Время(ms) KeepAlive = true
1 2098 2023
2 2157 1604
3 2037 1698
4 2096 1774
5 1944 1173
6 2055 1573
7 1865 1683
8 2119 1670
9 1986 1666
10 1965 1541
≈2032,2 ≈1700,5
![Page 48: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/48.jpg)
Номер запроса
Время(ms) KeepAlive = false
Время(ms) KeepAlive = true
1 2098 2023
2 2157 1604
3 2037 1698
4 2096 1774
5 1944 1173
6 2055 1573
7 1865 1683
8 2119 1670
9 1986 1666
10 1965 1541
≈2032,2 ≈1700,5
На 16,2% быстрее!
![Page 49: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/49.jpg)
Keep Alive Duration
![Page 50: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/50.jpg)
Keep Alive Duration
𝐭
𝐭 − 𝐭𝐢𝐦𝐞
App
![Page 51: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/51.jpg)
Keep Alive Duration
𝐭
𝐭 − 𝐭𝐢𝐦𝐞
request1
App
![Page 52: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/52.jpg)
Keep Alive Duration
𝐭
𝐭 − 𝐭𝐢𝐦𝐞
request1
TCP
Server App
![Page 53: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/53.jpg)
Keep Alive Duration
𝐭
𝐭 − 𝐭𝐢𝐦𝐞
request1
request2 TCP
Server App
![Page 54: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/54.jpg)
Keep Alive Duration
𝐭
𝐭 − 𝐭𝐢𝐦𝐞
request1
request2
request3
TCP
Server App
![Page 55: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/55.jpg)
Keep Alive Duration
𝐭
𝐭 − 𝐭𝐢𝐦𝐞
request1
request2
request3
request4
TCP
Server App
![Page 56: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/56.jpg)
Keep Alive Duration
𝐭𝟑 > 𝐝
𝐭
𝐭 − 𝐭𝐢𝐦𝐞
𝐝 − 𝐤𝐞𝐞𝐩 𝐚𝐥𝐢𝐯𝐞 𝐝𝐮𝐫𝐚𝐭𝐢𝐨𝐧
request1
request2
request3
request4
TCP
Server App
![Page 57: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/57.jpg)
Keep Alive Duration
𝐭𝟑 > 𝐝
𝐭
𝐭 − 𝐭𝐢𝐦𝐞
𝐝 − 𝐤𝐞𝐞𝐩 𝐚𝐥𝐢𝐯𝐞 𝐝𝐮𝐫𝐚𝐭𝐢𝐨𝐧
request1
request2
request3
request4
TCP
TCP
Server App
![Page 58: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/58.jpg)
Keep Alive Duration
httpClient.setKeepAliveStrategy( new ConnectionKeepAliveStrategy() { @Override public long getKeepAliveDuration(HttpResponse response, HttpContext context){ return KEEP_ALIVE_DURATION_MILLISECONDS; } });
![Page 59: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/59.jpg)
Keep Alive Duration
![Page 60: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/60.jpg)
Keep Alive Duration
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.FROYO){ System.setProperty("http.keepAlive", "false"); }
![Page 61: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/61.jpg)
Keep Alive Duration
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.FROYO){ System.setProperty("http.keepAlive", "false"); }
Hе поддается настройке!(≈5 секунд)
![Page 62: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/62.jpg)
try { ... InputStream is = connection.getInputStream(); // Вычитывайте все данные из InputStream’a is.close(); } catch (Exception e) { try { InputStream es = connection.getErrorStream(); // Вычитывайте все данные из InputStream’a es.close(); } catch (Exception ex) { ex.printStackTrace(); } }
![Page 63: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/63.jpg)
Гзипование траффика
![Page 64: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/64.jpg)
Гзипование траффика ... InputStream is = response.getEntity().getContent(); Header contentEncoding = response.getFirstHeader("Content-Encoding");
![Page 65: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/65.jpg)
Гзипование траффика ... InputStream is = response.getEntity().getContent(); Header contentEncoding = response.getFirstHeader("Content-Encoding"); if (contentEncoding != null && contentEncoding.getValue().equalsIgnoreCase("gzip"))
![Page 66: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/66.jpg)
Гзипование траффика ... InputStream is = response.getEntity().getContent(); Header contentEncoding = response.getFirstHeader("Content-Encoding"); if (contentEncoding != null && contentEncoding.getValue().equalsIgnoreCase("gzip")) { is = new GZIPInputStream(is); } ...
![Page 67: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/67.jpg)
Гзипование траффика
... InputStream is = connection.getInputStream(); String contentEncoding = connection.getContentEncoding(); if ("gzip".equalsIgnoreCase(contentEncoding)) { is = new GZIPInputStream(connection.getInputStream()); } ...
![Page 68: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/68.jpg)
Гзипование траффика
![Page 69: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/69.jpg)
Гзипование траффика
Не полагайтесь на Content-Length!
![Page 70: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/70.jpg)
Управление куками
![Page 71: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/71.jpg)
Управление куками
Set-Cookie: name=value; expires=date; path=/; domain=.example.com
![Page 72: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/72.jpg)
Управление куками
... CookieStore cs = getHttpClient().getCookieStore(); BasicClientCookie c = new BasicClientCookie("Mpop", cookie); c.setDomain(".mail.ru"); cs.addCookie(c); ...
![Page 73: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/73.jpg)
Управление куками
... String cookieHeader = session.getCookieHeader(); сonnection.setRequestProperty("Cookie", cookieHeader); ...
![Page 74: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/74.jpg)
Установка куки в WebView Application
![Page 75: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/75.jpg)
Установка куки в WebView Application Browser
WebView
WebView
![Page 76: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/76.jpg)
Установка куки в WebView Application Browser
WebView
WebView
CookieSyncManager.createInstance(context);
![Page 77: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/77.jpg)
Установка куки в WebView Application Browser
WebView
WebView
CookieSyncManager.createInstance(context); CookieManager.getInstance().setAcceptCookie(true);
![Page 78: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/78.jpg)
Установка куки в WebView Application Browser
WebView
WebView
CookieSyncManager.createInstance(context); CookieManager.getInstance().setAcceptCookie(true); CookieManager.getInstance().setCookie("mail.ru",cookie);
![Page 79: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/79.jpg)
Установка куки в WebView Application Browser
WebView
WebView
CookieSyncManager.createInstance(context); CookieManager.getInstance().setAcceptCookie(true); CookieManager.getInstance().setCookie("mail.ru",cookie); //for API level >= 15 CookieManager.getInstance().setCookie(".mail.ru",cookie);
![Page 80: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/80.jpg)
Установка куки в WebView Application Browser
WebView
WebView
CookieSyncManager.createInstance(context); CookieManager.getInstance().setAcceptCookie(true); CookieManager.getInstance().setCookie("mail.ru",cookie); //for API level >= 15 CookieManager.getInstance().setCookie(".mail.ru",cookie) CookieSyncManager.getInstance().sync();
![Page 81: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/81.jpg)
Установка куки в WebView Application Browser
WebView
WebView
cookie
cookie
CookieSyncManager.createInstance(context); CookieManager.getInstance().setAcceptCookie(true); CookieManager.getInstance().setCookie("mail.ru",cookie); //for API level >= 15 CookieManager.getInstance().setCookie(".mail.ru",cookie) CookieSyncManager.getInstance().sync();
![Page 82: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/82.jpg)
Установка куки в WebView Application Browser
WebView
WebView
cookie
cookie
CookieSyncManager.createInstance(context); CookieManager.getInstance().setAcceptCookie(true); CookieManager.getInstance().setCookie("mail.ru",cookie); //for API level >= 15 CookieManager.getInstance().setCookie(".mail.ru",cookie) CookieSyncManager.getInstance().sync();
![Page 83: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/83.jpg)
Защищенное соединение (https)
![Page 84: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/84.jpg)
Защищенное соединение (https)
CA
Application Server
![Page 85: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/85.jpg)
Защищенное соединение (https)
CA
Application Server
Signs certificate
![Page 86: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/86.jpg)
Защищенное соединение (https)
CA
Application Server
Signs certificate
request
![Page 87: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/87.jpg)
Защищенное соединение (https)
CA
Application Server
Signs certificate
Certificate
request
Private key
Public key
![Page 88: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/88.jpg)
Защищенное соединение (https)
CA
Application Server
Signs certificate
Certificate
request
Checks certificate
Private key
Public key
![Page 89: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/89.jpg)
Защищенное соединение (https)
CA
Application Server
Signs certificate
Certificate
request
Checks certificate
Random symmetric key
Private key
Public key
![Page 90: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/90.jpg)
Защищенное соединение (https)
CA
Application Server
Signs certificate
Certificate
request
Checks certificate
Random symmetric key
Data transferring
Private key
Public key
![Page 91: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/91.jpg)
1. KeyChain API на платформах >= 4.0
Варианты реализации https
![Page 92: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/92.jpg)
1. KeyChain API на платформах >= 4.0 2. На платформах < 4.0 надо создавать локальное хранилище ключей
Варианты реализации https
![Page 93: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/93.jpg)
1. KeyChain API на платформах >= 4.0 2. На платформах < 4.0 надо создавать локальное хранилище ключей
3. Доверять всем сертификатам
Варианты реализации https
![Page 94: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/94.jpg)
Https на платформа < 4.0 ... TrustManagerFactory tmf = TrustManagerFactory.getInstance(algorithm); KeyStore keyStore = KeyStore.getInstance("BKS"); InputStream in = context.getResources().openRawResource(mykeystore); keyStore.load(in, "mysecret".toCharArray()); in.close(); tmf.init(keyStore); SSLContext sslc = SSLContext.getInstance("TLS"); sslc.init(null, tmf.getTrustManagers(),new SecureRandom()); ...
![Page 95: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/95.jpg)
Https на платформа < 4.0
private SSLSocketFactory createSslSocketFactory() { SSLSocketFactory sf = null; try { KeyStore keyStore = KeyStore.getInstance("BKS"); InputStream in = context.getResources().openRawResource(mykeystore); keyStore.load(in, "mysecret".toCharArray()); in.close(); sf = new SSLSocketFactory(keyStore); sf.setHostnameVerifier(STRICT_HOSTNAME_VERIFIER); } catch (Exception e) { e.printStackTrace(); } return sf; }
![Page 96: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/96.jpg)
Доверять всем сертификатам
private class DummyHostnameVerifier implements HostnameVerifier{ @Override public boolean verify(String hostname, SSLSession session) { return true; } }
![Page 97: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/97.jpg)
Доверять всем сертификатам
private class DummyTrustManager implements X509TrustManager{ @Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { //empty } @Override public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { //empty } ... }
![Page 98: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/98.jpg)
Полезные инструменты
1. StrictMode 2. ConnectivityManager 3. DDMS Network Traffic Tool 4. Rest-client 5. Wireshark
![Page 99: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/99.jpg)
Полезные инструменты
1. StrictMode 2. ConnectivityManager 3. DDMS Network Traffic Tool 4. Rest-client 5. Wireshark
![Page 100: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/100.jpg)
Полезные инструменты
1. StrictMode 2. ConnectivityManager 3. DDMS Network Traffic Tool 4. Rest-client 5. Wireshark
![Page 101: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/101.jpg)
Полезные инструменты
1. StrictMode 2. ConnectivityManager 3. DDMS Network Traffic Tool 4. Rest-client 5. Wireshark
![Page 102: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/102.jpg)
Полезные инструменты
1. StrictMode 2. ConnectivityManager 3. DDMS Network Traffic Tool 4. Rest-client 5. Wireshark
![Page 103: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/103.jpg)
Полезные инструменты
1. StrictMode 2. ConnectivityManager 3. DDMS Network Traffic Tool 4. Rest-client 5. Wireshark
![Page 104: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/104.jpg)
Полезные ссылки
1. KeyChain API – http://goo.gl/ICijf 2. Создание локального хранилища ключей – http://goo.gl/5Surx 3. Keep Alive - http://goo.gl/9cdlz 4. Минимизация расхода батареи - http://goo.gl/DML0m 5. Выполнение сетевых операций - http://goo.gl/GIVIs
![Page 105: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/105.jpg)
![Page 106: Zacepin](https://reader031.vdocument.in/reader031/viewer/2022020217/5481d83cb079592e0c8b4602/html5/thumbnails/106.jpg)
Александр Зацепин
р а з р а б о т ч и к , М о б и л ь н а я п о ч т а / П о ч т а
a l e x a n d e r . z a t s e p i n @ m a i l . r u