App研發錄讀後總結(二)

App開發中高級技巧css

2.1  crash 異常收集與統計,做者在書中介紹瞭如何收集crash 到數據庫,如何對大量crash信息進行去重,如何生成crash報表,如何將crash 自動分配給開發人員提供一整套解決方案。java

2.2 做者花了大量時間,列舉出100多個crash實例,且分析出出現緣由,並給出解決方案,並且這些crash也可能是項目中可能出現的,有了這些crash信息庫,能夠幫助咱們快速定位處理crash,咱們在項目中就可能遇到過android

好比除數爲0,textView.settext(count) count爲int型(會報找不到資源id)、is your activity running(dialog,popwindow show時,activity未啓動完或actiivty已關閉)、rmeabi 和armeabi-v7a中so包數量不一致,會致使UnsatisfiedLinkError、不要相信api 返回數據,必須作非空判斷,類型異常等容錯處理、遍歷集合時不能刪除集合中數據,不然發生崩潰、多個線程同時操做同一集合數據也可能會發生崩潰、網絡請求時,實體類被混淆、系統碎片化,高版本api在低版本崩潰、SQLite 支持單線程、多線程、串行三種模式,可是多線程中使用單個數據庫鏈接不是安全的,當一個線程寫數據,一個在刪數據會拋I/O 異常,當一個操做完關閉數據庫,另一個還在操做也會致使Crash等,做者將100多個carsh分爲如下幾類:ios

1 java語法相關的異常web

2 acitivty相關的異常sql

3 序列化相關的異常數據庫

4 列表相關的異常api

5 窗體相關的異常緩存

6 資源相關的異常安全

7 系統碎片化的異常

8 sql相關異常

9 其餘異常

限於篇幅問題,就不一一列舉了,有興趣的朋友能夠去詳細閱讀下,對快速處理crash是有很大幫助的。

2.3  混淆

      有時咱們會遇到直接AS 運行項目,沒問題,但打release包時某些功能模塊就有bug, 花上大半天也不知問題所在,這種狀況下就要考慮下是否是混淆所致了。

針對app 量身定製一套混淆規則:

     1 保留實體類和成員不被混淆,做者是建議將keep 實體類所在的包下全部類,本人以前在項目中也用過另一種方式

  定義一個接口類:

public interface NonProguard {
}

不想被混淆的類 實現這個接口

public class ErrorResponeBean implements NonProguard{
    private String errorCode;
    private String errorMessage;

    public String getErrorCode() {
        return errorCode;
    }

    public void setErrorCode(String errorCode) {
        this.errorCode = errorCode;
    }

    public String getErrorMessage() {
        return errorMessage;
    }

    public void setErrorMessage(String errorMessage) {
        this.errorMessage = errorMessage;
    }
}

 

在混淆文件中添加:

-keep interface com.example.NonProguard

    2 內部類不被混淆

-keep class tv.danmaku.ijk.media.player$* {*;}

$符用來分割內部類與其母體的標誌

   3 對webview的處理

-keepclassmembers class * extends android.webkit.webViewClient {

    public void *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap);

    public boolean *(android.webkit.WebView, java.lang.String)

}

-keepclassmembers class * extends android.webkit.webViewClient {

    public void *(android.webkit.webView, java.lang.String)

}

4 對javaScript的處理

  app供h5調用的原生方法不能被混淆

-keepclassmembers class com.example.youngheart.MainActivity$JSInterface1 {

    <methods>;

}

 

5 保留自定義控件(繼承自View)不被混淆

-keep public class * extends android.view.View {

    *** get*();

    void set*(***);

    public <init>(android.content.Context);

    public <init>(android.content.Context, android.util.AttributeSet);

    public <init>(android.content.Context, android.util.AttributeSet, int);

}

 

6 第三方jar包 

  有些第三方sdk已是混淆了,因此要在混淆規則 keep ,不過通常第三方都會提供混淆規則,直接複製到本身的項目中的混淆規則文件中便可。

 

2.4 競品分析

 對於競品,從技術上講,有如下幾個點是重點研究方向:

爲何他們的App體積比咱們小?

爲何他們App訪問速度比咱們快?

爲何他們App基本上不咋崩潰?

經過競品分析,做者提供一些優化方案,

1 知己知彼,百戰不殆。經過分析競品app安裝包結構,瞭解競品可能用到的技術點,獲取競品app資源,如動畫,xml等, 但直接解壓的xml 文件,咱們看到的是亂碼,做者提供了一款神器AXMLPrinter2.jar,執行

 java -jar AXMLPrinter2 AndroidManifest.xml

此外咱們還能夠經過app 反編譯工具如apktool 對dex 包進行反編譯,查看dex包中的源碼

apktool使用 可參考:http://blog.csdn.net/vipzjyno1/article/details/21039349/

2 提高Splash 廣告速度,書中提到的方法和目前咱們項目中用到的差很少,首次異步調接口api,獲取廣告信息及緩存廣告圖片到本地,下次啓動直接展現已緩存的圖片,同時異步調用接口檢查有無新廣告,有則緩存,此時要針對 用戶網絡狀況 如是wifi,仍是使用流量採起不一樣的策略。

3 H5頁面提速:

     將經常使用的h5頁面、css ,js打成zip包,app每次啓動,啓用一個線程,異步將zip包解壓到本地,每次從本本地讀取H5頁面,就不用每次從服務器獲取。爲了保證H5頁面是最新的,咱們須要對zip包進行版本化管理,每次加載H5頁面都向服務器詢問當前版本號,如過時從新下載zip包,同時爲避免app自帶zip版本過舊,致使新用戶下載的包比較大,每次發版前都要將最近的zip包內嵌到app內。

     製做增量zip包,爲了提高zip包下載速度及節省流量,引入增量更新概念,每次只將新增及修改的文件放入zip包,同時控制圖片資源數量,即便是增量更新也要控制增量包的大小在100K內。

4 png/jpg使用:png是無損的,jpg是有損的,一樣尺度的圖片,png會大些,但手機恰恰對png情有獨鍾,會對其進行硬加速,雖然png體積大些,但加載速度快。因此APP內的圖片優先使用png格式。但尺度大的圖片,如splash圖、引導圖、大的背景圖及須要網絡下載的圖片,爲了減少App體積,能夠考慮採用jpg.

google提供了一種新的圖片格式 webP,壓縮率比jpg更好,android是支持的,ios如個使用須要引入WebP解碼器。

5 自動選取最佳服務器策略:項目可能有多臺服務器,分別接入電信、移動或者聯通專線,能夠考慮讓app嘗試從哪一個服務器鏈接速度快些,同時要處理好服務器的負載平衡。

6 熱修復, 熱修復能夠解決一下緊急bug,而不須要發版本,但目前ios禁止了熱修復使用。

 android 熱修復技術可參考:http://blog.csdn.net/yangxi_pekin/article/details/54929809

相關文章
相關標籤/搜索