不要发急,我们继续往下看分析
4.解答疑问
我们来看一下,下面两行代码
//frameworks/base/core/jni/android_util_Binder.cpp
//这个方法android_os_BinderProxy_transact里面的
IBinder* target = getBPNativeData(env, obj)->mObject.get();
status_t err = target->transact(code, *data, reply, flags);
从上面的分析和测试结果,我们从target->transact这里来找err返回值, 先根据头文件,搜索对应的cpp类,我们看一下这几个cpp类:BpBinder.cpp、 IPCThreadState.cpp、ProcessState.cpp
//frameworks/native/libs/binder/ProcessState.cpp
// (1 * 1024 * 1024) - (4096 *2)
#define BINDER_VM_SIZE ((1 * 1024 * 1024) - sysconf(_SC_PAGE_SIZE) * 2)
#define DEFAULT_MAX_BINDER_THREADS 15
//下面两个解释
//引用自官方文档:https://source.android.google.cn/devices/architecture/hidl/binder-ipc
#ifdef ANDROID_VNDK
//供应商/供应商历程之间的IPC,使用 AIDL 接口
const char* kDefaultDriver = “/dev/vndbinder”;
#else
// “/dev/binder” 设备节点成为框架历程的专有节点
const char* kDefaultDriver = “/dev/binder”;
#endif
//构造函数:初始化一些变量,Binder最大线程数等
ProcessState:rocessState(const char* driver)
: mDriverName(String8(driver)),
mDriverFD(-1),
mVMStart(MAP_FAILED),
…
mMaxThreads(DEFAULT_MAX_BINDER_THREADS),
mStarvationStartTimeMs(0),
mThreadPoolStarted(false),
mThreadPoolSeq(1),
mCallRestriction(CallRestriction::NONE) {
…
//打开驱动
base::Result opened = open_driver(driver);
if (opened.ok()) {
//映射(1M-8k)的mmap空间
mVMStart = mmap(nullptr, BINDER_VM_SIZE, PROT_READ, MAP_PRIVATE | MAP_NORESERVE,
opened.value(), 0);
…
}
…
}
点击查看sysconf.cpp
getauxval(AT_PAGESZ) = 4096,可以得出Binder内存限制,BINDER_VM_SIZE = 1M-8kb
这里为什么不是1M,而是1M-8K?
最开始的时候,官方写的是1M,厥后他们内部本身优化了;
来看这里 |