RK3576開(kāi)發(fā)板Android 14系統(tǒng)工業(yè)級(jí)APP保活機(jī)制設(shè)計(jì)與實(shí)現(xiàn)

原創(chuàng) 作者 forlinx 2026-03-17 10:17:00 RK3576開(kāi)發(fā)板

作者簡(jiǎn)介

燕南無(wú)聲,擁有十二年嵌入式開(kāi)發(fā)經(jīng)驗(yàn),深耕ARM架構(gòu)嵌入式平臺(tái)開(kāi)發(fā)領(lǐng)域,專注于系統(tǒng)底層服務(wù)定制、硬件與系統(tǒng)適配優(yōu)化,經(jīng)手多款RK系列芯片平臺(tái)的嵌入式應(yīng)用開(kāi)發(fā)與問(wèn)題調(diào)試,擅長(zhǎng)解決工業(yè)級(jí)嵌入式場(chǎng)景下的系統(tǒng)與應(yīng)用適配難題。

RK3576 Android 14 進(jìn)程保活 工業(yè)級(jí)應(yīng)用 系統(tǒng)服務(wù)定制

一、行業(yè)需求與開(kāi)發(fā)痛點(diǎn)

ARM平臺(tái)Android系統(tǒng)的應(yīng)用層開(kāi)發(fā)工作中,進(jìn)程?;钜恢笔呛诵男枨?,尤其是在工業(yè)級(jí)嵌入式場(chǎng)景里,后臺(tái)應(yīng)用的持續(xù)穩(wěn)定運(yùn)行直接關(guān)系到設(shè)備監(jiān)控、數(shù)據(jù)采集等核心業(yè)務(wù)的正常開(kāi)展。近期,筆者基于飛凌嵌入式RK3576開(kāi)發(fā)板進(jìn)行Android 14系統(tǒng)應(yīng)用開(kāi)發(fā)時(shí),遇到了工業(yè)監(jiān)測(cè)類APP后臺(tái)運(yùn)行易被系統(tǒng)清理的問(wèn)題:

系統(tǒng)級(jí)清理機(jī)制

OOM Killer、Low Memory Killer會(huì)主動(dòng)清理后臺(tái)進(jìn)程,系統(tǒng)根據(jù)內(nèi)存占用情況自動(dòng)清理低優(yōu)先級(jí)進(jìn)程。

用戶操作觸發(fā)終止

息屏、進(jìn)程凍結(jié)、手動(dòng)滑出應(yīng)用界面或通過(guò)shell終端執(zhí)行kill命令等操作會(huì)直接終止進(jìn)程。

原生系統(tǒng)缺陷

系統(tǒng)本身無(wú)原生拉活機(jī)制,進(jìn)程被終止后無(wú)法自動(dòng)恢復(fù)運(yùn)行。

業(yè)務(wù)影響嚴(yán)重

造成數(shù)據(jù)采集中斷、設(shè)備監(jiān)控失效,嚴(yán)重影響整套工業(yè)系統(tǒng)的穩(wěn)定性。

因此亟需開(kāi)發(fā)一套針對(duì)性的進(jìn)程?;钆c自動(dòng)拉活解決方案,確保核心業(yè)務(wù)進(jìn)程在工業(yè)場(chǎng)景下的持續(xù)穩(wěn)定運(yùn)行。

二、系統(tǒng)特性與核心解決思路

結(jié)合RK3576開(kāi)發(fā)板Android 14系統(tǒng)的特性分析,該系統(tǒng)延續(xù)了Android系統(tǒng)對(duì)后臺(tái)進(jìn)程的嚴(yán)格管理策略,會(huì)根據(jù)系統(tǒng)內(nèi)存占用情況主動(dòng)清理低優(yōu)先級(jí)后臺(tái)進(jìn)程,同時(shí)支持進(jìn)程凍結(jié)、強(qiáng)制停止等系統(tǒng)級(jí)操作。原生系統(tǒng)中,既沒(méi)有針對(duì)特定進(jìn)程的保活保護(hù)機(jī)制,也缺乏進(jìn)程被終止后的自動(dòng)拉活邏輯,無(wú)法滿足工業(yè)場(chǎng)景對(duì)后臺(tái)應(yīng)用的穩(wěn)定性要求。

核心解決思路:通過(guò)定制系統(tǒng)服務(wù)劃定需要?;畹倪M(jìn)程白名單,讓白名單內(nèi)的進(jìn)程突破系統(tǒng)內(nèi)存管理、進(jìn)程凍結(jié)等限制;同時(shí)開(kāi)發(fā)獨(dú)立的監(jiān)控線程,實(shí)時(shí)檢測(cè)白名單進(jìn)程的運(yùn)行狀態(tài),在進(jìn)程被手動(dòng)或系統(tǒng)終止后完成自動(dòng)拉活。

三、方案開(kāi)發(fā)基礎(chǔ)與整體框架

在實(shí)際開(kāi)發(fā)過(guò)程中,筆者發(fā)現(xiàn)飛凌嵌入式RK3576開(kāi)發(fā)板提供的Android 14系統(tǒng)源碼中,已預(yù)留并實(shí)現(xiàn)了一套基礎(chǔ)的"白名單"?;詈诵倪壿?,有效省去了底層適配的繁瑣工作?;谶@一現(xiàn)有基礎(chǔ),筆者進(jìn)一步完善并落地了完整的APP?;罘桨浮?

瑞芯微RK3576開(kāi)發(fā)板圖示
飛凌嵌入式RK3576開(kāi)發(fā)板

方案的核心載體為白名單系統(tǒng)服務(wù) WhiteAppProcessListManagerService,該服務(wù)的具體路徑為:

frameworks/base/services/core/java/com/android/server/whiteappprocesslist/WhiteAppProcessListManagerService.java

整個(gè)?;罘桨高壿嬊逦?、可落地性強(qiáng),主要分為以下三個(gè)核心步驟:

1

白名單控制接口開(kāi)發(fā)

封裝白名單的獲取與添加功能,實(shí)現(xiàn)進(jìn)程保護(hù)范圍的管理

2

監(jiān)控服務(wù)開(kāi)發(fā)

開(kāi)發(fā)獨(dú)立監(jiān)控線程,實(shí)時(shí)檢測(cè)白名單進(jìn)程狀態(tài)并實(shí)現(xiàn)自動(dòng)拉活

3

配套測(cè)試驗(yàn)證

開(kāi)發(fā)測(cè)試APP并完成全場(chǎng)景驗(yàn)證,確保?;顧C(jī)制穩(wěn)定可靠

四、白名單管理接口開(kāi)發(fā)與初始化配置

WhiteAppProcessListManagerService作為管理白名單的系統(tǒng)服務(wù),封裝了兩個(gè)核心對(duì)外接口,分別實(shí)現(xiàn)白名單的獲取與添加功能:

4.1 核心接口實(shí)現(xiàn)

// 獲取白名單進(jìn)程列表接口
@Override
public @Nullable List<String> getWhiteAppProcessList() {
    try{
        // 調(diào)用ActivityManagerService的對(duì)應(yīng)方法獲取白名單
        return mActivityManagerService.getWhiteAppProcessList();
    }catch(Exception e){
        e.printStackTrace();
        return null;
    }
}
// 向白名單添加進(jìn)程名接口
@Override
public void setWhiteAppProcessList(@Nullable String whiteAppProcess){
    try{
        // 調(diào)用ActivityManagerService的對(duì)應(yīng)方法設(shè)置白名單
        mActivityManagerService.setWhiteAppProcessList(whiteAppProcess);
    }catch(Exception e){
        e.printStackTrace();
    }
}

4.2 服務(wù)初始化配置

在該服務(wù)的構(gòu)造函數(shù)中,飛凌嵌入式RK3576開(kāi)發(fā)板已預(yù)置com.forlinx.logtest測(cè)試應(yīng)用,并將該測(cè)試APP添加至白名單,作為?;顧C(jī)制的驗(yàn)證載體;與此同時(shí)啟動(dòng)監(jiān)控線程,確保?;钕嚓P(guān)邏輯能夠正常觸發(fā):

public WhiteAppProcessListManagerService(Context context, ActivityManagerService activitymanagerservice) {
    mContext= context;
    mActivityManagerService = activitymanagerservice;
    // 將測(cè)試APP加入白名單,包名無(wú)多余空格
    mActivityManagerService.setWhiteAppProcessList("com.forlinx.logtest");
    // 獲取白名單并打印日志,用于調(diào)試驗(yàn)證
    List<String> list = mActivityManagerService.getWhiteAppProcessList();
    for (int i=0;i<list.size();i++){
        Log.d(TAG,"white app process list["+i+"]-"+list.get(i));
    }
    // 啟動(dòng)白名單監(jiān)控線程,開(kāi)始進(jìn)程狀態(tài)檢測(cè)
    Thread thread = new Thread(new WhiteListMonitor(mContext,this));
    thread.start();
}

注:白名單監(jiān)控服務(wù)為系統(tǒng)級(jí)服務(wù),隨系統(tǒng)開(kāi)機(jī)自啟并獨(dú)立運(yùn)行,無(wú)需依賴測(cè)試APP啟動(dòng);僅白名單內(nèi)的進(jìn)程需手動(dòng)首次啟動(dòng)后,監(jiān)控服務(wù)才會(huì)對(duì)其進(jìn)行持續(xù)的狀態(tài)檢測(cè)。

五、白名單進(jìn)程監(jiān)控與自動(dòng)拉活服務(wù)開(kāi)發(fā)

監(jiān)控服務(wù)與framework層白名單機(jī)制分工明確:

  • Framework層白名單機(jī)制:已在framework層進(jìn)程管理模塊完成適配,可讓白名單內(nèi)進(jìn)程突破OOM Killer、Low Memory Killer、Freeze(進(jìn)程凍結(jié))、安卓設(shè)置APP強(qiáng)制停止按鈕等系統(tǒng)級(jí)的進(jìn)程清理與凍結(jié)限制
  • 監(jiān)控服務(wù):作為獨(dú)立線程,重點(diǎn)處理應(yīng)用界面滑出(關(guān)閉)、shell終端執(zhí)行kill命令等手動(dòng)方式終止進(jìn)程的場(chǎng)景

5.1 監(jiān)控線程核心邏輯

監(jiān)控服務(wù)通過(guò)1秒間隔實(shí)時(shí)遍歷檢測(cè),當(dāng)白名單進(jìn)程狀態(tài)異常時(shí)自動(dòng)拉活并切至后臺(tái):

@Override
public void run(){
    while(true){
        try{
            // 獲取系統(tǒng)所有進(jìn)程信息
            List<ActivityManager.RunningAppProcessInfo> processes = getRunningAppProcesses();
            for (ActivityManager.RunningAppProcessInfo process : processes){
                // 打印進(jìn)程基礎(chǔ)信息,用于調(diào)試
                Log.d(TAG,"Process:"+process.processName+",PID:"+process.pid+",state:"+process.processStateToString(process.processState)+","+process.processState);
                // 檢測(cè)是否為白名單進(jìn)程且狀態(tài)≥緩存空狀態(tài)
                if (mWhiteProcessList.contains(process.processName) && process.processState >= ActivityManager.PROCESS_STATE_CACHED_EMPTY){
                    // 根據(jù)進(jìn)程名構(gòu)建啟動(dòng)Intent
                    Intent intent = getLaunchIntentForPackage(process.processName);
                    if (intent != null){
                        Log.d(TAG,"restart"+process.processName);
                        // 添加標(biāo)志位,避免創(chuàng)建新任務(wù)棧
                        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        // 攜帶啟動(dòng)模式標(biāo)識(shí),標(biāo)記為后臺(tái)拉活
                        intent.putExtra("StartMode","Background");
                        // 啟動(dòng)進(jìn)程,完成自動(dòng)拉活
                        mContext.startActivity(intent);
                        // 拉活后模擬HOME鍵,將應(yīng)用切至后臺(tái)運(yùn)行
                        Instrumentation instrumentation = new Instrumentation();
                        instrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_HOME);
                    }
                }
            }
            // 線程休眠1s,循環(huán)檢測(cè)進(jìn)程狀態(tài),確保拉活及時(shí)性
            Thread.sleep(1000);
        } catch(Exception e){
            Log.d(TAG,"restart process fail");
            e.printStackTrace();
        }
    }
}

該監(jiān)控線程能在白名單進(jìn)程出現(xiàn)異常狀態(tài)后快速識(shí)別并完成拉活,其中Intent參數(shù)的傳遞,為應(yīng)用區(qū)分啟動(dòng)方式、執(zhí)行后臺(tái)運(yùn)行邏輯提供了關(guān)鍵依據(jù);拉活后切至后臺(tái)的操作,保障了工業(yè)場(chǎng)景中應(yīng)用后臺(tái)運(yùn)行的隱蔽性與穩(wěn)定性。

六、測(cè)試APP適配開(kāi)發(fā)與全場(chǎng)景驗(yàn)證

為驗(yàn)證?;顧C(jī)制的有效性與穩(wěn)定性,本次測(cè)試基于com.forlinx.logtest測(cè)試APP開(kāi)展適配開(kāi)發(fā)與全場(chǎng)景驗(yàn)證工作。該APP完成了啟動(dòng)模式判斷、后臺(tái)運(yùn)行邏輯的開(kāi)發(fā),且自帶測(cè)試線程。

6.1 啟動(dòng)方式識(shí)別邏輯開(kāi)發(fā)

測(cè)試APP在onCreate函數(shù)中會(huì)接收監(jiān)控服務(wù)傳遞的StartMode消息,通過(guò)判斷消息內(nèi)容是否為Background,精準(zhǔn)識(shí)別應(yīng)用的啟動(dòng)方式是監(jiān)控服務(wù)拉活還是用戶手動(dòng)觸發(fā):

// 判斷應(yīng)用是否為后臺(tái)拉活啟動(dòng)
private boolean isAppIsInBackground() {
    boolean isInBackground = false;
    String StartMode = getIntent().getStringExtra("StartMode");
    if(StartMode != null && StartMode.equals("Background")) {
        isInBackground = true;
    }
    return isInBackground;
}
@Override
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // 根據(jù)啟動(dòng)方式執(zhí)行對(duì)應(yīng)邏輯
    if(isAppIsInBackground()){
        Log.d(TAG,"后臺(tái)啟動(dòng)");
        moveTaskToBack(true);
    }else{
        Log.d(TAG,"用戶觸發(fā)啟動(dòng)");
    }
}

6.2 后臺(tái)運(yùn)行驗(yàn)證線程開(kāi)發(fā)

測(cè)試APP自帶一個(gè)測(cè)試線程,該線程以1秒為間隔打印累加數(shù)字,開(kāi)發(fā)人員可通過(guò)logcat日志實(shí)時(shí)查看數(shù)字變化,清晰、直觀地確認(rèn)APP是否在后臺(tái)持續(xù)穩(wěn)定運(yùn)行:

new Thread(() -> {
    long num = 0;
    while (true) {
        num++;
        Log.d(TAG, "logtest count " + num);
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}).start();

6.3 全場(chǎng)景驗(yàn)證結(jié)果

完成上述適配開(kāi)發(fā)后,筆者在飛凌嵌入式OK3576-C Android 14平臺(tái)開(kāi)展了全場(chǎng)景驗(yàn)證工作:?jiǎn)?dòng)com.forlinx.logtest測(cè)試APP后,分別執(zhí)行息屏、手動(dòng)滑出應(yīng)用界面、通過(guò)shell終端執(zhí)行kill命令、系統(tǒng)低內(nèi)存觸發(fā)OOM Killer等操作,通過(guò)logcat日志觀察發(fā)現(xiàn):

?
進(jìn)程被手動(dòng)終止或系統(tǒng)清理后,監(jiān)控服務(wù)能在1秒內(nèi)完成自動(dòng)拉活,拉活后APP自動(dòng)進(jìn)入后臺(tái)運(yùn)行,無(wú)前臺(tái)界面彈出
?
測(cè)試線程的累加數(shù)字持續(xù)打印,無(wú)任何中斷,APP后臺(tái)運(yùn)行狀態(tài)穩(wěn)定
?
白名單內(nèi)的進(jìn)程未被OOM Killer、Low Memory Killer及進(jìn)程凍結(jié)機(jī)制清理,完全突破了系統(tǒng)后臺(tái)進(jìn)程管理的限制

全場(chǎng)景驗(yàn)證結(jié)果表明,本次開(kāi)發(fā)的保活方案能夠滿足工業(yè)級(jí)嵌入式場(chǎng)景對(duì)APP后臺(tái)持續(xù)、穩(wěn)定運(yùn)行的核心需求,?;钆c拉活邏輯有效且可靠。

七、開(kāi)發(fā)反思與場(chǎng)景適配體會(huì)

此次在RK3576飛凌OK3576-C平臺(tái)Android 14系統(tǒng)中實(shí)現(xiàn)APP?;罟δ?,讓筆者對(duì)嵌入式Android平臺(tái)的系統(tǒng)服務(wù)定制有了更深入的理解。嵌入式平臺(tái)與消費(fèi)級(jí)Android設(shè)備存在本質(zhì)區(qū)別:

工業(yè)場(chǎng)景需求

對(duì)后臺(tái)進(jìn)程的穩(wěn)定性、持續(xù)性要求遠(yuǎn)高于消費(fèi)級(jí)場(chǎng)景,核心業(yè)務(wù)不能中斷

原生系統(tǒng)限制

Android進(jìn)程管理機(jī)制以資源優(yōu)化為核心,無(wú)法滿足工業(yè)場(chǎng)景的特殊需求

解決方案核心

通過(guò)底層系統(tǒng)服務(wù)定制開(kāi)發(fā)獨(dú)立的、系統(tǒng)級(jí)的保活監(jiān)控服務(wù)

設(shè)計(jì)優(yōu)勢(shì)

監(jiān)控服務(wù)開(kāi)機(jī)自啟、與應(yīng)用進(jìn)程解耦,保證監(jiān)控邏輯的穩(wěn)定性

八、方案待優(yōu)化點(diǎn)與功能拓展建議

本次實(shí)現(xiàn)的保活方案整體能夠滿足工業(yè)場(chǎng)景的核心需求,但仍存在一處待優(yōu)化點(diǎn): 白名單內(nèi)的進(jìn)程暫未實(shí)現(xiàn)開(kāi)機(jī)自啟,需要開(kāi)發(fā)人員手動(dòng)首次啟動(dòng)測(cè)試APP后,監(jiān)控服務(wù)才會(huì)對(duì)其進(jìn)行狀態(tài)檢測(cè)與拉活。

若要實(shí)現(xiàn)白名單進(jìn)程開(kāi)機(jī)自啟,可在WhiteAppProcessListManagerService的構(gòu)造函數(shù)中,參考監(jiān)控服務(wù)的進(jìn)程啟動(dòng)方式,通過(guò)Intent直接啟動(dòng)白名單內(nèi)的進(jìn)程,實(shí)現(xiàn)"開(kāi)機(jī)即運(yùn)行、異常即拉活"的全流程自動(dòng)化。

拓展建議:若需要通過(guò)應(yīng)用層靈活控制白名單,比如動(dòng)態(tài)添加、刪除?;钸M(jìn)程,可將白名單系統(tǒng)服務(wù)的管理類生成jar接口,對(duì)外提供調(diào)用能力。但從系統(tǒng)穩(wěn)定性角度出發(fā),不建議進(jìn)行此項(xiàng)修改。工業(yè)級(jí)嵌入式設(shè)備對(duì)系統(tǒng)穩(wěn)定性要求極高,白名單的動(dòng)態(tài)修改可能引入進(jìn)程管理混亂、系統(tǒng)資源占用過(guò)高的風(fēng)險(xiǎn)。

九、總結(jié)

嵌入式開(kāi)發(fā)的核心價(jià)值

嵌入式開(kāi)發(fā)的核心,始終是讓系統(tǒng)與硬件精準(zhǔn)適配具體的業(yè)務(wù)場(chǎng)景。本次APP?;罘桨?,本質(zhì)上是結(jié)合工業(yè)場(chǎng)景中"設(shè)備監(jiān)控、數(shù)據(jù)采集需要后臺(tái)進(jìn)程持續(xù)運(yùn)行"的核心需求,對(duì)Android系統(tǒng)的進(jìn)程管理機(jī)制進(jìn)行的一次定制化適配。

在嵌入式開(kāi)發(fā)過(guò)程中,原生系統(tǒng)往往僅提供通用化的功能與機(jī)制,無(wú)法滿足各行業(yè)的個(gè)性化、場(chǎng)景化需求,這就要求開(kāi)發(fā)人員深入理解硬件平臺(tái)與系統(tǒng)底層邏輯,結(jié)合業(yè)務(wù)場(chǎng)景進(jìn)行定制化開(kāi)發(fā),解決實(shí)際業(yè)務(wù)痛點(diǎn)。

咨詢立即獲得專屬報(bào)價(jià)

華北區(qū)負(fù)責(zé)人二維碼

華北區(qū)負(fù)責(zé)人

華東區(qū)負(fù)責(zé)人二維碼

華東區(qū)負(fù)責(zé)人

華南區(qū)負(fù)責(zé)人二維碼

華南區(qū)負(fù)責(zé)人

中西區(qū)負(fù)責(zé)人二維碼

中西區(qū)負(fù)責(zé)人

相關(guān)產(chǎn)品 >

  • FET3568-C核心板

    RK3568性能強(qiáng)而穩(wěn) 國(guó)產(chǎn)芯|飛凌嵌入式RK3568系列核心板,采用瑞芯微國(guó)產(chǎn)高性能AI處理器RK3568設(shè)計(jì)生產(chǎn),RK3568兼具CPU、GPU、NPU、VPU于一身,RK3568 性能、性價(jià)比在同類產(chǎn)品中具有較高優(yōu)勢(shì),RK3568處理器是一款定位中高端的通用型SoC, 飛凌RK3568核心板主要面向工業(yè)互聯(lián)網(wǎng)、HMI、NVR存儲(chǔ)、車載中控、工業(yè)網(wǎng)關(guān)等領(lǐng)域。目前RK3568系列已經(jīng)批量穩(wěn)定出貨

    了解詳情
    FET3568-C核心板
  • FET3576-C核心板

    飛凌嵌入式RK3576核心板集成了強(qiáng)大的處理器和豐富的接口,提供出色的計(jì)算能力和擴(kuò)展性。RK3576核心板以其卓越的性能、低功耗和穩(wěn)定性,成為工業(yè)、AIoT、邊緣計(jì)算、智能移動(dòng)終端等領(lǐng)域的理想選擇。無(wú)論是數(shù)據(jù)處理還是邊緣計(jì)算,RK3576都能為項(xiàng)目提供強(qiáng)大的硬件支持。核心板推薦選擇飛凌嵌入式瑞芯微系列RK3576J業(yè)級(jí)核心板、RK3576高性能核心板。 了解詳情
    FET3576-C核心板
  • FET3562J-C核心板

    RK3562核心板,采用高性能低功耗工業(yè)級(jí)芯片RK3562J設(shè)計(jì),RK3562J是瑞芯微專為工業(yè)自動(dòng)化及消費(fèi)類電子設(shè)備打造的一款高性能、低功耗國(guó)產(chǎn)化應(yīng)用處理器,集成了4個(gè)ARM Cortex-A53高性能核,主頻高達(dá)1.8GHz。RK3562核心板采用3組80Pin板對(duì)板連接器,可插拔式設(shè)計(jì)便于產(chǎn)品的安裝與維護(hù)。 了解詳情
    FET3562J-C核心板
  • FET3506J-S核心板

    RK3506J是一款高性能的三核Cortex-A7應(yīng)用處理器,專為智能工業(yè)應(yīng)用而設(shè)計(jì)。飛凌嵌入式基于RK3506J設(shè)計(jì)的核心板,價(jià)格僅88元,滿載功耗僅0.7W,是一款值得推薦使用的工業(yè)級(jí)國(guó)產(chǎn)核心板,滿足電力、交通、工控等行業(yè)對(duì)國(guó)產(chǎn)化的要求。同時(shí)進(jìn)行了充分的可靠性測(cè)試,確保在工業(yè)環(huán)境的可靠運(yùn)行。


    了解詳情
    FET3506J-S核心板

推薦閱讀 換一批 換一批