Skip to content
This repository has been archived by the owner on Jun 3, 2021. It is now read-only.

Commit

Permalink
[WEEX-578][Android] edit performance point (#1454)
Browse files Browse the repository at this point in the history
* [Android] loadbundle stage fix
* [Android] add createfinish stage
* [Android] commit bundleurl && bundletype && embedcount,fix embedtype
* [Android] monitor largeImg (>1080P)
* [Android] modify callnativemodule
* [Android] keep errormsg when empty
* [Android] update begin render time
* [Android] report bundleTemplate when error
  • Loading branch information
lucky-chen authored and YorkShen committed Aug 20, 2018
1 parent 0a84db9 commit 4115a38
Show file tree
Hide file tree
Showing 12 changed files with 88 additions and 30 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ public void run() {
ctx.getWindow().getDecorView().getWindowVisibleDisplayFrame(outRect);
mConfigMap.put("bundleUrl", mUri.toString());
String path = "file".equals(mUri.getScheme()) ? assembleFilePath(mUri) : mUri.toString();
mInstance.render(TAG, WXFileUtils.loadAsset(path, WXPageActivity.this),
mInstance.render(path, WXFileUtils.loadAsset(path, WXPageActivity.this),
mConfigMap, null,
WXRenderStrategy.APPEND_ASYNC);
}
Expand Down
7 changes: 6 additions & 1 deletion android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
Original file line number Diff line number Diff line change
Expand Up @@ -585,6 +585,11 @@ private void renderInternal(String pageName,
return;
}

//some case ,from render(template),but not render (url)
if (!mApmForInstance.hasInit()){
mApmForInstance.doInit();
}
mApmForInstance.setPageName(pageName);
mApmForInstance.onStage(WXInstanceApm.KEY_PAGE_STAGES_RENDER_ORGIGIN);

mWXPerformance.pageName = (TextUtils.isEmpty(pageName) ? "defaultBundleUrl":pageName);
Expand Down Expand Up @@ -650,7 +655,7 @@ private void renderByUrlInternal(String pageName,
renderOptions.put(BUNDLE_URL, url);
}

mApmForInstance.onStart();
mApmForInstance.doInit();

Uri uri = Uri.parse(url);
if (uri != null && TextUtils.equals(uri.getScheme(), "file")) {
Expand Down
20 changes: 12 additions & 8 deletions android/sdk/src/main/java/com/taobao/weex/bridge/WXBridge.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
import com.taobao.weex.performance.WXInstanceApm;
import com.taobao.weex.utils.WXExceptionUtils;
import com.taobao.weex.utils.WXLogUtils;
import com.taobao.weex.utils.WXUtils;
import com.taobao.weex.utils.WXWsonJSONSwitch;

import java.io.Serializable;
Expand Down Expand Up @@ -195,14 +196,6 @@ private int callNative(String instanceId, JSONArray tasks, String callback){
WXLogUtils.e(TAG, "callNative throw exception:" + e.getMessage());
}

if (null != instance){
instance.getApmForInstance().updateFSDiffStats(WXInstanceApm.KEY_PAGE_STATS_FS_CALL_NATIVE_NUM,1);
instance.getApmForInstance().updateFSDiffStats(
WXInstanceApm.KEY_PAGE_STATS_FS_CALL_NATIVE_TIME,
System.currentTimeMillis()-start
);
}

if (WXEnvironment.isApkDebugable()) {
if (errorCode == IWXBridge.DESTROY_INSTANCE) {
WXLogUtils.w("destroyInstance :" + instanceId + " JSF must stop callNative");
Expand Down Expand Up @@ -230,6 +223,7 @@ public void reportJSException(String instanceId, String func, String exception)
@Override
public Object callNativeModule(String instanceId, String module, String method, byte[] arguments, byte[] options) {
try {
long start = WXUtils.getFixUnixTime();
JSONArray argArray = null;
if (arguments != null)
argArray = (JSONArray) WXWsonJSONSwitch.parseWsonOrJSON(arguments);
Expand All @@ -253,7 +247,17 @@ public Object callNativeModule(String instanceId, String module, String method,
}

}

Object object = WXBridgeManager.getInstance().callNativeModule(instanceId, module, method, argArray, optionsObj);

WXSDKInstance instance = WXSDKManager.getInstance().getSDKInstance(instanceId);
if (null != instance){
instance.getApmForInstance().updateFSDiffStats(WXInstanceApm.KEY_PAGE_STATS_FS_CALL_NATIVE_NUM,1);
instance.getApmForInstance().updateFSDiffStats(
WXInstanceApm.KEY_PAGE_STATS_FS_CALL_NATIVE_TIME,
WXUtils.getFixUnixTime()-start
);
}
return WXWsonJSONSwitch.toWsonOrJsonWXJSObject(object);
}catch (Exception e){
WXLogUtils.e(TAG, e);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1211,8 +1211,6 @@ public void run() {
invokeCreateInstance(instance, template, options, data);
long end = System.currentTimeMillis();
instance.getWXPerformance().callCreateInstanceTime = end - start;
instance.getApmForInstance().onStage(WXInstanceApm.KEY_PAGE_STAGES_LOAD_BUNDLE_END);

instance.getWXPerformance().communicateTime = instance.getWXPerformance().callCreateInstanceTime;
}
}, instanceId);
Expand Down Expand Up @@ -1266,6 +1264,7 @@ private void invokeCreateInstance(@NonNull WXSDKInstance instance, String templa
} else {
options.put(BUNDLE_TYPE, "Others");
}
instance.getApmForInstance().addProperty(WXInstanceApm.KEY_PAGE_PROPERTIES_BUNDLE_TYPE, options.get(BUNDLE_TYPE));
}
if (options.get("env") == null) {
options.put("env", mInitParams);
Expand Down Expand Up @@ -1315,6 +1314,8 @@ private void invokeCreateInstance(@NonNull WXSDKInstance instance, String templa

instance.setTemplate(template);

instance.getApmForInstance().onStage(WXInstanceApm.KEY_PAGE_STAGES_LOAD_BUNDLE_END);

// if { "framework": "Vue" } or { "framework": "Rax" } will use invokeCreateInstanceContext
// others will use invokeExecJS
if (!isSandBoxContext) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import android.text.TextUtils;
import com.taobao.weex.WXEnvironment;
import com.taobao.weex.WXSDKInstance;
import com.taobao.weex.WXSDKManager;
Expand All @@ -36,6 +37,7 @@ public class WXInstanceApm {
public static final String KEY_PROPERTIES_ERROR_CODE = "wxErrorCode";
//public static final String KEY_PAGE_PROPERTIES_LAUNCH_ID = "wxLaunchId";
public static final String KEY_PAGE_PROPERTIES_BIZ_ID = "wxBizID";
public static final String KEY_PAGE_PROPERTIES_BUBDLE_URL = "wxBundleUrl";
public static final String KEY_PAGE_PROPERTIES_JSLIB_VERSION = "wxJSLibVersion";
public static final String KEY_PAGE_PROPERTIES_WEEX_VERSION = "wxSDKVersion";
public static final String KEY_PAGE_PROPERTIES_REQUEST_TYPE = "wxRequestType";
Expand All @@ -45,13 +47,15 @@ public class WXInstanceApm {
public static final String KEY_PAGE_PROPERTIES_CONTAINER_NAME = "wxContainerName";
public static final String KEY_PAGE_PROPERTIES_INSTANCE_TYPE = "wxInstanceType";
public static final String KEY_PAGE_PROPERTIES_PARENT_PAGE = "wxParentPage";
public static final String KEY_PAGE_PROPERTIES_BUNDLE_TYPE = "wxBundleType";

/************** stages *****************/
public static final String KEY_PAGE_STAGES_DOWN_BUNDLE_START = "wxStartDownLoadBundle";
public static final String KEY_PAGE_STAGES_DOWN_BUNDLE_END = "wxEndDownLoadBundle";
public static final String KEY_PAGE_STAGES_RENDER_ORGIGIN = "wxRenderTimeOrigin";
public static final String KEY_PAGE_STAGES_LOAD_BUNDLE_START = "wxStartLoadBundle";
public static final String KEY_PAGE_STAGES_LOAD_BUNDLE_END = "wxEndLoadBundle";
public static final String KEY_PAGE_STAGES_CREATE_FINISH= "wxJSBundleCreateFinish";
public static final String KEY_PAGE_STAGES_FSRENDER = "wxFsRender";
public static final String KEY_PAGE_STAGES_NEW_FSRENDER = "wxNewFsRender";
public static final String KEY_PAGE_STAGES_INTERACTION = "wxInteraction";
Expand All @@ -71,6 +75,8 @@ public class WXInstanceApm {
public static final String KEY_PAGE_STATS_MAX_DEEP_DOM = "wxMaxDeepVDomLayer";
public static final String KEY_PAGE_STATS_MAX_COMPONENT_NUM = "wxMaxComponentCount";
public static final String KEY_PAGE_STATS_WRONG_IMG_SIZE_COUNT = "wxWrongImgSizeCount";
public static final String KEY_PAGE_STATS_EMBED_COUNT = "wxEmbedCount";
public static final String KEY_PAGE_STATS_LARGE_IMG_COUNT = "wxLargeImgMaxCount";

public static final String KEY_PAGE_STATS_SCROLLER_NUM = "wxScrollerCount";
public static final String KEY_PAGE_STATS_CELL_DATA_UN_RECYCLE_NUM = "wxCellDataUnRecycleCount";
Expand Down Expand Up @@ -99,6 +105,7 @@ public class WXInstanceApm {
private IWXApmMonitorAdapter apmInstance;
private Map<String, Double> recordStatsMap;
private boolean isFSEnd;
private boolean mHasInit = false;

public WXInstanceApm(String instanceId) {
mInstanceId = instanceId;
Expand All @@ -123,8 +130,17 @@ public void onEvent(String name, Object value) {
* record stage
*/
public void onStage(String name) {
WXSDKInstance instance = WXSDKManager.getInstance().getSDKInstance(mInstanceId);
long time = WXUtils.getFixUnixTime();
onStageWithTime(name,time);
}

/**
*
* @param name stage
* @param time unixTime ,plz use WXUtils.getFixUnixTime
*/
public void onStageWithTime(String name,long time){
WXSDKInstance instance = WXSDKManager.getInstance().getSDKInstance(mInstanceId);
if (null != instance){
instance.getExceptionRecorder().recordStage(name, time);
}
Expand All @@ -134,6 +150,7 @@ public void onStage(String name) {
apmInstance.onStage(name, time);
}


/**
* record property
*/
Expand All @@ -154,17 +171,26 @@ public void addStats(String key, double value) {
apmInstance.addStats(key, value);
}


public boolean hasInit(){
return mHasInit;
}

/**
* start record
*/
public void onStart() {
public void doInit() {
if (mHasInit){
return;
}
mHasInit = true;
if (null == apmInstance) {
return;
}
apmInstance.onStart(mInstanceId);
WXSDKInstance instance = WXSDKManager.getInstance().getAllInstanceMap().get(mInstanceId);
String url = null == instance ? "unKnowUrl" : instance.getBundleUrl();
addProperty(KEY_PAGE_PROPERTIES_BIZ_ID, url);
addProperty(KEY_PAGE_PROPERTIES_BUBDLE_URL, url);
addProperty(KEY_PROPERTIES_ERROR_CODE, VALUE_ERROR_CODE_DEFAULT);
addProperty(KEY_PAGE_PROPERTIES_JSLIB_VERSION, WXEnvironment.JS_LIB_SDK_VERSION);
addProperty(KEY_PAGE_PROPERTIES_WEEX_VERSION, WXEnvironment.WXSDK_VERSION);
Expand All @@ -175,6 +201,11 @@ public void onStart() {
}
}

public void setPageName(String pageName){
String fixPageName = TextUtils.isEmpty(pageName)?"emptyPageName":pageName;
addProperty(KEY_PAGE_PROPERTIES_BIZ_ID, fixPageName);
}

public void onAppear(){
if (null == apmInstance) {
return;
Expand Down Expand Up @@ -282,7 +313,7 @@ public void updateExtInfo(Map<String, Object> extParams) {
return;
}

addPropeyFromExtParms("requestType", KEY_PAGE_PROPERTIES_REQUEST_TYPE, extParams);
addPropeyFromExtParms(KEY_PAGE_PROPERTIES_REQUEST_TYPE, KEY_PAGE_PROPERTIES_REQUEST_TYPE, extParams);
addPropeyFromExtParms("cacheType", KEY_PAGE_PROPERTIES_CACHE_TYPE, extParams);
addPropeyFromExtParms("zCacheInfo", KEY_PAGE_PROPERTIES_CACHE_INFO, extParams);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,11 +77,15 @@ public void recordStage(String stage, long time) {
|| WXInstanceApm.KEY_PAGE_STAGES_DOWN_BUNDLE_START.equals(stage)
|| WXInstanceApm.KEY_PAGE_STAGES_LOAD_BUNDLE_START.equals(stage)
) {
mBeginRender = true;
setBeginRender(true);
}
stageList.add(stage + " :" + time);
}

public void setBeginRender(boolean isBegin){
mBeginRender = true;
}

public String convertStageToStr() {
if (stageList.isEmpty()) {
return "empty";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ public GraphicActionCreateBody(@NonNull WXSDKInstance instance, String ref,
if (instance.getContext() == null) {
return;
}
instance.getExceptionRecorder().setBeginRender(true);

BasicComponentData basicComponentData = new BasicComponentData(getRef(), mComponentType, null);
component = createComponent(instance, null, basicComponentData);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import com.taobao.weex.WXSDKInstance;
import com.taobao.weex.WXSDKManager;
import com.taobao.weex.common.WXRenderStrategy;
import com.taobao.weex.performance.WXInstanceApm;
import com.taobao.weex.ui.component.WXComponent;

/**
Expand All @@ -40,6 +41,7 @@ public GraphicActionCreateFinish(@NonNull WXSDKInstance instance) {
this.mLayoutWidth = (int) component.getLayoutWidth();
this.mLayoutHeight = (int) component.getLayoutHeight();
}
instance.getApmForInstance().onStage(WXInstanceApm.KEY_PAGE_STAGES_CREATE_FINISH);

// todo add LayoutFinishListener
// final LayoutFinishListener listener;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,7 @@ public WXEmbed(WXSDKInstance instance, WXVContainer parent, BasicComponentData b
}
this.priority = WXUtils.getString(getAttrs().get(Constants.Name.PRIORITY), PRIORITY_NORMAL);
this.strategy = WXUtils.getString(getAttrs().get(Constants.Name.STRATEGY), STRATEGY_NONE);
instance.getApmForInstance().updateDiffStats(WXInstanceApm.KEY_PAGE_STATS_EMBED_COUNT,1);
}

@Override
Expand Down Expand Up @@ -291,10 +292,6 @@ public void setPriority(String priority) {
*/
protected void loadContent(){
mNestedInstance = createInstance();
if (null != mNestedInstance){
mNestedInstance.setContainerInfo(WXInstanceApm.KEY_PAGE_PROPERTIES_INSTANCE_TYPE,"embed");
mNestedInstance.setContainerInfo(WXInstanceApm.KEY_PAGE_PROPERTIES_PARENT_PAGE,getInstance().getBundleUrl());
}
if(mListener != null && mListener.mEventListener != null){
if(!mListener.mEventListener.onPreCreate(this,src)){
//cancel render
Expand Down Expand Up @@ -338,8 +335,10 @@ private WXSDKInstance createInstance() {
);
return sdkInstance;
}
sdkInstance.setContainerInfo(WXInstanceApm.KEY_PAGE_PROPERTIES_INSTANCE_TYPE,"embed");
sdkInstance.setContainerInfo(WXInstanceApm.KEY_PAGE_PROPERTIES_PARENT_PAGE,getInstance().getWXPerformance().pageName);

sdkInstance.renderByUrl(WXPerformance.DEFAULT,
sdkInstance.renderByUrl(url,
url,
null, null,
WXRenderStrategy.APPEND_ASYNC);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -296,7 +296,7 @@ public void autoRecoverImage() {
}
}

private void setRemoteSrc(Uri rewrited,int blurRadius) {
private void setRemoteSrc(Uri rewrited, int blurRadius) {

WXImageStrategy imageStrategy = new WXImageStrategy(getInstanceId());
imageStrategy.isClipping = true;
Expand All @@ -307,6 +307,7 @@ private void setRemoteSrc(Uri rewrited,int blurRadius) {
imageStrategy.blurRadius = Math.max(0, blurRadius);
this.mBlurRadius = blurRadius;

final String rewritedStr = rewrited.toString();
imageStrategy.setImageListener(new WXImageStrategy.ImageListener() {
@Override
public void onImageFinish(String url, ImageView imageView, boolean result, Map extra) {
Expand All @@ -327,7 +328,7 @@ public void onImageFinish(String url, ImageView imageView, boolean result, Map e
fireEvent(Constants.Event.ONLOAD, params);
}
}
monitorImgSize(imageView);
monitorImgSize(imageView,rewritedStr);
}
});

Expand All @@ -344,7 +345,7 @@ public void onImageFinish(String url, ImageView imageView, boolean result, Map e
imageStrategy.instanceId = getInstanceId();
IWXImgLoaderAdapter imgLoaderAdapter = getInstance().getImgLoaderAdapter();
if (imgLoaderAdapter != null) {
imgLoaderAdapter.setImage(rewrited.toString(), getHostView(),
imgLoaderAdapter.setImage(rewritedStr, getHostView(),
getImageQuality(), imageStrategy);
}
}
Expand Down Expand Up @@ -454,7 +455,8 @@ public void onSaveFailed(String errorDesc) {
});
}

private void monitorImgSize(ImageView imageView){
private String preImgUrlStr = "";
private void monitorImgSize(ImageView imageView,String currentImgUrlStr){
if (null == imageView){
return;
}
Expand All @@ -467,9 +469,16 @@ private void monitorImgSize(ImageView imageView){
if (null == params || null ==img){
return;
}
int imgHeight = img.getIntrinsicHeight();
int imgWidth = img.getIntrinsicWidth();
if (!preImgUrlStr.equals(currentImgUrlStr) && imgHeight > 1920 && imgWidth > 1080){
preImgUrlStr = currentImgUrlStr;
instance.getApmForInstance().updateDiffStats(WXInstanceApm.KEY_PAGE_STATS_LARGE_IMG_COUNT,1);
}


if (img.getIntrinsicHeight() * img.getIntrinsicWidth() > imageView.getMeasuredHeight() *
imageView.getMeasuredWidth()){
if (imgHeight * imgHeight > imageView.getMeasuredHeight() *
imageView.getMeasuredWidth() +10){
instance.getWXPerformance().wrongImgSizeCount++;
instance.getApmForInstance().updateDiffStats(WXInstanceApm.KEY_PAGE_STATS_WRONG_IMG_SIZE_COUNT,1);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -312,8 +312,8 @@ public void addSubView(View child, int index) {
getRealView().addView(child, index);
}
WXSDKInstance instance = getInstance();
if (null != instance && instance.getExceptionRecorder().hasAddView.compareAndSet(false,true)){
instance.getExceptionRecorder().errorList.clear();
if (null != instance){
instance.getExceptionRecorder().hasAddView.set(true);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,8 @@ public static void commitCriticalExceptionRT(@Nullable final String instanceId,
commitMap.put(entry.getKey(),entry.getValue());
}
commitMap.put(WXInstanceExceptionRecord.KEY_EXP_STAGE_LIST,instance.getExceptionRecorder().convertStageToStr());
String bundleTemplate = instance.getTemplate();
commitMap.put("wxTemplateOfBundle",null == bundleTemplate ?"has recycle by gc":bundleTemplate);
}
} else {//instance is null for instance id is null
if (!TextUtils.isEmpty(WXSDKInstance.requestUrl)) {
Expand Down

0 comments on commit 4115a38

Please sign in to comment.