安卓系統基於 Linux 內核是不是就可以它當做一個小型的伺服器了?
我是學生物的,最近稍微有點接觸計算機!
我們操作的linux系統是通過ssh客戶端在自己的window電腦平台下通過一個界面來在linux伺服器敲命令的,這也是我所理解的linux系統。同理,人們總是說安卓是基於linux系統的,那麼是不是也有一種客戶端可以遠處操控手機裡面的所有文件,所有應用,如果有,麻煩告訴我一下,如果沒有,稍微講解一下該怎麼樣實現也行,比如是不是該先把手機全程聯網,固定IP,然後開放該手機安卓的某個埠,設置某個用戶用來遠程登陸,這樣就 可以把安卓手機當成一個伺服器?還有手機的安卓系統可以通過什麼軟體修改一下成為像linux一樣的命令行終端,在上面用vi來編寫perl或者python的代碼,然後運行,這樣可以操作安卓手機裡面的軟體來批量重複性的完成某些事?有內置的perl或python解釋器?
曾經在地鐵上用Android寫lisp玩.
既然題主不是計算機專業的,那就針對題主說說我的經驗:
1. Android是可以當做一個小型伺服器的. 我常用AirDroid來和PC之間copy文件. 這個app就是在Android上啟動一個web server, 然後PC端通過瀏覽器來訪問這個服務.2. Android可以裝一個終端類軟體來使用命令行, 但是由於Android缺少很多你常用的Linux工具. 所以你需要root手機, 然後裝一個busybox. 這個軟體會幫你安裝常用的Linux工具, 比如vi, ssh.3. 開發Python和perl沒有問題, 但現有的開源項目做的不夠好. 我是用complete linux installer裝了一個ubuntu來用. 這個app會指引你如何安裝一些linux發行版. 注意它裝的不是虛擬機, 而是用了chroot之類的機制運行,所以性能沒有損耗. 但是Ubuntu的arm源比較慢, 勉強夠用.4. 最後推薦兩個app. 一個是terminal IDE, 可以看做一個比較全能的終端環境, 無需root, 寫點python, java,c都沒問題. 另一個是AIDE, 這是一個在Android上開發Android應用的應用(新版貌似能寫C++了). 買個大點的平板配個藍牙鍵盤用起來還是比較爽的.貼幾張圖:Terminal IDE是的。理論上是可以的,實際上當然也是可以的,android 手機可以跑起 apache, nginx, mysql, ssh等服務,只要你手機性能足夠強勁,存儲空間足夠大。
不過,實際上很多人並沒有直接接觸到 Linux,而是通過 GNU 接觸到 Linux 的,而很多 Linux 服務程序也都依賴 GNU ,他們真正需要的是 GNU 而非僅僅 Linux 內核,所以需要 GNU 相關的一些軟體來保證更完整的 Linux 體驗。GNU 軟體往往依賴 glibc,android 因為不含 glibc ,直接移植 GNU 軟體並非 100% 奏效。
現有的移植方法包括但不限於以下兩種:
一種是直接基於 android 的 c 庫,他跟 glibc 會有不同,因此某些軟體需要適當的修改代碼才能正常編譯,如果你只需要移植單個軟體,一般會用這種方法。
另外一種是藉助把 glibc 調用翻譯成 android c 庫的橋,這種方法可以兼容所有 gnu 應用。ubuntu 是用的這種方法。
不過無論用何種方法,最終就是個「工作量」的問題。懷著一顆折騰的心,總是能夠實現的,而且實際上已經有人實現。首先覺得題主的問題和問題描述有些不對應,所以只能根據我的理解來說說了。此外如果你是剛剛接觸計算機,並且想了解Android的話,那麼最好還是不要深究這樣的問題,對我下面說的有個整體的概念就好,因為這個問題接觸到了計算機操作系統的發展和系統底層的很多東西,計算機科班的大學生要學四年,在這裡說起來最多也只能講些皮毛。
在講Android之前,我想先說說Linux。什麼是Linux,我覺得很多人都沒有明確其概念。事實上Linux在目前已經變成了一個定義不是很明確的概念,如果我們縮小一下範圍來定義「PC機的Linux操作系統」的話,那麼其應該包含Linux Kernel、Linux編譯工具鏈、Linux系統應用程序和Linux應用。最底層的是Linux Kernel,是系統的內核,是系統最核心的部分,事實上Android系統基於的是Linux Kernel,而不是Linux。在Android體系中,除了Kernel外,上面的工具鏈、系統應用等都是自己的。例如編譯工具鏈是基於Bionic C,而不是libc;系統應用主要基於busybox等等。而Android所謂的應用和PC上Linux操作系統的應用更是截然不同,Android的應用本質是Java應用,只要是Java應用就一定得跑在Java虛擬機上;而PC上Linux操作系統的應用大部分都是C/C++應用,其直接基於libc等系統庫來運行。
Linux內核是一個可定製化非常高的一個內核,其中幾乎任何一個部分都有很高的定製性,最小的可運行的Linux內核甚至只有幾個MB大小。而且Linux內核可以支持多種不同的平台,我認為這是Android最早期使用Linux內核作為其內核最根本的原因。開源是第二個。
因為Android使用的是Linux的內核,所以自然可以在上面擴展出Linux操作系統的系統工具,目前比較通用的是busybox,可以實現幾乎所有的系統常用命令(cat, ps等)。Android中在Linux Kernel之上是init進程,也就是系統的0號進程。事實上來說從init進程開始,Android就已經開始和Linux走不同的道路了,但在這個時候二者本質上還是同質的。init進程作為系統中所有其他進程的父進程存在。Android系統中會在Kernel之上啟動一些必要的進程,你連接到Android系統中所得到的bash就是在這個層面的一個sshd伺服器,該sshd的父進程一般就是init進程。在init進程所有的子進程中最重要的就是一個zygote進程,該進程上面運行的所有內容才能真正算是Android的部分,該進程啟動了HAL層、Java虛擬機(DVM或者ART)。具體的內容如果有興趣的話可以找一些介紹Android系統的書看一下。
回到題主的問題,簡單來說Android手機就是一個連上網的Linux系統+Android平台,當然也就可以通過一些方法來遠程登錄並控制手機。一般來說手機出廠的設置里是不能夠通過網路接入Android的bash的,這主要是安全考慮,所以第一次連到手機里需要使用手機提供商所提供的工具(或者第三方的工具)通過手機的數據口(一般也是充電口)接入。接入之後可以在裡面編譯安裝(有的手機自帶)一個sshd伺服器,一般來說該伺服器啟動後會監聽22號埠,此時就可以ssh Android手機的ip地址來登錄到手機的bash界面了。如果你有了root許可權並且能夠接入sshd的bash,那麼你就擁有了對整個系統的完整控制權,甚至可以執行rm / -rf命令刪除手機中的所有內容(包括內核文件)了。
其實PC的操作系統和手機的操作系統是有非常多共通之處的,所以如果你想深入的理解Android的系統,最好是能夠首先清晰的理解傳統的(也就是PC的)操作系統,並且能夠清晰的指出操作系統每個部分的邊界是什麼(內核、工具鏈、系統工具、應用程序),這樣才能夠去深入理解Android的系統。實話說Android系統我接觸到的最蛋疼的系統之一,我曾經在上面做過一個全系統的東西,從修改內核添加驅動(C語言),到修改HAL介面(C++,JNI),到編寫Android應用(Java),整個過程幾乎穿透了操作系統的方方面面,這個系統就是個龐然大物,幾乎沒有人能夠駕馭其每個細節。
P.S. 我曾經把我的moto defy的介面打開,並在其中編譯了python來運行GoAgent來實現在任何時候都能夠連接代理。同樣的事情也用iphone干過。所以在這個層面手機系統和PC系統沒有質的差別。Android是基於Linux,4.4.2之後Android強制啟動SELinux,會和你傳統使用的linux手感差很多。
同時默認不給root,手工root會引入很多安全性問題。總之,Android is not Linux。
不過Android平板明顯屏幕在逐漸變大,包括聯想,Dell等廠商也退出的基於Android一體機。基於Android的桌面體驗應該不會太遠。到時這些都會有解決方案的吧不意味著什麼,Android和Debian的區別甚至比Debian和Mac OS X還要大。
當Linux指系統內核的時候,Android和Debian都屬於Linux系統,但是Debian、opensuse、Ubuntu等桌面版通常稱為GNU/Linux,除了Linux內核外,glibc才是構建這個系統的靈魂,而Android是構建在bonic上面的,所以除非用模擬器或者重新編寫代碼,兩個系統上的軟體完全無法互用。
QT、C#等都在Android上做了移動端的移植,但是原生Android是不帶這些移植庫的,所以基於QT的K系列軟體、基於GTK的G系列軟體都無法原生運行在Android上。chromebook倒是純正的GNU/Linux,今年I/O大會上也演示了在上面運行Android原生應用,但這也需要把Android相應的庫先移植進去,其他Linux發行版一樣沒辦法用。題主想的很對
有個app名字叫complete linux installer可以在root過的安卓上裝debian和ubuntu
推薦使用。有人詢問,補充一下圖中鍵盤名為hacker"s keyboard各大市場有下只要有軟體,什麼系統都可以當伺服器。路由器的OS是vxworks,裡面不照樣跑web server?
iPhone剛宣布的時候我和同事就商量著改造成伺服器來著,因為省電
busybox+terminal
你還想要什麼命令行工具,busybox沒有的話,自己用NDK編譯然後copy上去就成。不過前提是要root,不然好像複製上去的文件給不了執行許可權。比如php不過手機上打字寫代碼很蛋疼就是了Android是linux-based意味著很多已經port到linux的程序可以運行在Android上,當然前提是你能安裝這些程序(需要root掉Android系統,以Linux的用詞描述就是利用本地提權漏洞從普通用戶提權到root用戶),而且已經有好心人針對Android平台編譯好二進位包。
當然受限於Android的性能(或者說純粹是因為偷懶?),很多時候你想要的東西只有精簡殘缺版可用。
比如說,你需要遠程ssh連接到Android里,可能只能安裝dropbear這個ssh server,而不是常見的openssh server。你需要一個shell,可能只有busybox提供的sh,而不是GNU bash或者zsh之類的高級貨。
(你看人家「封閉」的iOS系統,越獄後裝個python、bash、openssh server一點問題都沒有的,各位說Android可玩性高的同學你們怎麼看?)和shell沒什麼關係.雖然android也有個簡單的shell.android內核是linux.那他本質就是linux.為什麼?
因為他的程序都運行在linux提供的虛擬環境中.內存,進程,線程,ipc都要通過linux支持.
顯示,聲音,網路.都要linux驅動.tcpip 4層模型的前3層.文件系統.按鈕,觸摸.重力感應.現在都是linux打理.然後反饋給上層系統調用.android只是在這一層之上做了封裝.有很多程序庫.有他的運行時和服務進程+java虛擬機而已.linux(包括android)一般的gui程序閑置的絕大部分時間都是通過select或者poll這樣的介面掛在內核里.等待內核給他通知他才相應的做處理.一般程序載入或者io的時候絕大部分時間都是通過read write mmap和缺頁中斷,各種中斷陷在內核里.等內核忙完他再工作。還有搶佔,調度,io調度各種驅動,許可權管理,安全機制。內核做的事情比應用層雜的多。多的多。除非是有計算密集型系統..一般簡單程序都是內核運行時間大於用戶態程序運行時間.我來回答下題主的問題。既然題主說自己是學生物的,那就不要再去扯什麼linux內核的事情了,解惑就好。安卓手機可以當做題主ssh登錄到的那種linux伺服器,甚至如果只是在windows通過ssh登錄的話,你基本感受不到它們的區別,當然前提是你要給你的安卓裝一些軟體,手機已經root,配置最好不要太渣(&>1G RAM, &>4G ROM)。
比如:你想把安卓當做伺服器,那麼去搜這個東西almp;
你想讓安卓能ssh進去,那麼去搜SSHDorid(當然還有其他軟體,只不過我在用這個,不要誤判為軟廣告。。。);你想在安卓使用linux的那些命令,那麼可能要裝個busybox;你想用安卓的編寫,運行perl,python,那麼還有其他軟體(這個我沒有用過,自己搜吧);甚至還可以在你的手機上裝個VNC Server,然後在你的pc上用vnc登錄進去,這樣你就可以用鍵盤滑鼠操作你的手機了。最後,再給提一個私人的建議,如果你只是想讓你的安卓機自動運行執行一些操作或者批量處理文件,可以試試這個叫tasker的軟體,不涉及編寫程序,但是可以預先設定要執行的操作,相當於小腳本的作用。
以上,想起來再補充。adb
具體說是基於linux的內核(kernel),也就是CPU處理序列, 內存管理,IO管理等等(安卓加了binder,用於進程之間的通信)。你說到的其他的都不屬於內核的範圍,安卓有自己的一套東西。
比起原本就是偏重桌面系統個人使用為出發點進行設計的Windows和MAC OS來說,Linux較為適用於用作伺服器用途。然而正如Windows也有伺服器版本,Linux同樣有針對桌面和個人使用的任務調度演算法等一系列優化,使得不同編譯,不同的發行版,可以有著不同的特性。
所以Linux內核等於適用於伺服器這個基本的概念存在偏差。Android看作是一種基於Linux的個人移動終端系統即可。可做伺服器但不擅長做伺服器。Root後用linux deploy,基本零配置,只要網速好,可以半個小時裝ArchLinux神馬的
要改一點配置,移動設備會不斷休眠
lz說的「伺服器」範圍很廣啊,其實我就監聽一個埠,accept一下,就成了telnet伺服器;再做個回顯的功能,不用100行代碼,就成了echo伺服器;之後再實現一下USER、PWD、PUT、GET指令,不用1000行代碼,就成了ftp伺服器。至於工具,你用安卓sdk也行,上面裝gcc直接編譯也行。自己玩玩吧,呵呵。
Google提供給開發者用的工具adb - Android Debug Bridge工具可以在一定程度上達到題主想要的目的。
http://developer.android.com/tools/help/adb.html我正在用adb遠程控制和調試Automotive Android設備。如果希望編譯自己程序的話,請交叉編譯。當然你能把編譯器解釋器移植到Android設備端也可以。比如執行以下命令就可以像使用shell一樣操控設備:adb shelladb一般需要用USB線把設備和主機連接起來才能使用。不過總會有通過Internet遠程登錄設備的方法。更多工具請google。- ADB over Network https://play.google.com/store/apps/details?id=net.wiagames.adbon
- SSHDroid https://play.google.com/store/apps/details?id=berserker.android.apps.sshdroid
理論上是可以的,不過在實際的使用過程中你會發現各種第三方工具包的版本依賴問題會導致你的上層工具:命令行、編輯器等等 根 本 跑 不 起 來,happy hacking。
推薦閱讀:
※如何評價諾基亞新機 Nokia 7?
※三星電子為何預計 2017 年 Q2 的營業利潤會達到創紀錄的 121 億美元?
※如何讓 iPhone 6 Plus 的主屏幕界面更美觀?
※你是否看好樂視手機和360手機?
※Windows Phone/Windows 10 Mobile 有哪些好?