Binder

問:為什么Android要采用Binder作為IPC機制

答案來自百度知道:

(1)從性能的角度
數據拷貝次數:Binder數據拷貝只需要一次,而管道、消息隊列、Socket都需要2次,但共享內存方式一次內存拷貝都不需要;從性能角度看,Binder性能僅次于共享內存。

(2)從穩定性的角度
Binder是基于C/S架構的,簡單解釋下C/S架構,是指客戶端(Client)和服務端(Server)組成的架構,Client端有什么需求,直接發送給Server端去完成,架構清晰明朗,Server端與Client端相對獨立,穩定性較好;而共享內存實現方式復雜,沒有客戶與服務端之別, 需要充分考慮到訪問臨界資源的并發同步問題,否則可能會出現死鎖等問題;從這穩定性角度看,Binder架構優越于共享內存。

僅僅從以上兩點,各有優劣,還不足以支撐google去采用binder的IPC機制,那么更重要的原因是:

(3)從安全的角度
傳統Linux IPC的接收方無法獲得對方進程可靠的UID/PID,從而無法鑒別對方身份;而Android作為一個開放的開源體系,擁有非常多的開發平臺,App來源甚廣,因此手機的安全顯得額外重要;對于普通用戶,絕不希望從App商店下載偷窺隱射數據、后臺造成手機耗電等等問題,傳統Linux IPC無任何保護措施,完全由上層協議來確保。

Android為每個安裝好的應用程序分配了自己的UID,故進程的UID是鑒別進程身份的重要標志,前面提到C/S架構,Android系統中對外只暴露Client端,Client端將任務發送給Server端,Server端會根據權限控制策略,判斷UID/PID是否滿足訪問權限,目前權限控制很多時候是通過彈出權限詢問對話框,讓用戶選擇是否運行。Android 6.0,也稱為Android M,在6.0之前的系統是在App第一次安裝時,會將整個App所涉及的所有權限一次詢問,只要留意看會發現很多App根本用不上通信錄和短信,但在這一次性權限權限時會包含進去,讓用戶拒絕不得,因為拒絕后App無法正常使用,而一旦授權后,應用便可以胡作非為。

針對這個問題,google在Android M做了調整,不再是安裝時一并詢問所有權限,而是在App運行過程中,需要哪個權限再彈框詢問用戶是否給相應的權限,對權限做了更細地控制,讓用戶有了更多的可控性,但同時也帶來了另一個用戶詬病的地方,那也就是權限詢問的彈框的次數大幅度增多。對于Android M平臺上,有些App開發者可能會寫出讓手機異常頻繁彈框的App,企圖直到用戶授權為止,這對用戶來說是不能忍的,用戶最后吐槽的可不光是App,還有Android系統以及手機廠商,有些用戶可能就跳果粉了,這還需要廣大Android開發者以及手機廠商共同努力,共同打造安全與體驗俱佳的Android手機。

Android中權限控制策略有SELinux等多方面手段,下面列舉從Binder的一個角度的權限控制:
Android源碼的Binder權限是如何控制? -Gityuan的回答

傳統IPC只能由用戶在數據包里填入UID/PID;另外,可靠的身份標記只有由IPC機制本身在內核中添加。其次傳統IPC訪問接入點是開放的,無法建立私有通道。從安全角度,Binder的安全性更高。

說到這,可能有人要反駁,Android就算用了Binder架構,而現如今Android手機的各種流氓軟件,不就是干著這種偷窺隱射,后臺偷偷跑流量的事嗎?沒錯,確實存在,但這不能說Binder的安全性不好,因為Android系統仍然是掌握主控權,可以控制這類App的流氓行為,只是對于該采用何種策略來控制,在這方面android的確存在很多有待進步的空間,這也是google以及各大手機廠商一直努力改善的地方之一。在Android 6.0,google對于app的權限問題作為較多的努力,大大收緊的應用權限;另外,在Google舉辦的Android Bootcamp 2016大會中,google也表示在Android 7.0 (也叫Android N)的權限隱私方面會進一步加強加固,比如SELinux,Memory safe language(還在research中)等等,在今年的5月18日至5月20日,google將推出Android N。

(4)從語言層面的角度
大家多知道Linux是基于C語言(面向過程的語言),而Android是基于Java語言(面向對象的語句),而對于Binder恰恰也符合面向對象的思想,將進程間通信轉化為通過對某個Binder對象的引用調用該對象的方法,而其獨特之處在于Binder對象是一個可以跨進程引用的對象,它的實體位于一個進程中,而它的引用卻遍布于系統的各個進程之中。可以從一個進程傳給其它進程,讓大家都能訪問同一Server,就像將一個對象或引用賦值給另一個引用一樣。Binder模糊了進程邊界,淡化了進程間通信過程,整個系統仿佛運行于同一個面向對象的程序之中。從語言層面,Binder更適合基于面向對象語言的Android系統,對于Linux系統可能會有點“水土不服”。

另外,Binder是為Android這類系統而生,而并非Linux社區沒有想到Binder IPC機制的存在,對于Linux社區的廣大開發人員,我還是表示深深佩服,讓世界有了如此精湛而美妙的開源系統。也并非Linux現有的IPC機制不夠好,相反地,經過這么多優秀工程師的不斷打磨,依然非常優秀,每種Linux的IPC機制都有存在的價值,同時在Android系統中也依然采用了大量Linux現有的IPC機制,根據每類IPC的原理特性,因時制宜,不同場景特性往往會采用其下最適宜的。比如在Android OS中的Zygote進程的IPC采用的是Socket(套接字)機制,Android中的Kill Process采用的signal(信號)機制等等。而Binder更多則用在system_server進程與上層App層的IPC交互。

(5) 從公司戰略的角度

總所周知,Linux內核是開源的系統,所開放源代碼許可協議GPL保護,該協議具有“病毒式感染”的能力,怎么理解這句話呢?受GPL保護的Linux Kernel是運行在內核空間,對于上層的任何類庫、服務、應用等運行在用戶空間,一旦進行SysCall(系統調用),調用到底層Kernel,那么也必須遵循GPL協議。

而Android 之父 Andy Rubin對于GPL顯然是不能接受的,為此,Google巧妙地將GPL協議控制在內核空間,將用戶空間的協議采用Apache-2.0協議(允許基于Android的開發商不向社區反饋源碼),同時在GPL協議與Apache-2.0之間的Lib庫中采用BSD證授權方法,有效隔斷了GPL的傳染性,仍有較大爭議,但至少目前緩解Android,讓GPL止步于內核空間,這是Google在GPL Linux下 開源與商業化共存的一個成功典范。

轉載于:https://www.cnblogs.com/anni-qianqian/p/6879353.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/455615.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/455615.shtml
英文地址,請注明出處:http://en.pswp.cn/news/455615.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

matlab 三維核密度圖_Matlab精彩畫圖示例:三維網狀圖和三維曲面圖

接上篇:Matlab精彩畫圖示例:繪制圖上圖這篇介紹兩個繪制三維圖的命令:mesh - 繪制三維網狀圖surf - 繪制三維曲面圖matlab代碼如下:繪制三維圖的matlab代碼示例程序運行結果如下:mesh(X,Y,Z) draws a wireframe mesh w…

Django之templates模板

模板的使用 1.如何使用模板 在manage.py的同級文件夾中創建templates在setting.py的文件中把第58行DIRS: [ ],改成DIRS: [os.path.join(BASE_DIR,templates)], 知識點: os.path.join(BASE_DIR,templates) 拼接兩個字符串 BASE_DIR找到項目根目錄127.0.0.1:8000/myadmin/templ…

STL容器刪除元素的陷阱

今天看Scott Meyers大師的stl的用法&#xff0c;看到了我前段時間犯的一個錯誤&#xff0c;發現我寫的代碼和他提到錯誤代碼幾乎一模一樣&#xff0c;有關stl容器刪除元素的問題&#xff0c;錯誤的代碼如下&#xff1a;std::vector<struct> mFriendList;...std::vector&l…

JDBC1

1.jdbc的概述 是sun公司統一提供的一套接口規范,各個數據庫生產商提供實現 注冊驅動,獲得連接,獲得執行的SQL語句對象,釋放資源 package com.learn.jdbc;import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException;import org.junit.Test;publ…

無符號哥倫布指數編碼

在H264編解碼中&#xff0c;哥倫布指數編碼是經常用到的&#xff0c;下面是無符號哥倫布指數編碼的C代碼&#xff1a; static inline int bs_read_ue( bs_t *s ){ int i 0; while( bs_read1( s ) 0 && s->p < s->p_end && i < 32 ) { …

django后臺多頁面分頁邏輯python代碼

#!/usr/bin/env python # -*- coding:utf-8 -*- # Created by 秋葉夏風# 本模塊的功能:<>def get_page_list(max_page,curr_page,leng):用于生成頁數列表:param max_page:最大頁數:param curr_page:當前頁數:param leng:分頁步長:return:list# max_page 20# curr_page …

python程序怎么保存到u盤_python實現usb自動拷貝程序的方法

python實現usb自動拷貝程序的方法 發布時間&#xff1a;2020-06-28 09:07:05 來源&#xff1a;億速云 閱讀&#xff1a;135 作者&#xff1a;清晨 這篇文章將為大家詳細講解有關python實現usb自動拷貝程序的方法&#xff0c;小編覺得挺實用的&#xff0c;因此分享給大家做個參考…

young people can also be a leader

2019獨角獸企業重金招聘Python工程師標準>>> The leaders or directors of organizations are often older people. But some people say that young people can also be a leader. To what extent do you agree or disagree? In my view , young people can also …

BZOJ 2004 公交線路(狀壓DP+矩陣快速冪)

注意到每個路線相鄰車站的距離不超過K&#xff0c;也就是說我們可以對連續K個車站的狀態進行狀壓。 然后狀壓DP一下&#xff0c;用矩陣快速冪加速運算即可。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <algorithm>#define…

python爬取網易云歌單_詳解python selenium 爬取網易云音樂歌單名

目標網站&#xff1a;首先獲取第一頁的數據&#xff0c;這里關鍵要切換到iframe里打印一下獲取剩下的頁數&#xff0c;這里在點擊下一頁之前需要設置一個延遲&#xff0c;不然會報錯。結果&#xff1a;一共37頁&#xff0c;爬取完畢后關閉瀏覽器 完整代碼&#xff1a; url htt…

Idea的一些調試技巧及設置todo

程序員的工作內容&#xff0c;除了大部分時間寫代碼之外&#xff0c;因為有不少的時間是用在調試代碼上。甚至說不是在調試代碼&#xff0c;就是即將調試代碼。 :) 今天我們來談談調試代碼的一些技巧&#xff0c;在使用IDE提供的debugger時一些快速定位問題的方式。 看到這里的…

安裝Node.js和npm

安裝Node.js和npm 學習了&#xff1a;http://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/00143450141843488beddae2a1044cab5acb5125baf0882000 轉載于:https://www.cnblogs.com/stono/p/6891242.html

c++ cstring 轉換 char_cstring.h庫常用函數

上周&#xff0c;老師講了大整數的運算方法&#xff0c;我對大數的存儲和運算還有些不理解&#xff0c;仔細思考了一下&#xff0c;其實還是訓練孩子對機器存儲數據的各種掌握和運用吧。不多想&#xff0c;先期孩子雖然一直學習&#xff0c;但是缺乏對知識的系統整理&#xff0…

Django后臺管理之商品分類

商品分類 1.建表字段 1.pid&#xff1a;用來綁定父類的 2.path&#xff1a;用來拼接id&#xff0c;保證查詢出的數據是按照層級關系展示的2.concat 把表中的兩個字段拼接成一個新的字段&#xff0c;通過as重新命名3.查詢語句 1.按照第二步拼接成新的字段的名字進行排序查詢…

PMT_Stream數據結構

0123 012345670123456701234567012345671stream_type reserved_1elementary_PIDreserved_2ES_info_length 2ES_info_length …(描述信息)3…(描述信息)4crc32 1 節目號 stream_type 8指示了PID為elementary_PID的PES分組中原始流的類型&#xf…

Maven:基本使用

為什么80%的碼農都做不了架構師&#xff1f;>>> 1.項目管理工具&#xff1a; Maven的repository&#xff0c;說白了就是dependency的倉庫&#xff0c;它按照一定的規則將dependency存放起來&#xff0c;以作緩存&#xff0c;如果本機的 repository找不到某個depen…

UVA 11383 - Golden Tiger Claw(二分圖完美匹配擴展)

UVA 11383 - Golden Tiger Claw 題目鏈接 題意&#xff1a;給定每列和每行的和&#xff0c;給定一個矩陣&#xff0c;要求每一個格子(x, y)的值小于row(i) col(j)&#xff0c;求一種方案&#xff0c;而且全部行列之和的和最小 思路&#xff1a;A二分圖完美匹配的擴展&#xff…

淺談web開發以及django的安裝和入門

淺談web開發 1.B/S和C/S結構 B/S:瀏覽器與服務器進行的交互模式&#xff08;不需要官方下載的&#xff0c;一夫多妻制&#xff09; C/S:客戶機與服務器進項的交互模式&#xff08;必須官方下載的&#xff0c;一夫一妻制2.MVC和MVT MVC: M:模型層&#xff08;Model&#xff0…

大數據可視化html模板開源_大數據時代-可視化數據分析平臺必不可少

公眾號&#xff1a;不安分的猿人一、項目簡介DataGear是一款數據管理與可視化分析平臺&#xff0c;使用Java語言開發&#xff0c;采用瀏覽器/服務器架構&#xff0c;支持多種數據庫&#xff0c; 主要功能包括數據管理、SQL工作臺、數據導入/導出、數據集管理、圖表管理、看板管…

java輸出一些內容到日志文件

在eclipse中新建一個項目&#xff0c;在src下新建一個log4j.properties文件&#xff0c;文件內容為下&#xff1a;log4j.rootLogger debug,stdout,D,Elog4j.appender.E org.apache.log4j.DailyRollingFileAppenderlog4j.appender.E.File E://logs/error.log log4j.appender.E…