高通平臺Performance機制學習總結

轉自:https://429564140.iteye.com/blog/2410445

Performance是很好的一個機制,可以提供系統程序運行的性能,不過在工控領域注意這樣大面積使用之後,系統高溫測試是否能夠通過的問題。其實原理是通過啓動CPU多於的核並且調度CPU頻率調整來實現資源快速加載的目的。

具體如下:

高通平臺Performance機制學習總結 
利用在高通平臺中的Performance機制,可以提高性能,比如應用的啓動速度,滑動流暢性等。接下來就看下高通給我們提供的Performance機制 
1.該機制的JNI層實現部分位於 

JAVA代碼:
./vendor/qcom/proprietary/android-perf/QPerformance/jni/com_qualcomm_qti_Performance.cpp  

上層實現位於 

JAVA代碼:
./vendor/qcom/proprietary/android-perf/QPerformance/src/com/qualcomm/qti/Performance.java  

2、framework層的使用需要通過反射機制調用com.qualcomm.qti.Performance 
具體實現在: 

JAVA代碼:
./frameworks/base/core/java/android/util/BoostFramework.java  

在BoostFramework的構造函數中通過反射調用Performance對象,而BoostFramework中的好多方法是被hide掉的,可能是爲了安全考慮吧,在應用層無法使用,只能在系統層使用。現在舉一個例子當應用啓動時創建進程的時候可以使用高通給我們提供的Performance機制。 
在ActivityManagerService中,構造中會判斷是否啓動該機制 

JAVA代碼:
mIsLaunchBoostv2_enabled = mContext.getResources().getBoolean(  
                   com.android.internal.R.bool.config_enableLaunchBoostv2);  
if(mIsLaunchBoostv2_enabled) {  
           lBoost_v2_TimeOut = mContext.getResources().getInteger(  
                   com.android.internal.R.integer.lboostv2_timeout_param);  
           lBoost_v2_ParamVal = mContext.getResources().getIntArray(  
                   com.android.internal.R.array.lboostv2_param_value);  
        }  

在startProcessLocked中進行判斷:

JAVA代碼:
// Start launch boost v2  
               if (mIsLaunchBoostv2_enabled == true && sPerfBoost_v2 == null) {  
                   sPerfBoost_v2 = new BoostFramework();  
               }  
               if (sPerfBoost_v2 != null) {  
                  sPerfBoost_v2.perfLockAcquire(lBoost_v2_TimeOut, lBoost_v2_ParamVal);  
                  sIsLaunchBoostv2_set = true;  
               }  

接下來看一下核心部分BoostFramework的實現 
構造函數中通過反射獲得Performance對象 

JAVA代碼:
public BoostFramework() {  
  
    if (mIsLoaded == false) {  
        try {  
            Class perfClass;  
            PathClassLoader perfClassLoader;  
  
     perfClassLoader = new PathClassLoader(PERFORMANCE_JAR,  
                              ClassLoader.getSystemClassLoader());  
            perfClass = perfClassLoader.loadClass(PERFORMANCE_CLASS);  
            mConstructor = perfClass.getConstructor();  
  
            Class[] argClasses = new Class[] {int.class, int[].class};  
            mAcquireFunc =  perfClass.getDeclaredMethod("perfLockAcquire", argClasses);  
            Log.v(TAG,"mAcquireFunc method = " + mAcquireFunc);  
  
            argClasses = new Class[] {};  
            mReleaseFunc =  perfClass.getDeclaredMethod("perfLockRelease", argClasses);  
            Log.v(TAG,"mReleaseFunc method = " + mReleaseFunc);  
  
            argClasses = new Class[] {MotionEvent.class, DisplayMetrics.class, int.class, int[].cla  

之前調用的方法perfLockAcquire的真是面目 

JAVA代碼:
/** @hide */  
    public int perfLockAcquire(int duration, int... list) {  
        int ret = -1;  
        try {  
            Object retVal = mAcquireFunc.invoke(mPerf, duration, list);  
            ret = (int)retVal;  
        } catch(Exception e) {  
            Log.e(TAG,"Exception " + e);  
        }  
        return ret;  
    }  

通過構造中的mAcquireFunc =  perfClass.getDeclaredMethod("perfLockAcquire", argClasses);看其調用的還是Performance中的perfLockAcquire方法。 
在Performance.java中會深入到JNI層: 

static {  
        try {  
            System.loadLibrary("qti_performance");  
        } catch (UnsatisfiedLinkError e) {  
        }  
    }  

/** &hide */  
    public int perfLockAcquire(int duration, int... list) {  
        int rc = REQUEST_SUCCEEDED;  
        handle = native_perf_lock_acq(handle, duration, list);  
        if (handle == 0)  
            rc = REQUEST_FAILED;  
        return rc;  
    }  

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章