導航:首頁 > 操作系統 > androidfork進程

androidfork進程

發布時間:2025-03-27 07:33:40

1. android開發中跨進程通信有幾種方式

Android進程間通信的幾種方式 定義多進程
第一:Android應用中使用多進程只有一個辦法(用NDK的fork來做除外),就是在AndroidManifest.xml中聲明組件時,用android:process屬性來指定。
不知定process屬性,則默認運行在主進程中,主進程名字為包名。
android:process = package:remote,將運行在package:remote進程中,屬於全局進程,其他具有相同shareUID與簽名的APP可以跑在這個進程中。
android:process = :remote ,將運行在默認包名:remote進程中,而且是APP的私有進程,不允許其他APP的組件來訪問。
第二:多進程引發的問題
靜態成員和單例失效:每個進程保持各自的靜態成員和單例,相互獨立。
線程同步機制失效:每個進程有自己的線程鎖。
SharedPreferences可靠性下降:不支持並發寫,會出現臟數據。
Application多次創建:不同進程跑在不同虛擬機,每個虛擬機啟動會創建自己的Application,自定義Application時生命周期會混亂。
綜上,不同進程擁有各自獨立的虛擬機,Application,內存空間,由此引發一系列問題。
第三: 進程間通信
Bundle/Intent傳遞數據:
可傳遞基本類型,String,實現了Serializable或Parcellable介面的數據結構。Serializable是java的序列化方法,Parcellable是Android的序列化方法,前者代碼量少(僅一句),但I/O開銷較大,一般用於輸出到磁碟或網卡;後者實現代碼多,效率高,一般用戶內存間序列化和反序列化傳輸。
文件共享:
對同一個文件先後寫讀,從而實現傳輸,Linux機制下,可以對文件並發寫,所以要注意同步。順便一提,Windows下不支持並發讀或寫。
Messenger:
Messenger是基於AIDL實現的,服務端(被動方)提供一個Service來處理客戶端(主動方)連接,維護一個Handler來創建Messenger,在onBind時返回Messenger的binder。
雙方用Messenger來發送數據,用Handler來處理數據。Messenger處理數據依靠Handler,所以是串列的,也就是說,Handler接到多個message時,就要排隊依次處理。
AIDL:
AIDL通過定義服務端暴露的介面,以提供給客戶端來調用,AIDL使伺服器可以並行處理,而Messenger封裝了AIDL之後只能串列運行,所以Messenger一般用作消息傳遞。
通過編寫aidl文件來設計想要暴露的介面,編譯後會自動生成響應的java文件,伺服器將介面的具體實現寫在Stub中,用iBinder對象傳遞給客戶端,客戶端bindService的時候,用asInterface的形式將iBinder還原成介面,再調用其中的方法。
ContentProvider:
系統四大組件之一,底層也是Binder實現,主要用來為其他APP提供數據,可以說天生就是為進程通信而生的。自己實現一個ContentProvider需要實現6個方法,其中onCreate是主線程中回調的,其他方法是運行在Binder之中的。自定義的ContentProvider注冊時要提供authorities屬性,應用需要訪問的時候將屬性包裝成Uri.parse("content://authorities")。還可以設置permission,readPermission,writePermission來設置許可權。 ContentProvider有query,delete,insert等方法,看起來貌似是一個資料庫管理類,但其實可以用文件,內存數據等等一切來充當數據源,query返回的是一個Cursor,可以自定義繼承AbstractCursor的類來實現。
Socket:
學過計算機網路的對Socket不陌生,所以不需要詳細講述。只需要注意,Android不允許在主線程中請求網路,而且請求網路必須要注意聲明相應的permission。然後,在伺服器中定義ServerSocket來監聽埠,客戶端使用Socket來請求埠,連通後就可以進行通信。

2. androidontrimmemory方法的一些疑惑

在Android開發中,理解進程與組件之間的關系至關重要。當應用啟動時,系統會創建一個進程,如包名為 com.performance.liferecord 的應用,其進程信息顯示為 PID 32452,由 zygote64 進程 fork 而來。應用內常見的四大組件包括 Activity、Service、Broadcast 和 ContentProvider,這些組件均依附於進程運行,一個進程可以包含多個組件。

當應用進程進入後台狀態,會進入被緩存的階段,進程依然存在,但組件狀態不一定。進程是否進入緩存狀態取決於用戶行為,如按 Back 鍵返回桌面。此時應用進程位於後台的 LRU 列表中,處於緩存狀態。

使用 adb shell mpsys meminfo 查看進程狀態時,後台進程顯示為 Cached 狀態,意味著進程佔用內存但不佔用 CPU 資源。進程內存使用量會有所減少,如 20706 kb。將後台進程放到緩存列表中而不是直接關閉,可以提升應用熱啟動速度。

了解了進程與組件的關系以及進程狀態後,接下來討論 onTrimMemory 方法。當系統通知應用進程內存壓力較大時,應用可以調用 onTrimMemory 方法進行內存優化。例如,如果緩存中最大的部分是 bitmap,應考慮採用分層緩存策略,即內存、文件和網路緩存。即便內存中的 bitmap 被清除,從文件中讀取 bitmap 依然迅速。onTrimMemory 方法的使用有助於管理應用內存,避免進程因內存不足被系統終止,從而保持應用的穩定運行。

在實際應用開發中,合理利用緩存機制和 onTrimMemory 方法,可以有效提升應用性能和用戶體驗。遵循 Android 開發文檔和社區經驗,持續優化應用內存管理策略,是每個開發者提升應用質量的關鍵。

3. android後台服務保持,不被殺死

作者:閉關寫代碼
鏈接:https://www.hu.com/question/29826231/answer/71207109
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。

強烈建議不要這么做,不僅僅從用戶角度考慮,作為Android開發者也有責任去維護Android的生態環境。現在很多Android開發工程師,主力機居然是iPhone而不是Android設備,感到相當悲哀。
從技術角度概括一下現在普遍的防殺方法

Service設置成START_STICKY,kill 後會被重啟(等待5秒左右),重傳Intent,保持與重啟前一樣
通過 startForeground將進程設置為前台進程,做前台服務,優先順序和前台應用一個級別,除非在系統內存非常缺,否則此進程不會被 kill

雙進程Service:讓2個進程互相保護,其中一個Service被清理後,另外沒被清理的進程可以立即重啟進程
QQ黑科技:在應用退到後台後,另起一個只有 1 像素的頁面停留在桌面上,讓自己保持前台狀態,保護自己不被後台清理工具殺死
在已經root的設備下,修改相應的許可權文件,將App偽裝成系統級的應用(Android4.0系列的一個漏洞,已經確認可行)
Android系統中當前進程(Process)fork出來的子進程,被系統認為是兩個不同的進程。當父進程被殺死的時候,子進程仍然可以存活,並不受影響。鑒於目前提到的在Android-Service層做雙守護都會失敗,我們可以fork出c進程,多進程守護。死循環在那檢查是否還存在,具體的思路如下(Android5.0以下可行)
用C編寫守護進程(即子進程),守護進程做的事情就是循環檢查目標進程是否存在,不存在則啟動它。
在NDK環境中將1中編寫的C代碼編譯打包成可執行文件(BUILD_EXECUTABLE)。
主進程啟動時將守護進程放入私有目錄下,賦予可執行許可權,啟動它即可。
聯系廠商,加入白名單
------------------------------------------------------
TIP: 面對各種流氓軟體後台常駐問題,建議使用「綠色守護」來解決,可是殺掉那些第三方清理工具難以清除的後台程序

4. Android 系統啟動到App 界面完整詳解~

本文詳述了Android系統啟動流程至應用界面的全過程,旨在深入解析該過程中涉及的關鍵組件及其交互機制。我們從簡要概覽系統啟動流程開始,逐步深入至ServiceManager、Zygote、system_server進程的作用,進而分析應用與系統伺服器之間的交互方式,最後探討應用界面展示的實現過程。以下為本文的詳細內容。

### Android 系統啟動流程概覽

在Android系統的上電啟動過程中,關鍵的進程包括init、servicemanager、zygote、system_server等。其中,idle與init之間存在依賴關系,init進程負責啟動servicemanager和配置zygote。

### ServiceManager進程作用

ServiceManager進程是進程間通信的重要環節,它與Binder機制緊密相連,類似於DNS記錄域名與IP的映射關系,存儲著Binder客戶端和服務端之間的映射信息。當App1作為Binder客戶端,App2作為Binder服務端,App2開放介面供App1調用時,ServiceManager扮演了中介角色,協調客戶端與服務端的通信。

### Zygote進程創建與fork子進程

Zygote是所有Java進程的孵化器,由init進程fork產生。其啟動後,從入口文件(app_main.cpp)的入口函數開始執行,等待接收創建進程的請求。在初始狀態,當用戶在桌面上點擊應用圖標,如打開微信,背後涉及的通信方式即為Binder,而system_server則統一管理各個應用的生命周期。

### system_server進程作用

system_server是系統的核心進程之一,負責創建並啟動眾多服務,包括AMS、PMS、WMS等。在應用與system_server的交互中,無論是同一進程內的通信還是不同進程間的通信,都需要system_server的介入。應用如何找到system_server,同樣是通過ServiceManager進程實現的。

### App與system_server的交互

應用想要獲取系統的功能通常繞不過system_server。應用通過ServiceManager從系統服務中獲取所需的服務。相反,system_server如何主動調用應用服務,則通過將應用的Binder引用傳遞給system_server實現。這一機制類似於回調功能。

### Activity與View的展示

在到達應用進程本身後,應用的Application、Activity已經創建完畢。View的展示涉及Activity的onCreate()調用流程,構建ViewTree,並將其添加至Window。最後,通過監聽屏幕刷新信號,遍歷ViewTree進行Measure、Layout、Draw操作,最終實現界面顯示。

### 全流程圖

通過解析上述內容,可以發現Android系統啟動至應用界面的流程包含了眾多Framework底層知識。深入理解這一流程,需要從基礎原理入手。此外,本文提供了《Framework核心知識點匯總手冊》和《Android Framework學習手冊》,其中詳細分析了Handler機制、Binder原理、Zygote、AMS、PMS、WMS等關鍵組件及其實現原理,為深入學習Android框架提供了寶貴資源。

5. 每個Android 都應必須了解的多線程知識點~

進程是系統調度和資源分配的一個獨立單位。

在Android中,一個應用程序就是一個獨立的集成,應用運行在一個獨立的環境中,可以避免其他應用程序/進程的干擾。當我們啟動一個應用程序時,系統就會創建一個進程(該進程是從Zygote中fork出來的,有獨立的ID),接著為這個進程創建一個主線程,然後就可以運行MainActivity了,應用程序的組件默認都是運行在其進程中。開發者可以通過設置應用的組件的運行進程,在清單文件中給組件設置:android:process = "進程名";可以達到讓組件運行在不同進程中的目的。讓組件運行在不同的進程中,既有好處,也有壞處。我們依次的說明下。

好處:每一個應用程序(也就是每一個進程)都會有一個內存預算,所有運行在這個進程中的程序使用的總內存不能超過這個值,讓組件運行不同的進程中,可以讓主進程可以擁有更多的空間資源。當我們的應用程序比較大,需要的內存資源比較多時(也就是用戶會抱怨應用經常出現OutOfMemory時),可以考慮使用多進程。

壞處:每個進程都會有自己的虛擬機實例,因此讓在進程間共享一些數據變得相對困難,需要採用進程間的通信來實現數據的共享。

線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位。

在Android中,線程會有那麼幾種狀態:創建、就緒、運行、阻塞、結束。當應用程序有組件在運行時,UI線程是處於運行狀態的。默認情況下,應用的所有組件的操作都是在UI線程里完成的,包括響應用戶的操作(觸摸,點擊等),組件生命周期方法的調用,UI的更新等。因此如果UI線程處理阻塞狀態時(在線程里做一些耗時的操作,如網路連接等),就會不能響應各種操作,如果阻塞時間達到5秒,就會讓程序處於ANR(application not response)狀態。

1.線程作用

減少程序在並發執行時所付出的時空開銷,提高操作系統的並發性能。

2.線程分類

守護線程、非守護線程(用戶線程)

2.1 守護線程

定義:守護用戶線程的線程,即在程序運行時為其他線程提供一種通用服務
常見:如垃圾回收線程
設置方式:thread.setDaemon(true);//設置該線程為守護線程

2.2 非守護線程(用戶線程)

主線程 & 子線程。

2.2.1 主線程(UI線程)

定義:Android系統在程序啟動時會自動啟動一條主線程
作用:處理四大組件與用戶進行交互的事情(如UI、界面交互相關)
因為用戶隨時會與界面發生交互,因此主線程任何時候都必須保持很高的響應速度,所以主線程不允許進行耗時操作,否則會出現ANR。

2.2.2 子線程(工作線程)

定義:手動創建的線程
作用:耗時的操作(網路請求、I/O操作等)

2.3 守護線程與非守護線程的區別和聯系

區別:虛擬機是否已退出,即
a. 當所有用戶線程結束時,因為沒有守護的必要,所以守護線程也會終止,虛擬機也同樣退出
b. 反過來,只要任何用戶線程還在運行,守護線程就不會終止,虛擬機就不會退出

3.線程優先順序

3.1 表示

線程優先順序分為10個級別,分別用Thread類常量表示。

3.2 設置

通過方法setPriority(int grade)進行優先順序設置,默認線程優先順序是5,即 Thread.NORM_PRIORITY。

4.線程狀態

創建狀態:當用 new 操作符創建一個線程的時候

就緒狀態:調用 start 方法,處於就緒狀態的線程並不一定馬上就會執行 run 方法,還需要等待CPU的調度

運行狀態:CPU 開始調度線程,並開始執行 run 方法

阻塞(掛起)狀態:線程的執行過程中由於一些原因進入阻塞狀態,比如:調用 sleep/wait 方法、嘗試去得到一個鎖等

結束(消亡)狀態:run 方法執行完 或者 執行過程中遇到了一個異常

(1)start()和run()的區別

通過調用Thread類的start()方法來啟動一個線程,這時此線程是處於就緒狀態,並沒有運行。調用Thread類調用run()方法來完成其運行操作的,方法run()稱為線程體,它包含了要執行的這個線程的內容,run()運行結束,此線程終止,然後CPU再調度其它線程。

(2)sleep()、wait()、yield()的區別

sleep()方法屬於Thread類,wait()方法屬於Object類。
調用sleep()方法,線程不會釋放對象鎖,只是暫停執行指定的時間,會自動恢復運行狀態;調用wait()方法,線程會放棄對象鎖,進入等待此對象的等待鎖定池,不調用notify()方法,線程永遠處於就緒(掛起)狀態。

yield()直接由運行狀態跳回就緒狀態,表示退讓線程,讓出CPU,讓CPU調度器重新調度。禮讓可能成功,也可能不成功,也就是說,回到調度器和其他線程進行公平競爭。

1.Android線程的原則

(1)為什麼不能再主線程中做耗時操作
防止ANR, 不能在UI主線程中做耗時的操作,因此我們可以把耗時的操作放在另一個工作線程中去做。操作完成後,再通知UI主線程做出相應的響應。這就需要掌握線程間通信的方式了。 在Android中提供了兩種線程間的通信方式:一種是AsyncTask機制,另一種是Handler機制。

(2)為什麼不能在非UI線程中更新UI 因為Android的UI線程是非線程安全的,應用更新UI,是調用invalidate()方法來實現界面的重繪,而invalidate()方法是非線程安全的,也就是說當我們在非UI線程來更新UI時,可能會有其他的線程或UI線程也在更新UI,這就會導致界面更新的不同步。因此我們不能在非UI主線程中做更新UI的操作。

2.Android實現多線程的幾種方式

3.為何需要多線程

多線程的本質就是非同步處理,直觀一點說就是不要讓用戶感覺到「很卡」。

4.多線程機制的核心是啥

多線程核心機制是Handler

推薦Handler講解視頻: 面試總被問到Handler?帶你從源碼的角度解讀Handler核心機制

根據上方提到的 多進程、多線程、Handler 問題,我整理了一套 Binder與Handler 機制解析的學習文檔,提供給大家進行學習參考,有需要的可以 點擊這里直接獲取!!! 裡面記錄許多Android 相關學習知識點。

閱讀全文

與androidfork進程相關的資料

熱點內容
東北pdf 瀏覽:710
如何檢測伺服器mac地址 瀏覽:364
步科屏幕程序可以加密么 瀏覽:691
兩個pdf文件怎麼合並 瀏覽:847
域名查所在伺服器地址 瀏覽:259
android股票開發 瀏覽:352
行業主流單片機 瀏覽:532
程序員敲代碼必備 瀏覽:278
星火英語四級pdf 瀏覽:935
app代理在哪裡找 瀏覽:188
python的ide哪個好 瀏覽:792
Python二維矩陣數據畫圖 瀏覽:656
掃描儀怎麼掃成pdf 瀏覽:803
羽毛球比賽視頻app哪個好 瀏覽:877
艦長拒絕執行命令被免職 瀏覽:272
零向量的運演算法則 瀏覽:491
中信app指紋登錄怎麼設置 瀏覽:241
百度地圖瓦片演算法 瀏覽:224
物流清單結構周期演算法 瀏覽:1000
熱壓縮海綿枕芯枕頭 瀏覽:551