編輯:關於Android編程
眾所周知,Linux中所有進程都是由init進程創建並運行起來的。首先Linux加載內核啟動,然後在用戶空間中啟動init進程,之後init進程再依次啟動系統運行的其它進程。在系統啟動完成後,init進程會作為守護進程監視其它進程。若某個監視中的進程終結,進入僵死狀態時,init進程就會釋放進程所占用的系統資源。
在Android平台(以下稱Android)中也存在init進程,除了提供以上常見的功能外,還提供幾種額外的功能。
在本章中,將討論學習Android的init進程的功能,需要讀者具有一定的Linux系統系統編程知識,如果您對Linux編程知識感到陌生,建議事先翻閱相關的書籍進行學習。
與Linux類似,Android內核啟動後,也會在用戶空間啟動init進程,作為第一個用戶級進程。
由上圖內核啟動過程可以看出,Android內核在啟動過程中,依次執行start_kernel()函數、rest_init()函數、kernel_init()函數和run_init_process()函數後,最後啟動init進程。在rest_init()函數中即會創建出一個新進程用於運行init進程,以保證init進程是第一個用戶級進程,其pid為1,在run_init_process()函數執行後,init進程即真正運行起來,代碼3-1是內核內部實現的init進程啟動代碼。
static int __ref kernel_init(void *unused) { ... if (execute_command) { ① ret = run_init_process(execute_command); if (!ret) return 0; panic("Requested init %s failed (error %d).", execute_command, ret); } if (!try_to_run_init_process("/sbin/init") || !try_to_run_init_process("/etc/init") || !try_to_run_init_process("/bin/init") || !try_to_run_init_process("/bin/sh")) return 0; panic("No working init found. Try passing init= option to kernel. " "See Linux Documentation/init.txt for guidance."); }
① kernerl_init()函數獲取注冊在execute_command中的進程文件路徑,調用run_init_process()函數,執行do_execve()系統調用。do_execve()函數執行由參數傳遞過來的路徑下的進程文件。注意,在設置內核啟動選項時,應設置“init=/init”,以便正常運行init進程,因為在編譯完Android後生成的根文件系統中,init進程文件位於系統最頂層目錄中,如下圖所示。
當文件系統的根目錄中不存在init進程文件,或未指定啟動選項“init=”時,內核會到/sbin、/etc、/bin目錄下查找init文件。如果在這些目錄仍未找到init文件,內核會引發Kernel Panic錯誤,終止執行init進程。
若上述kernel_init函數的代碼執行成功,則init進程就正常啟動。Android是個開源系統,代碼都可以下載下來進一步查看,從而更好地把握某些進程的具體動作。從下一節開始,我們將一起分析init進程的源代碼[2],了解Android啟動過程中,init進程都做了哪些事情。
[1]此函數定義在kernel代碼的init/main.c中。
[2]該代碼在kernel源代碼的init目錄下
字符串操作JNI把Java字符串當成引用類型來處理,JNI提供了java字符串與C字符串之間相互轉換的必要函數。因為java字符串對象是不可變的,因此JNI不提供任何修改
最近在玩一個叫“約會吧”的應用,也是在看直播app,默認下載安裝的,安裝點進去看這個應用做的不錯,就留下來了。然後看他們動態詳情頁底部有一個效果:Recyclerview
通訊錄的同步方法歸結起來只有兩類,以PC作為中轉站的數據線同步和以網絡服務器作為中轉站的無線同步,這兩類情況都需要借助數據線或者網絡以及第三方軟件,具有一定
??最新的android studio2.2引入了cmake可以很好地實現ndk的編寫。ffmpeg編譯??進入正題,既然是ffmpeg的移植編譯,那麼就先下載ffmpe