Skip to content

Commit 5823a43

Browse files
committed
修改binder和sharedmemory传输界线,解决临界崩溃问题
1 parent b3b47c5 commit 5823a43

File tree

7 files changed

+36
-33
lines changed

7 files changed

+36
-33
lines changed

gradle/wrapper/gradle-wrapper.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
33
distributionPath=wrapper/dists
44
zipStoreBase=GRADLE_USER_HOME
55
zipStorePath=wrapper/dists
6-
distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip
6+
distributionUrl=https://mirrors.cloud.tencent.com/gradle/gradle-6.5-bin.zip

ipc-app-test/src/main/java/com/demo/ipc/CommonActivity.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class CommonActivity : AppCompatActivity() {
2222
override fun onCreate(savedInstanceState: Bundle?) {
2323
super.onCreate(savedInstanceState)
2424
setContentView(R.layout.activity_common)
25-
IpcManager.config(Config.builder().configDebug(true).build())
25+
IpcManager.config(Config.builder().configDebug(true).configSharedMemoryCapacity(2*1024*1024).build())
2626
IpcManager.init(this)
2727
IpcManager.open("com.demo.ipcdemo") {
2828
runOnUiThread {

ipc-app-test/src/main/java/com/demo/ipc/InfoServiceManager.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,15 +71,15 @@ object InfoServiceManager : InfoService {
7171
}
7272

7373
override fun getBigByteArray(): ByteArray {
74-
return ByteArray(800_000)
74+
return ByteArray(258_000)
7575
}
7676

7777
private var asyncBigByteArrayCallback:Result<ByteArray>?=null
7878

7979
override fun asyncGetBigByteArray(callBack: Result<ByteArray>) {
8080
asyncBigByteArrayCallback=callBack
8181
thread {
82-
asyncBigByteArrayCallback?.onData(ByteArray(1024*1024*2))
82+
asyncBigByteArrayCallback?.onData(ByteArray(254_998))
8383
}
8484
}
8585
}

ipc-core/src/main/java/com/zclever/ipc/core/Bridge.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import android.os.Process
55

66
const val REQUEST_TYPE_CREATE = 1
77
const val REQUEST_TYPE_INVOKE = 2
8-
const val BINDER_MAX_TRANSFORM_JSON_LENGTH = 520_000 //根据parcel序列化结合接口设计,最大能传输的json字符串长度
8+
const val BINDER_MAX_TRANSFORM_JSON_BYTE_ARRAY_SIZE = 510_000 //根据parcel序列化结合接口设计,最大能传输的json字节数据长度
99

1010
/**
1111
* 请求对象

ipc-core/src/main/java/com/zclever/ipc/core/client/ServiceInvocationHandler.kt

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -46,17 +46,19 @@ internal class ServiceInvocationHandler(
4646

4747
val requestParamJson = GsonInstance.toJson(RequestParam(paramValueMap))
4848

49-
debugD("invoke requestParamJson length ->${requestParamJson.length}, content->$requestParamJson")
50-
5149

5250
var requestBase = RequestBase(
5351
targetClazzName = targetClazzName,
5452
functionKey = kotlinFunction.signature(),
5553
callbackKey = if (callbackInstance) signature else "",
5654
)
5755

56+
val paramByteArray = requestParamJson.encodeToByteArray()
57+
58+
debugD("invoke requestParamJson byte size ->${paramByteArray.size}, content->$requestParamJson")
59+
5860
val response =
59-
if (requestParamJson.length < BINDER_MAX_TRANSFORM_JSON_LENGTH) {//binder传输
61+
if (paramByteArray.size < BINDER_MAX_TRANSFORM_JSON_BYTE_ARRAY_SIZE) {//binder传输
6062

6163
synchronized(ClientCache.serverResponseSharedMemory!!) {//确保同步
6264

@@ -80,29 +82,26 @@ internal class ServiceInvocationHandler(
8082

8183
} else {//共享内存传输参数
8284

83-
requestParamJson.encodeToByteArray().let { paramByteArray ->
85+
synchronized(ClientCache.serverResponseSharedMemory!!) { //保证同步
8486

85-
synchronized(ClientCache.serverResponseSharedMemory!!) { //保证同步
87+
ClientCache.clientSharedMemory!!.writeByteArray(paramByteArray) //把utf-8编码的字节数组写入共享内存区域
8688

87-
ClientCache.clientSharedMemory!!.writeByteArray(paramByteArray) //把utf-8编码的字节数组写入共享内存区域
89+
val responseStr = connector.connect( //写完共享内存通知服务端读取
90+
GsonInstance.toJson(requestBase.createNoParameterRequest(
91+
paramByteArray.size
92+
).apply { requestBase = this }), null
93+
)
8894

89-
val responseStr = connector.connect( //写完共享内存通知服务端读取
90-
GsonInstance.toJson(requestBase.createNoParameterRequest(
91-
paramByteArray.size
92-
).apply { requestBase = this }), null
93-
)
95+
var responseObj = GsonInstance.fromJson<Response>(responseStr)
9496

95-
var responseObj = GsonInstance.fromJson<Response>(responseStr)
96-
97-
if (responseObj.dataStr.isNullOrEmpty()) {
98-
Response(
99-
ClientCache.serverResponseSharedMemory!!.readJsonStr(
100-
responseObj.dataByteSize
101-
)
102-
)//服务端返回共享内存写入结果后,客户端再读
103-
} else {
104-
responseObj
105-
}
97+
if (responseObj.dataStr.isNullOrEmpty()) {
98+
Response(
99+
ClientCache.serverResponseSharedMemory!!.readJsonStr(
100+
responseObj.dataByteSize
101+
)
102+
)//服务端返回共享内存写入结果后,客户端再读
103+
} else {
104+
responseObj
106105
}
107106
}
108107
}

ipc-core/src/main/java/com/zclever/ipc/core/server/ServerCallBack.kt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,17 @@ internal class ServerCallBack(
2222

2323
val dataJson = GsonInstance.toJson(data)
2424

25-
debugD("onData: $callbackKey,-------${ServiceCache.remoteClients.getClientByPid(pid)},size->${dataJson.length}")
25+
val dataJsonByteArray=dataJson.encodeToByteArray()
2626

27-
if (dataJson.length < BINDER_MAX_TRANSFORM_JSON_LENGTH) {
27+
debugD("onData: $callbackKey,-------${ServiceCache.remoteClients.getClientByPid(pid)},size->${dataJsonByteArray.size}")
2828

29+
if (dataJsonByteArray.size < BINDER_MAX_TRANSFORM_JSON_BYTE_ARRAY_SIZE) {
30+
debugD("onData use binder")
2931
ServiceCache.remoteClients.getClientByPid(pid)
3032
?.onReceive(GsonInstance.toJson(CallbackResponse(callbackKey, dataJson)))
3133

3234
} else {
33-
35+
debugD("onData use shared memory")
3436
val sharedMemory = ServiceCache.serverCallbackMemoryMap[pid]!!
3537

3638
synchronized(sharedMemory) {
@@ -39,7 +41,7 @@ internal class ServerCallBack(
3941
CallbackResponse(
4042
callbackKey,
4143
null,
42-
dataJson.encodeToByteArray()
44+
dataJsonByteArray
4345
.also { sharedMemory.writeByteArray(it) }.size
4446
)
4547
)

ipc-core/src/main/java/com/zclever/ipc/core/server/ServiceCenter.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,11 +100,13 @@ class ServiceCenter : Service() {
100100

101101
val resultJson = invokeResult.toJson()
102102

103+
val resultByteArray = resultJson.encodeToByteArray()
103104

104-
if (resultJson.length < BINDER_MAX_TRANSFORM_JSON_LENGTH) {
105+
if (resultByteArray.size < BINDER_MAX_TRANSFORM_JSON_BYTE_ARRAY_SIZE) {
106+
debugD("return use binder")
105107
Response(resultJson).toJson()
106108
} else {
107-
val resultByteArray = resultJson.encodeToByteArray()
109+
debugD("return use shared memory")
108110

109111
ServiceCache.serverResponseMemoryMap[requestBase.pid]!!.writeByteArray(resultByteArray)
110112

0 commit comments

Comments
 (0)