@
nnegier 是的,你的问题很赞。
一次 Binder 通信数据有最大的 1M 限制( Android 源码默认),如果超过这个大小了,在 Binder 通信中会有多次的数据交互,比如常见的 IPackageManager 的 getInstalledPackages 就会碰到。
这时底层通信拦截的处理办法是:
我们在首次调用的时候 cache 住 binder_object 的 handle ( binder_txn_st* txn 中的 handle ),当本次 binder 通信为结束,但是 Code 为 1 ( FIRST_CALL_TRANSACTION ),接口方法 Code 均大于 1 ( binder_txn_st* txn 中的 Code ),此时匹配 handle 值于之前 cache 的 handle 值是否一致,一致则解析。
如 cache:
unsigned int handle = target_get_binder_obj_ptr(txn);
if (0 < handle) {
TlsCache* poolItem = TlsUtils::getPool();
if (poolItem) {
poolItem->setInt(handle);// TODO save cache
} else {
// TODO cleat
}
}
如:解析
if (token.unequal(__PACKAGE_LENGTH__, __PACKAGE_HASH__)) {
if (FIRST_CALL_TRANSACTION == txn->code) {
TlsCache *tlsPool = TlsUtils::getPool();
if (tlsPool->getInt() == txn->target.handle) {
// TODO
}
}
}