Android中的Serializable、Parcelable">Android中的Serializable、Parcelable
669
2025-04-01
理論基礎(chǔ)
Android系統(tǒng)在應(yīng)用程序框架層中提供了兩個(gè)C++類(lèi)MemoryHeapBase和MemoryBase來(lái)創(chuàng)建和管理匿名共享內(nèi)存。 如果一個(gè)進(jìn)程需要與其他進(jìn)程共享一塊完整的匿名共享內(nèi)存,那么就可以通過(guò)使用MemoryHeapBase類(lèi)類(lèi)創(chuàng)建這塊匿名共享內(nèi)存。如果一個(gè)進(jìn)程創(chuàng)建一塊匿名共享內(nèi)存后,只希望與其他進(jìn)程共享其中的一部分,那么就可以通過(guò)MemoryBase類(lèi)來(lái)創(chuàng)建這塊匿名共享內(nèi)存。
IMemory.h:定義內(nèi)存相關(guān)類(lèi)的接口,表示堆內(nèi)存的類(lèi)IMemoryHeap和BnMemoryHeap,表示一般內(nèi)存的類(lèi)IMemory和BnMemory。 MemoryHeapBase.h:定義類(lèi)MemoryHeapBase,繼承并實(shí)現(xiàn)BnMemoryHeap MemoryBase.h:定義類(lèi)MemoryBase,繼承并實(shí)現(xiàn)BnMemory。
Android系統(tǒng)在應(yīng)用程序框架層中提供了java類(lèi)MemoryFile來(lái)創(chuàng)建和管理匿名共享內(nèi)存。使用java類(lèi)MemoryFile創(chuàng)建的匿名共享內(nèi)存可以在不同的Android應(yīng)用程序之間進(jìn)行共享。
java代碼解析
匿名共享內(nèi)存java類(lèi)MemoryFile在系統(tǒng)中的source\frameworks\base\core\java\android\os\MemoryFile.java文件中實(shí)現(xiàn)。
//匿名共享內(nèi)存的構(gòu)造函數(shù),參數(shù)1表示創(chuàng)建匿名共享內(nèi)存的名稱(chēng),參數(shù)2表示創(chuàng)建匿名共享內(nèi)存大小 public MemoryFile(String name, int length) throws IOException { mLength = length; if (length >= 0) { //通過(guò)調(diào)用jni的接口去打開(kāi)匿名共享內(nèi)存 mFD = native_open(name, length); } else { throw new IOException("Invalid length: " + length); } if (length > 0) { //進(jìn)行映射 mAddress = native_mmap(mFD, length, PROT_READ | PROT_WRITE); } else { mAddress = 0; } } 復(fù)制代碼
C++關(guān)鍵函數(shù)解析
//MemoryHeapBase構(gòu)造函數(shù)的實(shí)現(xiàn) MemoryHeapBase::MemoryHeapBase(const char* device, size_t size, uint32_t flags) : mFD(-1), mSize(0), mBase(MAP_FAILED), mFlags(flags), mDevice(0), mNeedUnmap(false), mOffset(0) { int open_flags = O_RDWR; if (flags & NO_CACHING) open_flags |= O_SYNC; //通過(guò)調(diào)用open打開(kāi)匿名共享內(nèi)存設(shè)備文件 int fd = open(device, open_flags); ALOGE_IF(fd<0, "error opening %s: %s", device, strerror(errno)); if (fd >= 0) { //指定的匿名共享內(nèi)存大小按頁(yè)對(duì)齊 const size_t pagesize = getpagesize(); size = ((size + pagesize-1) & ~(pagesize-1)); //匿名共享內(nèi)存映射到當(dāng)前進(jìn)程地址空間 if (mapfd(fd, size) == NO_ERROR) { mDevice = device; } } } 復(fù)制代碼
//MemoryHeapBase構(gòu)造函數(shù) MemoryHeapBase::MemoryHeapBase(size_t size, uint32_t flags, char const * name) : mFD(-1), mSize(0), mBase(MAP_FAILED), mFlags(flags), mDevice(0), mNeedUnmap(false), mOffset(0) { //獲得系統(tǒng)中頁(yè)大小的內(nèi)存 const size_t pagesize = getpagesize(); //內(nèi)存頁(yè)對(duì)齊 size = ((size + pagesize-1) & ~(pagesize-1)); //創(chuàng)建一塊匿名共享內(nèi)存 int fd = ashmem_create_region(name == NULL ? "MemoryHeapBase" : name, size); ALOGE_IF(fd<0, "error creating ashmem region: %s", strerror(errno)); if (fd >= 0) { //創(chuàng)建的匿名共享內(nèi)存映射到當(dāng)前進(jìn)程地址空間中 if (mapfd(fd, size) == NO_ERROR) { if (flags & READ_ONLY) {//如果地址映射成功,修改匿名共享內(nèi)存的訪問(wèn)屬性 ashmem_set_prot_region(fd, PROT_READ); } } } }
Android 任務(wù)調(diào)度
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶(hù)投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶(hù)投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。