第九章競品技術分析

西北野狼發表於2016-06-19

開機速度

  1. splash廣告邏輯,首次載入的圖片為應用放在res資料夾下面幾個資料夾裡面的圖片,同時會去呼叫介面獲取下一次開啟的時候要顯示的圖片url,並快取圖片;下次進入該介面顯示圖片並繼續訪問接下來一次的圖片,為了保證開啟速度,這個網路請求務必非同步處理。
  2. 引導圖,不要超過4頁。動畫可原生實現,可gif,可視訊來實現。
  3. 進入首頁之前進行地理位置的定位,保證進入首頁顯示的資料為當前城市的資訊。
  4. app首頁設計,儘可能多的將所有產品展示在首頁,會有廣告,搜尋欄,滾動條。

  上面為使用者可見的資料,一些不可見資料:

  1. umeng打點,統計啟用數。
  2. 註冊推送。
  3. 根據推送協議進行頁面跳轉。
  4. 初始化崩潰收集機制,比如崩潰資訊上傳等。

為了加快splash的載入速度建議客戶端這邊儘可能避免耗時間的任務操作

html5頁面開啟速度

  1. 將html5資料打包進zip包裡面去,每次從本地zip解壓檔案裡面載入html5資料;新增或者修改html5資訊怎麼辦,進行版本控制,如果版本一致,載入本地解壓資料,如果不是載入新的zip包的解壓資料;其中公共的,不變化的html5資料壓縮為公用的zip壓縮包並下發,那麼每次下載的時候只下載新增和修改的那部分html5檔案的壓縮包。在上個頁面設定不可顯示的webview載入html5資料,在下個webview載入的時候直接從本地快取檔案裡面去載入。

安裝包大小

  1. app安裝包一定要小,或者實現增量更新,減少對使用者流量的不必要耗費。 
  2. 圖片,音訊,視訊檔案應該在前期提供的時候就儘可能處理的體積足夠小。

       我的觀點:

  對於分享,推送,定位,地圖等第三方服務整合的時候,能用微信官方,新浪官方自己去實現就儘可能自己去實現,因為團隊裡面有人為了實現分享整合umeng分享功能,導致應用大小增加4M知道,其中包括很多無用的程式碼和資原始檔,請慎重。

png和jpg的使用場景

  1. 同背景圖片,png載入速度大於jpg,手機會對png進行硬體加速。
  2. 網路圖片採用jpg圖片比較合適。
  3. 廣告圖,引導圖採用jpg比較合適。

splash圖片,引導圖,背景圖

  1. splash圖片現在在300-500k之間。
  2. 引導圖可以將背景圖片和前景圖片分開,實現背景圖片或者前景圖片的可重用性。
  3. 背景圖限制在1M以內,並沒必要png格式,jpg格式就行了。

表情包的方案同上面html5頁面開啟速度的論述,都是通過zip來進行增量更新。

清理無用程式碼和資原始檔

  1. eclipse時代用undector可以實現無用程式碼的檢測,android studio暫時沒發現,無用資原始檔可以通過link來實現無用資原始檔,無用style等檢測,但是還是需要手動進行刪除。
  2. 通過使用proguard來配置混淆程式碼檔案來清理無用的程式碼,減少apk的大小。

效能優化

  1. 網路請求優化:針對2G,3G,4G,wifi環境伺服器端配置不同的伺服器,分別接入移動,聯通,電信的專線,並在客戶端進行配置,app登入獲取遍歷訪問2G,3G,4G,wifi的針對性域名並判斷出最佳的訪問素的的域名,並在一段時間內訪問該域名。為了避免搶佔同一伺服器的資源,可以在伺服器端設定針對的優先順序。
  2. 拋棄使用http+json,轉而使用tcp+protobuf。

 

頁面跳轉邏輯解耦

 我個人專案裡面是寫個路由類,所有的跳轉邏輯都寫在這個路由類裡面,作為所有activity介面跳轉中間控制層。

作者利用反射也提供了一個不錯的思路:

import android.app.Activity;
import android.content.Intent;

public abstract class BaseActivity extends Activity {

    public void navigateTo(final String activityName, 
            final Intent intent) {
        
        //在這個位置執行頁面打點的操作,這裡可以利用到activityName
        
        Class<?> clazz = null;
        try {
            clazz = Class.forName(activityName);
            if (clazz != null) {
                intent.setClass(this, clazz);
                this.startActivity(intent);
            }
        } catch (final ClassNotFoundException e) {
            return;
        }
    }
}

activity的常量類:

public class ActivityNameConstants {
    public final static String SecondActivity 
        = "com.example.navigator.SecondActivity";
}

demo:

import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;

public class MainActivity extends BaseActivity {

    Button btnNav1, btnNav2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btnNav1 = (Button) findViewById(R.id.btnNav1);
        btnNav1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this,
                        SecondActivity.class);
                startActivity(intent);
            }
        });

        btnNav2 = (Button) findViewById(R.id.btnNav2);
        btnNav2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.putExtra("name", "Jianqiang");
                navigateTo(ActivityNameConstants.SecondActivity, intent);
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

}

個人認為各有優缺點,還是看自己的偏好吧。

打點統計

頁面打點:放在跳轉邏輯程式碼前面;

事件打點:打點邏輯寫在基類控制元件裡面,比如寫onclick等觸發事件的基類,並在這些基類裡面寫事件打點的邏輯。

 多渠道打包

 我一般是上傳到360,百度等加固平臺驚醒加固打包,然後利用平臺的多渠道打包工具進行批量多渠道打包,書裡面講的是python程式來實現,你可以去github找找,這類程式碼很多。

class.dex的拆與合

主要還是處理65536的問題,2種方案:

  1. 外掛化:獨立模組做成單獨的apk,使用dexClassLoader來進行載入。
  2. dex分包:主要利用multidex來實現class.dex的拆分。

模組化拆分

android程式碼的模組化拆分:

  1. 將常用的工具類程式碼,封裝程式碼,第三方程式碼單獨封裝為基礎類庫。
  2. 指定資原始檔命名規範,並以模組名稱作為字首來進行命名。
  3. 模組間傳遞的資料以json或者單獨拉出來公用的bean作為一個庫引用。

版本策略:

一般情況下版本名稱為3位:比如6.0.0

第一位為大版本更新,第二位用於小版本迭代,第三位作為緊急發版。

 


相關文章