Android性能優化篇之網絡優化

image

引言

1. Android性能優化篇之內存優化--內存泄漏

2.Android性能優化篇之內存優化--內存優化分析工具

3.Android性能優化篇之UI渲染性能優化

4.Android性能優化篇之計算性能優化

5.Android性能優化篇之電量優化(1)——電量消耗分析

6.Android性能優化篇之電量優化(2)

7.Android性能優化篇之網絡優化

8.Android性能優化篇之Bitmap優化

9.Android性能優化篇之圖片壓縮優化

10.Android性能優化篇之多線程并發優化

11.Android性能優化篇之數據傳輸效率優化

12.Android性能優化篇之程序啟動時間性能優化

13.Android性能優化篇之安裝包性能優化

14.Android性能優化篇之服務優化

介紹

現在電腦,手機是我們生活中不可或缺的一部分,我們可以隨時上網,了解世界各地發生了什么事?包括政治,環境,生活,風景,趣聞等等,同時也可以觀看最新的電影,圖片,小說,接觸到最先進的技術文檔等等。網絡讓我們生活豐富多彩。我們今天就來一起探討android的網絡優化。

一.為什么要對網絡進行優化?

1.流量,雖然現在的wifi已經很普及,但還是有需要使用2G/3G/4G的的情況,那么流量是我們必須考慮的一部分(流量不便宜呀)
2.電量(重點),電量是我們需要認真考慮的一方面,手機的續航能力是現在用戶關注的一個點,如果手機電量消耗過快,用戶可能會卸載那些消耗電量過大的應用。
3.響應時間(重點),用戶的體驗是我們應用第一個目標,只有給用戶好的體驗,才能防止用戶的流失。
4.安全(重點),網絡數據傳輸的安全,是我們必須面對的一個問題,保護用戶信息和數據的安全是我們的職責。

二.網絡分析工具

1. Network Monitor 介紹

Network Monitor 是Android Studio內置的網絡監控工具。


image4.png

Rx --- Recive 表示下行流量
Tx --- Transmit 表示上行流量

2. 代理工具

1.截獲網絡請求響應包, 分析網絡請求
2.設置代理網絡
我用的是windows所以 一直使用的是 Fiddler工具

3. 模擬弱網

使用Fiddler工具來模擬:查看

三.網絡優化方案

我們從任務的集中處理,傳輸數據優化,安全幾個方面來講解,最后在給出弱網情況下的一些建議

1.任務集中處理,節省流量,降低電量消耗

這段內容在電量優化中已經講過,這里不再重復太多,就對JobScheduler的使用在擴展下:

    JobInfo mJobInfo = new JobInfo.Builder(mJobID, new ComponentName(this, JobWakeUpService.class))
            .setPeriodic(mIntervalMillis)//執行周期
            .setMinimumLatency(mMinLatencyMillis)//最小延時
            .setOverrideDeadline(mMaxExecutionDelayMillis)//最大執行時間
            .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)//網絡類型 NETWORK_TYPE_UNMETERED(wifi 藍牙)
            .setRequiresCharging(true) //充電時執行
            //設置重試/退避策略 (重試時間,重試時間間隔)
            .setBackoffCriteria(mInitialBackoffMillis, JobInfo.BACKOFF_POLICY_LINEAR)
            .setPersisted(isPersisted)//設備重啟,任務是否保留
            .setRequiresDeviceIdle(isDeviceIdle)//設備空閑時
            //監聽url對應數據變化,觸發當前任務執行
            .addTriggerContentUri(mUrl)
            //數據變化------->任務執行 最大延遲
             .setTriggerContentMaxDelay(mDelay)
            //更新 延遲
           .setTriggerContentUpdateDelay(mUpdateDelay)
            .build();
2.傳輸數據優化,節省流量,響應更快
(1).gzip壓縮

gzip 壓縮 還是很常見的,在主流的網絡訪問框架中都有對應的api讓你調用,我們以OKHttp為例:
gzip壓縮攔截器:

        static class GzipRequestInterceptor implements Interceptor {
            @Override
            public Response intercept(Chain chain) throws IOException {
                okhttp3.Request originalRequest = chain.request();
                if (originalRequest.body() == null || originalRequest.header("Content-Encoding") != null) {
                    return chain.proceed(originalRequest);
                }

                okhttp3.Request compressedRequest = originalRequest.newBuilder()
                        .header("Content-Encoding", "gzip")
                        .method(originalRequest.method(), gzip(originalRequest.body()))
                        .build();
                return chain.proceed(compressedRequest);
            }

            private RequestBody gzip(final okhttp3.RequestBody body) {
                return new RequestBody() {
                    @Override
                    public MediaType contentType() {
                        return body.contentType();
                    }

                    @Override
                    public long contentLength() {
                        return -1; // 無法知道壓縮后的數據大小
                    }

                    @Override
                    public void writeTo(BufferedSink sink) throws IOException {
                        BufferedSink gzipSink = Okio.buffer(new GzipSink(sink));
                        body.writeTo(gzipSink);
                        gzipSink.close();
                    }
                };
            }
        }

使用

        OkHttpClient okHttpClient = new OkHttpClient.Builder() 
        .addInterceptor(new GzipRequestInterceptor())//開啟Gzip壓縮
        ...
        .build();
(2).代替JSON

使用Protocal Buffers,Nano-Proto-Buffers,FlatBuffer來減小序列化的數據的大小
Protocal Buffers,Nano-Proto-Buffers,FlatBuffers等相關知識可以在關于數據傳輸優化一章閱讀,這里不再展開。

(3).緩存

三級緩存還是很常用的,disk cache,mem cache,http cache,下面我們來分別聊一聊:

1.http cache
http協議自帶的緩存策略,當資源沒有修改時,http status 為304,可以看下下面的圖:
image1.png

ETag 請求變量的實體標簽的當前值
Last-Modified 請求資源的最后修改時間
If-Modified-Since 如果請求的部分在指定時間之后被修改則請求成功,未被修改則返回304代碼
If-None-Match 如果內容未改變返回304代碼,參數為服務器先前發送的Etag,與服務器回應的Etag比較判斷是否改變
下面我們來看下Volley關于httpcache的使用:

    /**
 * 添加頭---用于http緩存使用
 * @param headers
 * @param entry
 */
private void addCacheHeaders(Map<String, String> headers, Cache.Entry entry) {
    // If there's no cache entry, we're done.
    if (entry == null) {
        return;
    }

    if (entry.etag != null) {
        headers.put("If-None-Match", entry.etag);
    }

    if (entry.lastModified > 0) {
        Date refTime = new Date(entry.lastModified);
        headers.put("If-Modified-Since", DateUtils.formatDate(refTime));
    }
}
2.mem cache

對于請求的是字符串或者json等文本的格式,是不需要內存緩存的。只有請求的是圖片時才需要內存緩存對圖片進行管理。對圖片的管理使用LRU算法來進行管理,關于這方面的知識可以上網查看網上有好多。

3.disk cache

disk 緩存的實現大多數開源框架都是使用的jackwharton的杰作DiskLruCache,如果想要了解更多,可以上網進行查找。

(4).圖片壓縮

關于圖片壓縮就不再這里展開,后面會有單獨的一章來講解。

3.不同的網絡狀況,做不同的事

在WiFi,4G,3G等不同的網絡下設計不同大小的預取數據量,也可以是按照圖片數量或者操作時間來作為閥值,我們還需要把當前的網絡環境情況添加到設計預取數據量的策略當中去。判斷當前設備的狀態與網絡情況,可以使用JobScheduler.
我們可以把網絡請求延遲劃分為三檔:例如把網絡延遲小于60ms的劃分為GOOD,大于220ms的劃分為BAD,介于兩者之間的劃分為OK(這里的60ms,220ms會需要根據不同的場景提前進行預算推測)。如果網絡延遲屬于GOOD的范疇,我們就可以做更多比較激進的預取數據的操作,如果網絡延遲屬于BAD的范疇,我們就應該考慮把當下的網絡請求操作Hold住等待網絡狀況恢復到GOOD的狀態再進行處理。


image2.png
image3.png

提示:使用AT&T提供的AT&T Network Attenuator來幫助預估網絡延遲

4.安全,保護用戶信息
主要針對兩個問題:

1.保證API的調用者是經過自己授權的App
2.保證數據傳輸的安全。
第一個問題:我主要采用設計簽名的方式。對每個客戶端,Android、iOS、WeChat,分別分配一個AppKey和AppSecret。需要調用API時,將AppKey加入請求參數列表,并將AppSecret和所有參數一起,根據某種簽名算法生成一個簽名字符串,然后調用API時把該簽名字符串也一起帶上。服務端收到請求之后,根據請求中的AppKey查詢相應的AppSecret,按照同樣的簽名算法,也生成一個簽名字符串,當服務端生成的簽名和請求帶過來的簽名一致的時候,那就表示這個請求的調用者是經過自己授權的,證明這個請求是安全的。而且,每個端都有一個Key,也方便不同端的標識和統計。為了防止AppSecret被別人獲取,這個AppSecret一般寫死在代碼里面。另外,簽名算法也需要有一定的復雜度,不能輕易被別人破解,最好是采用自己規定的一套簽名算法,而不是采用外部公開的簽名算法。另外,在參數列表中再加入一個時間戳,還可以防止部分重放攻擊。
第二個問題:主要就是采用HTTPS了。HTTPS因為添加了SSL安全協議,自動對請求數據進行了壓縮加密,在一定程序可以防止監聽、防止劫持、防止重發,主要就是防止中間人攻擊。蘋果從iOS9開始,默認就采用HTTPS了。而關于在Android中如何使用HTTPS,Google官方也給出了很多安全建議。不過,大部分App并沒有按照安全建議去實現,主要就是沒有對SSL證書進行安全性檢查,這就成為了一個很大的漏洞,中間人利用此漏洞用假證書就可以通過檢查,從而可以劫持到所有數據了。因此,為了安全考慮,建議對SSL證書進行強校驗,包括簽名CA是否合法、域名是否匹配、是不是自簽名證書、證書是否過期等。

5.弱網情況下我們應該做些什么?

(1).壓縮/減少數據傳輸量
(2).利用緩存減少網絡傳輸
(3).針對弱網(移動網絡), 不自動加載圖片
(4).界面先反饋, 請求延遲提交

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,431評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,637評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,555評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,900評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,629評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,976評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,976評論 3 448
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,139評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,686評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,411評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,641評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,129評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,820評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,233評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,567評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,362評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,604評論 2 380

推薦閱讀更多精彩內容