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

Commit c06d42e

Browse files
lucky-chenDarin726
authored andcommitted
[Android] dump ipc mmap page flag when white screen (#2903)
1 parent 7ea24be commit c06d42e

File tree

11 files changed

+64
-2
lines changed

11 files changed

+64
-2
lines changed

android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -968,7 +968,7 @@ private void checkWhiteScreen(){
968968
if (!isWS){
969969
return;
970970
}
971-
WXErrorCode errorCode = WXErrorCode.WX_ERROR_WHITE_SCREEN;
971+
WXErrorCode errorCode = createInstanceHeartBeat?WXErrorCode.WX_ERROR_WHITE_SCREEN:WXErrorCode.WHITE_SCREEN_RESPONSE_TIMEOUT;
972972
Map<String,String> args = new HashMap<>(1);
973973
String vieTreeMsg = WhiteScreenUtils.takeViewTreeSnapShot(this);
974974
args.put("viewTree",null == vieTreeMsg?"null viewTreeMsg":vieTreeMsg);

android/sdk/src/main/java/com/taobao/weex/bridge/WXBridge.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,8 @@ public class WXBridge implements IWXBridge {
125125

126126
public native void nativeOnInteractionTimeUpdate(String instanceId);
127127

128+
public native String nativeDumpIpcPageQueueInfo();
129+
128130
/**
129131
* Update Init Framework Params
130132
* */

android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -443,6 +443,13 @@ public WXDebugJsBridge getWXDebugJsBridge() {
443443
}
444444
}
445445

446+
public String dumpIpcPageInfo(){
447+
if (mWXBridge instanceof WXBridge){
448+
return ((WXBridge)mWXBridge).nativeDumpIpcPageQueueInfo();
449+
}
450+
return "";
451+
}
452+
446453
public void stopRemoteDebug() {
447454
if (mWxDebugProxy != null) {
448455
try {

android/sdk/src/main/java/com/taobao/weex/common/WXErrorCode.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ public enum WXErrorCode {
126126
WX_ERR_RELOAD_PAGE_EXCEED_LIMIT("-2114", "RELOAD_PAGE_EXCEED_LIMIT",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
127127

128128
WX_ERROR_WHITE_SCREEN("-2116", "WHITE_SCREEN",ErrorType.RENDER_ERROR,ErrorGroup.JS),
129+
WHITE_SCREEN_RESPONSE_TIMEOUT("-2117", "WHITE_SCREEN_RESPONSE_TIMEOUT",ErrorType.RENDER_ERROR,ErrorGroup.JS),
129130

130131

131132
/**

android/sdk/src/main/java/com/taobao/weex/performance/WXStateRecord.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
import java.util.concurrent.ConcurrentLinkedQueue;
2929

3030
import android.support.annotation.NonNull;
31+
import com.taobao.weex.WXSDKManager;
32+
import com.taobao.weex.adapter.IWXConfigAdapter;
3133
import com.taobao.weex.bridge.WXBridgeManager;
3234
import com.taobao.weex.ui.IFComponentHolder;
3335
import com.taobao.weex.utils.WXUtils;
@@ -145,6 +147,10 @@ public Map<String, String> getStateInfo() {
145147
Collections.sort(reportTimeLineInfo);
146148
stateInfo.put("stateInfoList",reportTimeLineInfo.toString());
147149

150+
IWXConfigAdapter adapter = WXSDKManager.getInstance().getWxConfigAdapter();
151+
if (null != adapter && "true".equalsIgnoreCase(adapter.getConfig("wxapm","dumpIpcPageInfo","true"))){
152+
stateInfo.put("pageQueueInfo",WXBridgeManager.getInstance().dumpIpcPageInfo());
153+
}
148154
return stateInfo;
149155
}
150156

weex_core/Source/android/multiprocess/weex_js_connection.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,13 +174,15 @@ static void *newIPCServer(void *_td) {
174174
std::unique_ptr<IPCSender> sender(createIPCSender(futexPageQueue.get(), handler));
175175
std::unique_ptr<IPCListener> listener =std::move(createIPCListener(futexPageQueue.get(), handler)) ;
176176
newThreadStatus = SUCCESS;
177+
WeexCore::WeexCoreManager::Instance()->server_queue_=futexPageQueue.get();
177178

178179
try {
179180
futexPageQueue->spinWaitPeer();
180181
listener->listen();
181182
} catch (IPCException &e) {
182183
LOGE("IPCException server died %s",e.msg());
183184
base::android::DetachFromVM();
185+
WeexCore::WeexCoreManager::Instance()->server_queue_= nullptr;
184186
pthread_exit(NULL);
185187
}
186188
return nullptr;
@@ -207,6 +209,7 @@ IPCSender *WeexJSConnection::start(bool reinit) {
207209
m_impl->serverSender = std::move(sender);
208210
m_impl->futexPageQueue = std::move(futexPageQueue);
209211

212+
WeexCore::WeexCoreManager::Instance()->client_queue_=m_impl->futexPageQueue.get();
210213
pthread_attr_t threadAttr;
211214
newThreadStatus = UNFINISH;
212215

@@ -295,6 +298,7 @@ IPCSender *WeexJSConnection::start(bool reinit) {
295298

296299
void WeexJSConnection::end() {
297300
try {
301+
WeexCoreManager::Instance()->client_queue_ = nullptr;
298302
m_impl->serverSender.reset();
299303
m_impl->futexPageQueue.reset();
300304
} catch (IPCException &e) {

weex_core/Source/android/wrap/wx_bridge.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
#include "third_party/json11/json11.hpp"
4949
#include "core/moniter/render_performance.h"
5050
#include "core/render/page/render_page_base.h"
51+
#include "third_party/IPC/IPCFutexPageQueue.h"
5152

5253
using namespace WeexCore;
5354
jlongArray jFirstScreenRenderTime = nullptr;
@@ -286,6 +287,20 @@ static void SetLogType(JNIEnv* env, jobject jcaller, jfloat logLevel,
286287
->core_side()
287288
->SetLogType(l, flag);
288289
}
290+
291+
static jstring nativeDumpIpcPageQueueInfo(JNIEnv* env, jobject jcaller){
292+
std::string client_quene_msg;
293+
if (WeexCoreManager::Instance()->client_queue_ != nullptr){
294+
WeexCoreManager::Instance()->client_queue_->dumpPageInfo(client_quene_msg);
295+
}
296+
std::string server_quene_msg;
297+
if (WeexCoreManager::Instance()->server_queue_ != nullptr){
298+
WeexCoreManager::Instance()->server_queue_->dumpPageInfo(server_quene_msg);
299+
}
300+
std::string result ;
301+
result = "{client:"+client_quene_msg+"}\n"+"{server:"+server_quene_msg+"}";
302+
return env->NewStringUTF(result.c_str());
303+
}
289304
static void ReloadPageLayout(JNIEnv *env, jobject jcaller,
290305
jstring instanceId){
291306
WeexCoreManager::Instance()->getPlatformBridge()->core_side()->RelayoutUsingRawCssStyles(jString2StrFast(env,instanceId));

weex_core/Source/base/android/jniprebuild/jniheader/WXBridge_jni.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,7 @@ static void SetPageArgument(JNIEnv *env, jobject jcaller,
210210
static void SetLogType(JNIEnv* env, jobject jcaller, jfloat type,
211211
jfloat isPerf);
212212

213+
static jstring nativeDumpIpcPageQueueInfo(JNIEnv* env, jobject jcaller);
213214
static void ReloadPageLayout(JNIEnv *env, jobject jcaller,
214215
jstring instanceId);
215216
static void SetDeviceDisplayOfPage(JNIEnv *env, jobject jcaller,
@@ -1396,6 +1397,10 @@ static const JNINativeMethod kMethodsWXBridge[] = {
13961397
"F"
13971398
")"
13981399
"V", reinterpret_cast<void *>(SetLogType)},
1400+
{ "nativeDumpIpcPageQueueInfo",
1401+
"("
1402+
")"
1403+
"Ljava/lang/String;", reinterpret_cast<void*>(nativeDumpIpcPageQueueInfo) },
13991404
{"nativeReloadPageLayout",
14001405
"("
14011406
"Ljava/lang/String;"

weex_core/Source/core/manager/weex_core_manager.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
#include "core/bridge/script_bridge.h"
2828
#include "base/message_loop/message_loop.h"
2929

30+
class IPCFutexPageQueue;
31+
3032
namespace WeexCore {
3133
class WeexCoreManager {
3234
public:
@@ -70,6 +72,9 @@ class WeexCoreManager {
7072

7173
inline weex::base::Thread *script_thread() { return script_thread_; }
7274

75+
IPCFutexPageQueue* client_queue_;
76+
IPCFutexPageQueue* server_queue_;
77+
7378
private:
7479
PlatformBridge *platform_bridge_;
7580
MeasureFunctionAdapter *measure_function_adapter_;
@@ -82,7 +87,9 @@ class WeexCoreManager {
8287
measure_function_adapter_(nullptr),
8388
script_bridge_(nullptr),
8489
project_mode_(COMMON),
85-
script_thread_(nullptr){};
90+
script_thread_(nullptr),
91+
client_queue_(nullptr),
92+
server_queue_(nullptr){};
8693
~WeexCoreManager(){};
8794
};
8895
} // namespace WeexCore

weex_core/Source/third_party/IPC/IPCFutexPageQueue.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,3 +214,16 @@ void IPCFutexPageQueue::clearFinishedTag()
214214
pageRead[1] = 0;
215215
__atomic_thread_fence(__ATOMIC_SEQ_CST);
216216
}
217+
218+
void IPCFutexPageQueue::dumpPageInfo(std::string &info) {
219+
std::string builder;
220+
221+
for (size_t i = 0; i < m_pagesCount ; ++i) {
222+
uint32_t* pageStart = static_cast<uint32_t*>(getPage(i));
223+
auto tmp = new IPCException("[%zu,%zu,%zu]",*pageStart,*(pageStart+1),*(pageStart+2));
224+
builder+= tmp->msg();
225+
delete(tmp);
226+
}
227+
auto msg = new IPCException("tid:%d,readId:%zu,writeId:%zu,info:%s",m_tid,m_currentRead,m_currentWrite,builder.c_str());
228+
info.assign(msg->msg());
229+
}

0 commit comments

Comments
 (0)