货拉拉 与 Lalamove Android 项目采用inline-hook
技术来解决系统级问题以提高系统稳定性与性能问题。
避免当挂起超时时,进程被 Abort
信号杀死。
SuspendThreadSafeHelper.getInstance()
.suspendThreadSafe(object : SuspendThreadSafeHelper.SuspendThreadCallback {
override fun suspendThreadTimeout(waitTime: Double) {
Log.i("TAG", "Waitting for thread suspend done, spend : $waitTime s")
}
override fun onError(errorMsg: String) {
Log.e("TAG", "onError: $errorMsg")
}
})
-
Android [5,11] : Hook ThreadSuspendByPeerWarning()函数, 将日志致命级别修改为警告级别,如果线程挂起超时,将调用
suspendThreadTimeout()
会通知 Java 层。 -
Android [12,14] : Hook SuspendThreadByPeer() 函数转而调用 SuspendThreadByThreadIdSuspendThreadByThreadId, 此时并不会回调给 Java 调用方, 因为替换方法不会触发
Abort
信号发送,进而不会造成崩溃。 -
Android 15 : Hook StringPrintf() 函数,并且在代理
StringPrintf
中等待线程真正挂起结束后再执行后续流程, 将调用suspendThreadTimeout()
会通知 Java 层,并回调等待时间。
在货拉拉国际版业务中, 由于存在一部分低端设备,线程挂起超时导致的崩溃次数较多,修复后收益明显。
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
maven { url = uri("https://jitpack.io") }
}
}
dependencies {
implementation 'com.github.HuolalaTech:hll-sys-hook-android:1.4-SNAPSHOT'
}
SuspendThreadSafeHelper.getInstance()
.suspendThreadSafe(object : SuspendThreadSafeHelper.SuspendThreadCallback {
override fun suspendThreadTimeout(waitTime: Double) {
Log.i("TAG", "Waitting for thread suspend done, spend : $waitTime s")
}
override fun onError(errorMsg: String) {
Log.e("TAG", "onError: $errorMsg")
}
})