parent
fb2479bea1
commit
48c87e35ef
@ -0,0 +1,92 @@ |
||||
--- |
||||
Framework 设计巧妙点 |
||||
--- |
||||
|
||||
1. 对 Framework 的涉猎有一定的广度和深度 |
||||
2. 对系统设计有自己的总结和思考 |
||||
|
||||
#### 例子 |
||||
|
||||
1. Binder 调用,模糊进程边界 |
||||
2. Bitmap 大图传输,高性能 |
||||
3. Zygote 创建进程,资源共享 |
||||
4. Intent 解耦,模糊进程 |
||||
|
||||
Binder 调用: |
||||
|
||||
1. 请求转发 |
||||
2. Binder 对象的传递 |
||||
|
||||
Bitmap 大图传输: |
||||
|
||||
```c++ |
||||
static jboolean Bitmap_writeToParcel(JNIEnv* env, jobject, ...){ |
||||
int fd = androidBitmap->getAshmemFd(); |
||||
if(fd>=0&&!isMutable&&p->allowFds()){ |
||||
p->writeDupImmutableBlobFileDescriptor(fd); |
||||
return JNI_TRUE; |
||||
} |
||||
} |
||||
static jobject Bitmap_createFromParcel(JNIEnv* env, jobject parcel){ |
||||
if(blob.fd()>=0 && (blob.isMutable()||!isMutable) && (size>=ASHMEM_BITMAP_MIN_SIZE)){ |
||||
nativeBitmap = GraphicsJNI::mapAshmemPixelRef(env, bitmap.get(), ctable, dupFd, const_cast<void*>(blob.data()), !isMutable); |
||||
} |
||||
} |
||||
``` |
||||
|
||||
Zygote 创建进程: |
||||
|
||||
```c++ |
||||
int main(int argc, char* const argv[]){ |
||||
runtime.start("com.android.internal.os.ZygoteInit", args, zygote); |
||||
} |
||||
// ZygoteInit#main |
||||
public static void main(String argv[]){ |
||||
preload(); |
||||
startSystemServer(abList, socketName); |
||||
runSelectLoop(abiList); |
||||
} |
||||
``` |
||||
|
||||
Intent 解耦: |
||||
|
||||
```java |
||||
Intent registerReceiver(..., IIntentReceiver receiver, IntentFilter filter, ...){ |
||||
ReceiverList rl = mRegistedReceivers.get(receiver.asBinder()); |
||||
if(rl == null){ |
||||
rl = new ReceiverList(this, ..., yserId, receiver); |
||||
rl.app.receivers.add(rl); |
||||
mRegisteredReceivers.put(receiver.asBinder(), rl); |
||||
} |
||||
BroadcastFilter bf = new BroadcastFilter(filter, rl, callerOackage, ...); |
||||
rl.add(bf); |
||||
mReceiverResolver.addFilter(bf); |
||||
} |
||||
``` |
||||
|
||||
```java |
||||
int broadcastIntentLocked(ProcessRecord callerApp, ...){ |
||||
List receivers = null; |
||||
List<BroadcastFilter> registeredReceivers = null; |
||||
registeredReceivers = mReceiverResolver.queryIntent(intent, ...); |
||||
|
||||
int NR = registeredReceivers.size(); |
||||
final BroadcastQueue queue = broadcastQueueForIntent(intent); |
||||
BroadcastRecord r = new BroadcastRecord(queue, intent, ...); |
||||
queue.enqueueParallelBroadcastLocked(r); |
||||
queue.scheduleBroadcastLocked(); |
||||
return ActivityManager.BROADCAST_SUCCESS; |
||||
} |
||||
``` |
||||
|
||||
```java |
||||
while(mParallelBroadcasts.size()>0){ |
||||
r = mParallelBroadcasts.remove(0); |
||||
final int N = r.receivers.size(); |
||||
for(int i=0;i<N;i++){ |
||||
Object target = r.receivers.get(i); |
||||
deliverToRegisteredReceiverLocked(r, (BroadcastFilter)target, false); |
||||
} |
||||
} |
||||
``` |
||||
|
Loading…
Reference in new issue