1. android跨進程通信-共享內存
還是先看共享內存的使用方法,我主要介紹兩個函數:
通過 shmget() 函數申請共享內存,它的入參如下
通過 shmat() 函數將我們申請到的共享內存映射到自己的用戶空間,映射成功會返回地址,有了這個地址,我們就可以隨意的讀寫數據了,我們繼續看一下這個函數的入參
共享內存的原理是在內存中單獨開辟的一段內存空間,這段內存空間其實就是一個tempfs(臨時虛擬文件),tempfs是VFS的一種文件系統,掛載在/dev/shm上,前面提到的管道pipefs也是VFS的一種文件系統。
由於共享的內存空間對使用和接收進程來講,完全無感知,就像是在自己的內存上讀寫數據一樣,所以也是 效率最高 的一種IPC方式。
上面提到的IPC的方式都是 在內核空間中開辟內存來存儲數據 ,寫數據時,需要將數據從用戶空間拷貝到內核空間,讀數據時,需要從內核空間拷貝到自己的用戶空間,
共享內存就只需要一次拷貝 ,而且共享內存不是在內核開辟空間,所以可以 傳輸的數據量大 。
但是 共享內存最大的缺點就是沒有並發的控制,我們一般通過信號量配合共享內存使用,進行同步和並發的控制 。
共享內存在Android系統中主要的使用場景是 用來傳輸大數據 ,並且 Android並沒有直接使用Linux原生的共享內存方式,而是設計了Ashmem匿名共享內存 。
之前說到有名管道和匿名管道的區別在於有名管道可以在vfs目錄樹中查看到這個管道的文件,但是匿名管道不行, 所以匿名共享內存同樣也是無法在vfs目錄中查看到 的, Android之所以要設計匿名共享內存 ,我覺得主要是為了安全性的考慮吧。
我們來看看共享內存的一個使用場景,在Android中,如果我們想要將當前的界面顯示出來,需要將當前界面的圖元數據傳遞Surfaceflinger去做圖層混合,圖層混合之後的數據會直接送入幀緩存,送入幀緩存後,顯卡就會直接取出幀緩存里的圖元數據顯示了。
那麼我們如何將應用的Activity的圖元數據傳遞給SurfaceFlinger呢?想要將圖像數據這樣比較大的數據跨進程傳輸,靠binder是不行的,所以這兒便用到匿名共享內存。
從谷歌官方提供的架構圖可以看到,圖元數據是通過BufferQueue傳遞到SurfaceFlinger去的,當我們想要繪制圖像的時候, 需要從BufferQueue中申請一個Buffer,Buffer會調用Gralloc模塊來分配共享內存 當作圖元緩沖區存放我們的圖元數據。
可以看到Android的匿名共享內存是通過 ashmem_create_region() 函數來申請共享內存的,它會在/dev/ashmem下創建一個虛擬文件,Linux原生共享內存是通過shmget()函數,並會在/dev/shm下創建虛擬文件。
匿名共享內存是通過 mmap() 函數將申請到的內存映射到自己的進程空間,而Linux是通過*shmat()函數。
雖然函數不一樣,但是Android的匿名共享內存和Linux的共享內存在本質上是大同小異的。
要使用一塊共享內存
2. 安卓文件無法復制到根目錄
使用第三方軟體復制。
安卓手機正常通過數據線連接手機和電腦的時候,只顯示內存卡,不顯示手機自身內存,這樣您就無法把內存卡的東西復制到電腦里,但是可以通過第三方軟體,比如豌豆莢、360助手或者手機助手連接手機和電腦的,這樣可以查看到內存卡的內存還可以查看到手機內存的,您可以嘗試將內存卡里的東西復制到手機內存里。
根目錄指邏輯驅動器的最上一級目錄,它是相對子目錄來說的。打開「我的電腦」,雙擊C盤就進入C盤的根目錄,雙擊D盤就進入D盤的根目錄。其它類推。根目錄在文件系統建立時即已被創建,其目的就是存儲子目錄(也稱為文件夾)或文件的目錄項。一「棵「目錄樹,樹的最根本就是它的根(根目錄)。
3. android系統的手機目錄各個文件夾代表什麼例如acct
1、acct文件夾:根目錄/acct/ ,系統回收站,誤刪除的系統文件恢復ACCT計算機語言,系統調用禁止/啟用系統記錄進程信息。
2、cache文件夾:緩存(cache) 文件。只是內存中少部分數據的復製品,先於內存與CPU交換數據,因此速率很快。
3、config文件夾:(計算機系統)配置。如:系統里的config.sys就是系統自動配置文件,它是在用戶開機這段時間對計算機進行初始化設置,也就是用戶對系統的設置都由它來對計算機進行恢復。
4、system:Android 系統文件。主要包括usr(用戶文件夾,包含共享、鍵盤布局、時間區域文件等) ,app(常規下載的應用程序,這些 apk 包都是受保護的), lib(系統底層庫,如平台運行時庫等)等。
5、etc:系統主要配置文件,比如APN接入點設置等核心配置等。
6、data:用戶程序目錄。存儲手機系統文件和安裝軟體的數據文件,不能隨便刪除。