安卓14系統應用收不到開機廣播

安卓14系統應用收不到開機廣播 - Wesley’s Blog

前段時間有測試反饋在安卓14 上面某系統應用恢復出廠設置后沒有自啟動,究竟是什么原因呢?
請添加圖片描述

回顧

Android 從3.1開始,會將新安裝并且從未被啟動的應用置為“STOPPED”狀態,或者被force stop的應用,這種狀態下的應用是無法接收到廣播的。但發送方可以通過添加FLAG_INCLUDE_STOPPED_PACKAGES 來豁免,但一般情況下,系統會默認添加FLAG_EXCLUDE_STOPPED_PACKAGES flag。

http://xrefandroid.com/android-16.0.0_r2/s?refs=FLAG_EXCLUDE_STOPPED_PACKAGES&project=frameworks

    /*** If set, this intent will not match any components in packages that* are currently* {@linkplain android.content.pm.ApplicationInfo#FLAG_STOPPED stopped}.* If this is not set, then the default behavior is to include such* applications in the result.*/public static final int FLAG_EXCLUDE_STOPPED_PACKAGES = 0x00000010;/*** If set, this intent will always match any components in packages that* are currently* {@linkplain android.content.pm.ApplicationInfo#FLAG_STOPPED stopped}.* This is the default behavior when* {@link #FLAG_EXCLUDE_STOPPED_PACKAGES} is not set.  If both of these* flags are set, this one wins (it allows overriding of exclude for* places where the framework may automatically set the exclude flag,* such as broadcasts).*/public static final int FLAG_INCLUDE_STOPPED_PACKAGES = 0x00000020;

豁免

IntentResolver.java - OpenGrok cross reference for /frameworks/base/services/core/java/com/android/server/IntentResolver.java

private void buildResolveList(@NonNull Computer computer, Intent intent,FastImmutableArraySet<String> categories, boolean debug, boolean defaultOnly,String resolvedType, String scheme, F[] src, List<R> dest, int userId,long customFlags) { ...........if (excludingStopped && isFilterStopped(computer.getPackageStateInternal(packageName),userId)) {if (debug) {Slog.v(TAG, "  Filter's target is stopped; skipping");}continue;}..................
}

ComponentResolver.java - OpenGrok cross reference for /frameworks/base/services/core/java/com/android/server/pm/resolution/ComponentResolver.java

        @Overrideprotected boolean isFilterStopped(@Nullable PackageStateInternal packageState,@UserIdInt int userId) {if (!mUserManager.exists(userId)) {return true;}if (packageState == null || packageState.getPkg() == null) {return false;}// System apps are never considered stopped for purposes of// filtering, because there may be no way for the user to// actually re-launch them.return !packageState.isSystem()&& packageState.getUserStateOrDefault(userId).isStopped();}

安卓 14 之前的代碼表明系統應用(系統標記為ApplicationInfo.FLAG_SYSTEM 的應用)是可以豁免的。

注意: 直接安裝在 data 分區的 system uid 應用是不會被標記為ApplicationInfo.FLAG_SYSTEM 的。但更新在 data 分區的系統應用依然有效。

安卓 14 的變化

ComponentResolver.java - OpenGrok cross reference for /frameworks/base/services/core/java/com/android/server/pm/resolution/ComponentResolver.java

        @Overrideprotected boolean isFilterStopped(@NonNull Computer computer, F filter,@UserIdInt int userId) {if (!mUserManager.exists(userId)) {return true;}final PackageStateInternal packageState = computer.getPackageStateInternal(filter.first.getPackageName());if (packageState == null || packageState.getPkg() == null) {return false;}return packageState.getUserStateOrDefault(userId).isStopped();}

系統應用不能豁免了,一刀切了。🤣 當然,這里可以打補丁讓原來的修改有效。

安卓 15 峰回路轉

ComponentResolver.java - OpenGrok cross reference for /frameworks/base/services/core/java/com/android/server/pm/resolution/ComponentResolver.java

        @Overrideprotected boolean isFilterStopped(@NonNull Computer computer, F filter,@UserIdInt int userId) {if (!mUserManager.exists(userId)) {return true;}final PackageStateInternal packageState = computer.getPackageStateInternal(filter.first.getPackageName());if (packageState == null || packageState.getPkg() == null) {return false;}if (packageState.isSystem()) {// A system app can be considered in the stopped state only if it was originally// scanned in the stopped state.return packageState.isScannedAsStoppedSystemApp() &&packageState.getUserStateOrDefault(userId).isStopped();}return packageState.getUserStateOrDefault(userId).isStopped();}}

安卓 15 開始,又把系統應用的豁免加回來了,但有了更加精細化的控制。不僅需要滿足是系統應用,同時也要滿足不是被第一次開機標記為停止狀態的系統應用。

isScannedAsStoppedSystemApp() 是用來檢查一個系統應用在系統首次啟動時,是否被自動置于“強制停止”(stopped)狀態。

那么這個狀態是怎么標記的呢?

哪些應用會被標記?

adb可以通過 dumpsys package 包名 | grep isScannedAsStoppedSystemApp來查看

主要看PackageSettingsetScannedAsStoppedSystemApp 的調用關系

?interface?
PackageState
?interface?
PackageStateInternal
SettingBase
PackageSetting

最后確認為掃描系統 apk 時添加了SCAN_AS_STOPPED_SYSTEM_APP 的掃描標志位的應用會標記為停止狀態。

InstallPackageHelper.java - OpenGrok cross reference for /frameworks/base/services/core/java/com/android/server/pm/InstallPackageHelper.java

private Pair<ScanResult, Boolean> scanSystemPackageLI(ParsedPackage parsedPackage,@ParsingPackageUtils.ParseFlags int parseFlags,@PackageManagerService.ScanFlags int scanFlags,@Nullable UserHandle user) throws PackageManagerException { // A new application appeared on /system, and we are seeing it for the first time.// Its also not updated as we don't have a copy of it on /data. So, scan it in a// STOPPED state.// We'll skip this step under the following conditions://   - It's "android"//   - It's an APEX or overlay package since stopped state does not affect them.//   - It is enumerated with a <initial-package-state> tag having the stopped attribute//     set to false//   - It doesn't have an enabled and exported launcher activity, which means the user//     wouldn't have a way to un-stop itfinal boolean isApexPkg = (scanFlags & SCAN_AS_APEX) != 0;if (mPm.mShouldStopSystemPackagesByDefault&& scanSystemPartition&& !pkgAlreadyExists&& !isApexPkg&& !parsedPackage.isOverlayIsStatic()) {String packageName = parsedPackage.getPackageName();if (!"android".contentEquals(packageName)&& !mPm.mInitialNonStoppedSystemPackages.contains(packageName)&& hasLauncherEntry(parsedPackage)) {scanFlags |= SCAN_AS_STOPPED_SYSTEM_APP;}}
}

根據函數的注釋,一個應用會被標記為“停止的系統應用”(Scanned As Stopped System App)需要滿足以下所有條件

  1. 是系統應用:即系統標記為ApplicationInfo.FLAG_SYSTEM 的應用。

  2. 在core/res/res/values/config.xml 配置config_stopSystemPackagesByDefault為 true,默認啟用。

        <!-- Whether system apps should be scanned in the stopped state during initial boot.Packages can be added by OEMs in an allowlist, to prevent them from being scanned as"stopped" during initial boot of a device, or after an OTA update. Stopped state ofan app is not changed during subsequent reboots.  --><bool name="config_stopSystemPackagesByDefault">true</bool>
    
  3. 應用不存在

  4. 不是 system_server(包名為 android )

  5. 不是 APEX 包和靜態資源覆蓋包(Overlay)

  6. 有啟動入口 (Launcher Entry)。

  7. 沒有在initial-package-stopped-states.xml 配置中被豁免。

initial-package-stopped-states.xml - OpenGrok cross reference for /frameworks/base/data/etc/initial-package-stopped-states.xml

<?xml version="1.0" encoding="utf-8"?>
<!--
This XML defines an allowlist for packages that should not be scanned in a "stopped" state.
When this feature is turned on (indicated by the config config_stopSystemPackagesByDefault in
core/res/res/values/config.xml) packages on the system partition that are encountered by
the PackageManagerService for the first time are scanned in the "stopped" state. This allowlist
is also considered while creating new users on the device. Stopped state is not set during
subsequent reboots.Example usage1. <initial-package-state package="com.example.app" stopped="false"/>Indicates that a system package - com.example.app's initial stopped state should not be setby the Package Manager. By default, system apps are marked as stopped.2. <initial-package-state package="com.example.app" stopped="true"/>Indicates that a system package - com.example.app's initial state should be set by thePackage Manager to "stopped=true". It will have the same effect on thepackage's stopped state even if this package was not included in the allow list.3. <initial-package-state package="com.example.app"/>Invalid usage.
--><config></config>

參考

stop應用無法收到廣播問題_應用未啟動接收廣播-CSDN博客

關于Android中App的停止狀態 - 技術小黑屋

PMS 第 4 篇 - PMS_DATA_SCAN_START 階段 | Coolqi`s Blog

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

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

相關文章

C# Attribute 方法擴展

場景 剛寫完一個干凈利落的方法&#xff0c;比如保存數據到數據庫&#xff0c;邏輯清晰、結構優雅&#xff0c; 第二天&#xff0c;“嘿&#xff0c;保存完數據&#xff0c;記得給客戶發個郵件哦~” 第三天&#xff0c;“能不能再發個消息通知其他系統&#xff1f;” 第四天&am…

【URP】[法線貼圖]為什么主要是藍色的?

【從UnityURP開始探索游戲渲染】專欄-直達 法線貼圖呈現藍紫色調&#xff08;尤其以藍色為主&#xff09;是由其?存儲原理、切線空間坐標系設計及顏色編碼規則共同決定的?。 核心原因&#xff1a;法線向量的存儲規則? ?法線向量的物理范圍? 法線是單位向量&#xff0c;…

驅動開發系列63 - NVIDIA 開源GPU驅動open-gpu-kernel-modules編譯調試

目錄 一:通過apt方式安裝nvidia 驅動 二:通過 .run 方式安裝nvidia驅動 三:編譯安裝nvidia開源內核驅動 四:驗證和調試 五:卸載驅動 1. 以apt方式安裝nvidia 驅動的卸載方法 2. 以.run方式安裝nvidia驅動的卸載方法 六:安裝CUDA環境 一:通過apt方式安裝nvidia 驅動…

對KingbaseES架構的解析:從讀寫分離到異地災備的技術實現與保障機制

聲明&#xff1a;文章為本人真實測評博客&#xff0c;非廣告&#xff0c;并沒有推廣該平臺 &#xff0c;為用戶體驗文章 本人旨在分享最真實的用戶體驗&#xff0c;為關注此類產品的朋友們提供一個客觀的參考。 文章目錄一、架構全景&#xff1a;四級高可用構建數字基礎1.1 物…

Visual Studio中的常用調試功能(上)

1、利用斷點進行調試添加斷點的方式有以下幾種1.鍵盤快捷鍵F92.通過菜單【Debug&#xff08;調試&#xff09;】-》【Toggle BreakPoint&#xff08;切換斷點&#xff09;】3.點擊代碼行左邊的空白處&#xff08;推薦&#xff09;設置斷點后&#xff0c;按F5運行程序&#xff0…

Linux -- 線程同步

1.1條件變量 (1)當?個線程互斥地訪問某個變量時&#xff0c;它可能發現在其它線程改變狀態之前&#xff0c;它什么也做不了。 (2)例如?個線程訪問隊列時&#xff0c;發現隊列為空&#xff0c;它只能等待&#xff0c;只到其它線程將?個節點添加到隊列 中。這種情況就需要?到…

前端進階指南:JavaScript性能優化實戰全解析

深入剖析 JavaScript 性能瓶頸&#xff0c;分享優化技巧與最佳實踐&#xff0c;讓你的前端應用更快、更穩、更流暢。 &#x1f4d1; 目錄 一、前言 二、性能瓶頸的常見來源 三、JavaScript代碼優化技巧 1. 避免重復計算 2. 合理使用防抖與節流 3. 使用事件委托 四、渲染…

RabbitMQ:SpringAMQP Direct Exchange(直連型交換機)

目錄一、案例需求二、基礎配置三、代碼實現直連型交換機也叫做定向交換機&#xff0c;通過RoutingKey綁定交換機與隊列直接的關系。 生產者源碼 消費者源碼 一、案例需求 在RabbitMQ控制臺中&#xff0c;聲明隊列direct.queue1和direct.queue2。在RabbitMQ控制臺中&#xff…

implement libtime on Windows

因為Windows的time命令和Linux的time命令不一樣&#xff0c;嘗試實現libtime libtime.h /** libtime.h - 跨平臺時間測量庫* 功能&#xff1a;執行外部命令并測量其運行時間和資源使用*/#ifndef LIBTIME_H #define LIBTIME_H#include <stdio.h> #include <stdlib.h>…

Unity進階--C#補充知識點--【C#各版本的新功能新語法】C#1~4與C#5

來源于唐老獅的視頻教學&#xff0c;僅作記錄和感悟記錄&#xff0c;方便日后復習或者查找 一.C#版本與Unity的關系 1.各Unity版本支持的C#版本 更多信息可以在Untiy官網說明查看 https://docs.unity3d.com/2020.3/Documentation/Manual/CSharpCompiler.html&#xff08;這個好…

水閘安全綜合監測系統解決方案

一、方案概述 水閘作為重要的水利工程設施&#xff0c;承擔著防洪、排澇、供水和灌溉等關鍵功能。其安全性直接關系到下游人民群眾的生命財產安全以及區域經濟的穩定發展。近年來&#xff0c;隨著極端天氣頻發和工程老化問題日益突出&#xff0c;水閘安全監測工作顯得尤為重要。…

基于單片機智能點滴輸液系統

傳送門 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品題目速選一覽表 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品題目功能速覽 概述 該系統基于單片機控制技術&#xff0c;結合傳感器和無線通信模塊&#xff0c;實現對輸液過程的實…

AI數據倉庫管理提升效率

內容概要在數字化轉型浪潮中&#xff0c;AI數據倉庫管理正重塑企業數據處理格局。本部分簡要介紹其核心機制&#xff0c;即通過智能API接入外部數據源實現多平臺數據無縫整合&#xff0c;隨后應用數據清洗技術去除冗余信息&#xff0c;確保數據質量。同時&#xff0c;加密存儲機…

使用 Docker 安裝長安鏈管理平臺 + 部署區塊鏈與示例合約

文章目錄簡介登錄官網GithubPodman 配置&#xff08;Docker 配置 registry 地址&#xff09;安裝長安鏈管理平臺下載源碼docker-compose.yml登錄管理平臺部署區塊鏈Dockerfile構建鏡像部署長安鏈訂閱區塊鏈部署合約下載示例合約部署示例合約投票管理文件哈希存證查找存證信息區…

Python訓練營打卡 DAY 41 簡單CNN

知識回顧 數據增強卷積神經網絡定義的寫法batch歸一化&#xff1a;調整一個批次的分布&#xff0c;常用與圖像數據特征圖&#xff1a;只有卷積操作輸出的才叫特征圖調度器&#xff1a;直接修改基礎學習率 卷積操作常見流程如下&#xff1a; 1. 輸入 → 卷積層 → Batch歸一化層…

云端賦能,智慧運維:分布式光伏電站一體化監控平臺研究

摘要 本文針對分布式光伏電站存在的監管困難、火災隱患、系統繁雜及運維不規范等行業痛點&#xff0c;提出AcrelCloud-1200光伏運維云平臺解決方案。平臺通過ANet-1E2S-4G網關集成多品牌逆變器數據&#xff0c;結合視頻監控與氣象站&#xff0c;實現電站全域監測&#xff1b;開…

CVPR 2025 | 具身智能 | HOLODECK:一句話召喚3D世界,智能體的“元宇宙練功房”來了

關注gongzhonghao【CVPR頂會精選】1.導讀1.1 論文基本信息論文標題&#xff1a;《HOLODECK: Language Guided Generation of 3D Embodied AI Environments》作者&#xff1a;Yue Yang*1, Fan-Yun Sun*2, Luca Weihs*4, Eli Vanderbilt4, Alvaro Herrasti4,Winson Han4, Jiajun …

迅為RK3568開發板搭建Ubuntu環境

本小節介紹開發所需 Ubuntu 環境的搭建方法。系統要求:Ubuntu 系統要求&#xff1a;Ubuntu18.04~21.10 版本。推薦使用 20.04 版本&#xff0c;內存 16GB 及以上&#xff0c;硬盤 100GB 及以上。Ubuntu 系統的用戶名不能包含中文字符。建議 Ubuntu 和 Windows 系統上安裝的 Dev…

【數據結構】用堆解決TOPK問題

設計一個算法&#xff0c;找出數組中最小的k個數。以任意順序返回這k個數均可。示例&#xff1a;輸入&#xff1a; arr [1,3,5,7,2,4,6,8], k 4 輸出&#xff1a; [1,2,3,4]比較替換堆頂的數時&#xff0c;不需要讓堆頂與數組的每一個數再進行比較&#xff0c;比較數組減去k個…

【深度長文】Anthropic發布Prompt Engineering全新指南

目錄 1.什么時候適合用提示工程? 2.如何進行提示工程 2.1 使用提示模板 2.1.1 使用提示模板和變量 2.1.2 何時使用提示模板和變量 2.1.3 提示模板示例 2.2 保持清晰和直接 2.2.1 如何保持清晰、具有上下文和具體 2.2.2 示例 ?2.3 使用示例&#xff08;多示例提示…