Android Framework知識點

1 重點知識
1.1 Alarm
當手機重啟或者應用被殺死的時候,Alarm會被刪除,因此,如果想通過Alarm來完成長久定時任務是不可靠的,如果非要完成長久定時任務,可以這樣:將應用的所有Alarm信息存到數據庫中,每次應用啟動的時候都重新注冊Alarm并更新Alarm的觸發時間,通過這種方式就不存在Alarm丟失的情況了。

1.2 Android-N app seinfo設置流程
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
startProcessLocked() {
[…]
Process.ProcessStartResult startResult =
Process.start(entryPoint,
app.processName,
uid, uid, gids,
debugFlags, mountExternal,
app.info.targetSdkVersion,
app.info.seinfo,
requiredAbi, instructionSet,
app.info.dataDir, entryPointArgs);
[…]
}

frameworks/base/core/java/android/os/Process.java
start() {
try {
return startViaZygote(processClass,
niceName,
uid, gid, gids,
debugFlags, mountExternal,
targetSdkVersion, seInfo,
abi, instructionSet,
appDataDir, zygoteArgs);
} catch (ZygoteStartFailedEx ex) {
[…]
}

frameworks/base/core/jni/com_android_internal_os_Zygote.cpp
ForkAndSpecializeCommon() {
[…]
rc = selinux_android_setcontext(
uid, is_system_server,
se_info_c_str, se_name_c_str);
[…]
}

external/libselinux/src/android.c
int selinux_android_setcontext(
uid_t uid,
bool isSystemServer,
const char *seinfo,
const char *pkgname)
{
[…]
}

1.3 Launcher的啟動
/* ActivityThread.java */
SystemServer.java
private void startOtherServices() {
[...]
mActivityManagerService.systemReady(
new Runnable() {
});
}

1.4 屏幕永不超時
frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
frameworks/base/packages/SettingsProvider/res/values/defaults.xml
將def_screen_off_timeout的值改成2147483647(0x7fffffff)。

/data/system/users/0/settings_system.xml
adb shell settings put system screen_off_timeout 3600000 #一小時超時

1.5 禁止鎖屏
frameworks/policies/base/phone/com/android/internal/policy/impl/KeyguardViewMediator.java
將mExternallyEnabled的值改成false。

1.6 tmpfs文件系統
mkdir /data/tmp
mount -t tmpfs -o size=100M tmpfs /data/tmp

1.7 apk signer
apk: private key signer
keystore: 密鑰庫

2 Android異常分析匯總
2.1 Android卡在開機動畫
1)AudioFlinger反復重啟
2)systemui ANR

2.2 framework反復重啟
1)boot_progress|low-level shutdown|am_crash|checkScreenEnabled|ILL_ILLOPN

2.3 no window focus
ViewRootImpl.java
mAttachInfo.mHasWindowFocus = true

Activity中在dispatchKeyEvent()或者dispatchTouchEvent()方法里面,通過反射把mAttachInfo.mHasWindowFocus重置為true,可以解決no window focus。

@Override
public boolean dispatchTouchEvent(@NonNull KeyEvent event) {
try {
ViewParent viewRootImpl =
getWindow().getDecorView().getParent();
Class viewRootImplClass =
viewRootImpl.getClass();

Field mAttachInfoField =
viewRootImplClass.getDeclaredField(
"mAttachInfo");
mAttachInfoField.setAccessible(true);
Object mAttachInfo =
mAttachInfoField.get(viewRootImpl);
Class mAttachInfoClass =
mAttachInfo.getClass();

Field mHasWindowFocusField =
mAttachInfoClass.getDeclaredField(
"mHasWindowFocus");
mHasWindowFocusField.setAccessible(true);
mHasWindowFocusField.set(mAttachInfo,
true);
boolean mHasWindowFocus =
(boolean) mHasWindowFocusField.get(
mAttachInfo);

} catch (Exception e) {
e.printStackTrace();
}

return super.dispatchKeyEvent(event);
}

2.4 dumpsys gfxinfo
使用dumpsys gfxinfo命令可獲取128幀的繪制信息,詳細包括每一幀繪制的Draw、Process、Execute三個過程的耗時,如果這三個時間總和超過16.6ms即認為發生了卡頓。

2.5 Linux disk usage
查看當前目錄下面所有文件夾所占的空間。
du -h -d 1

顯示目錄和目錄下子目錄和文件占用磁盤空間的大小。
du -h /data/data

2.6 提取log
import io
import re
import sys,os
import shutil

arg0_proc_name = ''
def print_usage():
print('\nUsage: python ' + arg0_proc_name +
' <DIR> <file_prefix> <match_string>')
print('refer to the below showcases '
'regarding match_string\n')
list = [
'boot_progress|shutdown',
'boot_progress|low-level shutdown|'
'am_crash',
'boot_progress|shutdown|am_crash|'
'bootinfo',
'checkScreenEnabled|ILL_ILLOPN',
'UIWDT',
]

for item in list:
print(' \"' + item + '\"')
print('')

def remove_dir(dir_path):
if os.path.isdir(dir_path):
for file in os.listdir(dir_path):
if (os.path.isdir(dir_path +
os.path.sep + file)):
remove_dir(dir_path +
os.path.sep + file)
else:
os.remove(dir_path +
os.path.sep + file)
os.removedirs(dir_path)

def write_file_string(file, line_string):
h = open(file, 'a+')
h.writelines(line_string)
h.close()

def write_line_string_to_log(src_file,
dst_file, match_string):
line_cnt = 1
fp = io.open(src_file, 'r', encoding='utf-8',
errors='ignore')
for line_string in fp:
if re.findall(match_string, line_string.lower()):
#if re.findall(match_string, line_string.lower(),
#re.I):
write_file_string(
dst_file, str(line_cnt) + ' ' + line_string)
line_cnt += 1

def find_string(dir_path, file_prefix, match_string):
remove_dir(dir_path + os.path.sep + 'my_out')
os.makedirs(dir_path + os.path.sep + 'my_out')

try:
for file in os.listdir(dir_path):
if (os.path.isfile(dir_path + os.path.sep +
file) and \
file.startswith(file_prefix)):
write_line_string_to_log(dir_path +
os.path.sep + file,
dir_path + os.path.sep +
'my_out' + os.path.sep + file,
match_string)
except KeyboardInterrupt:
print('Got ^C exit signal')

def main():
global arg0_proc_name
arg0_proc_name = sys.argv[0]
if sys.argv[0].rfind(os.path.sep) > 0 :
index = sys.argv[0].rfind(os.path.sep)
arg0_proc_name = sys.argv[0][index+1:]

if len(sys.argv) < 4:
print_usage()
sys.exit(0)

print('to be found: ' + sys.argv[2])
find_string(sys.argv[1], sys.argv[2],
sys.argv[3])

if __name__ == '__main__':
main()

3 USB異步API
development/samples/USB/AdbTest
import static java.lang.Integer.toHexString;
Integer.toHexString(USB_VID)

USB gadget state is not attached

MTP/mass_storage
Maybe the USB cable|idVendor=1d6b|idVendor=12d1|usb disconnect|over-current|nearby|wwan0, isUp is:

1) Choose xxx-Domain, then click Create to create a new page BBB under xxx-Domain.
2) Add Link to xxx-Domain, Edit - copy other line to get prefix format - Insert Link - Search BBB.

4 ART
adb shell oatdump --oat-file=/data/dalvik-cache/xxx/xxx.dex

Linux:
readelf -a xxx.dex

5 Abbreviations
Android PMS LI、LIF、LPw、LPr:要想弄明白方法名中的LI、LIF、LPw、LPr的含義,需要先了解PackageManagerService內部使用的兩個鎖。因為LI、LIF、LPw、LPr中的L,指的是Lock,而后面跟的I和P指的是兩個鎖,I表示mInstallLock同步鎖;P表示mPackages同步鎖。LPw、LPr中的w表示writing,r表示reading。LIF中的F表示Freeze。
ILL_ILLOPN:illegal operand
scanDirLI():scanDir Lock mInstallLock

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

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

相關文章

代碼隨想錄算法訓練營Day6 | 哈希表 Part 1

一、今日學習目標 掌握哈希表的核心理論&#xff08;哈希函數、哈希碰撞及解決方法&#xff09;&#xff0c;理解數組、set、map 三種哈希結構的適用場景&#xff0c;并通過「兩個數組的交集」「快樂數」「兩數之和」三道題目&#xff0c;實戰掌握哈希表在快速查找、去重、鍵值…

5.13.樹、森林與二叉樹的轉換

當使用"孩子兄弟表示法"存儲樹或森林時&#xff0c;最終會呈現出與二叉樹類似的形態&#xff0c;所以樹、森林與二叉樹之間的轉換本質上就是畫出采用孩子兄弟表示法存儲的樹和森林。一."樹->二叉樹"的轉換&#xff1a;1.例一&#xff1a;以上述圖片左邊…

Spring 核心流程

Spring 核心流程前言一、AbstractApplicationContext#refresh 方法解析1.1 前置1.2 refresh 方法1.2.1 prepareRefresh1.2.2 obtainFreshBeanFactory1.2.3 prepareBeanFactory1.2.4 postProcessBeanFactory1.2.5 invokeBeanFactoryPostProcessors1.2.6 registerBeanPostProcess…

RS485轉Profinet網關與JRT激光測距傳感器在S7-1200 PLC系統中的技術解析與應用

RS485轉Profinet網關與JRT激光測距傳感器在S7-1200 PLC系統中的技術解析與應用技術核心&#xff1a;協議轉換與數據橋梁在工業自動化系統中&#xff0c;RS485轉Profinet網關承擔著協議翻譯官的角色。以XD-MDPN100型號為例&#xff0c;其本質是將RS485設備的串口數據封裝為Profi…

《C++ string 完全指南:string的模擬實現》

string的模擬實現 文章目錄string的模擬實現一、淺拷貝和深拷貝1.淺拷貝2.深拷貝3.寫時拷貝二、定義string的成員變量三、string的接口實現1.string的默認成員函數&#xff08;1&#xff09;構造函數實現&#xff08;2&#xff09;析構函數實現&#xff08;3&#xff09;拷貝構…

造成服務器內存不足的原因有什么

服務器在日常的運行過程中&#xff0c;會存儲大量關于企業重要的數據信息&#xff0c;偶爾會出現內存飆升空間不足的情況&#xff0c;服務器內存作為服務器數據處理和存儲的主要空間&#xff0c;異常占用會導致服務器性能降低&#xff0c;影響到企業業務的響應速度&#xff0c;…

JVM、Dalvik、ART垃圾回收機制

一、JVM垃圾回收機制&#xff08;桌面/服務器端&#xff09;1. 核心算法&#xff1a;分代收集新生代回收&#xff08;Minor GC&#xff09;觸發條件&#xff1a;Eden區滿時觸發算法&#xff1a;復制算法&#xff08;Eden → Survivor區&#xff09;過程&#xff1a;存活對象在S…

數學專業轉型數據分析競爭力發展報告

一、核心優勢拆解&#xff08;1&#xff09;數學能力與數據分析對應關系數學課程數據分析應用場景比較優勢說明概率論假設檢驗設計能準確判斷統計顯著性閾值實變函數數據質量評估異常值檢測的嚴格性更高線性代數特征工程構建矩陣運算優化模型訓練效率&#xff08;2&#xff09;…

JAVA進階--MySQL

一.MySQL架構連接層:處理客戶端連接服務,認證授權相關的操作服務層:最核心的一層&#xff08;核心服務功能&#xff09;,處理sql,包括sql優化,函數調用....存儲引擎層:存儲引擎是真正負責來操作數據的&#xff08;mysql中數據的存儲和提取&#xff09;, mysql中有不同存儲引擎,…

【架構】Docker簡單認知構建

作為一個之前從來沒有接觸過Docker的倒霉蛋&#xff0c;想了解學習一下Docker 搜了CSDN和RUNOOB&#xff0c;得到的描述如下&#xff1a; Docker 是一個開源的應用容器引擎&#xff0c;基于 Go 語言 并遵從 Apache2.0 協議開源。 Docker 可以讓開發者打包他們的應用以及依賴包…

C++ std::list概念與使用案例

C std::list 概念詳解 std::list 是 C 標準模板庫&#xff08;STL&#xff09;中的一個雙向鏈表容器。與 vector 和 array 不同&#xff0c;它不保證元素在內存中連續存儲&#xff0c;而是通過指針將各個元素連接起來。 核心特性 雙向鏈表結構&#xff1a; 每個元素包含指向前驅…

從0到1學Pandas(六):Pandas 與數據庫交互

目錄一、數據庫基礎操作1.1 連接數據庫1.2 執行 SQL 查詢1.3 創建與修改表結構二、數據導入導出2.1 從數據庫讀取數據2.2 將數據寫入數據庫2.3 大數據量處理三、數據庫事務處理3.1 事務概念與實現3.2 批量數據更新3.3 錯誤處理與回滾四、數據庫性能優化4.1 查詢性能優化4.2 連接…

GitHub 趨勢日報 (2025年07月26日)

&#x1f4ca; 由 TrendForge 系統生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日報中的項目描述已自動翻譯為中文 &#x1f4c8; 今日獲星趨勢圖 今日獲星趨勢圖602Qwen3-Coder573neko527hrms275BillionMail153Win11Debloat115hyperswitch57data…

機器人仿真(2)Ubuntu24.04下RTX5090配置IsaacSim與IsaacLab

目錄 一、前言二、電腦配置三、配置步驟3.1 創建Conda環境3.2 安裝PyTorch3.3 安裝Isaac Sim3.4 安裝Isaac Lab 四、總結 一、前言 博主自從去年開始就一直在關注Isaac Lab和Isaac Sim&#xff0c;但是一直以來由于手頭設備只有4060&#xff0c;甚至沒有達到最低配置16GB顯存要…

DaVinci Resolve 19.0(達芬奇)軟件安裝包下載及詳細安裝教程|附帶安裝文件

[軟件名稱]&#xff1a;ArcGIS [軟件大小]&#xff1a;2.99 GB [系統要求]&#xff1a;支持Win7及更高版本 [下載通道]: 迅雷網盤 [下載鏈接]:高速下載地址 https://pan.xunlei.com/s/VOW9nw-JV99A_7f_5hhpgqO2A1?pwdbufh# ??:先用手機下載迅雷網盤保存到手機中&#xff0c…

Java學習第八十一部分——Shiro

目錄 &#x1f4eb; 一、前言提要簡介 &#x1f6e1;? 二、核心功能介紹 ?? 三、核心架構組件 ? 四、與Java的關系 ?? 五、與Spring Security對比 &#x1f9e9; 六、典型應用場景 &#x1f48e; 七、總結歸納概述 &#x1f4eb; 一、前言提要簡介 Apache Shiro 是…

虛擬機ubuntu20.04共享安裝文件夾

ubuntu20.04共享安裝文件夾 4.5 共享安裝文件夾 將Windows存放安裝文件的文件夾共享給虛擬機&#xff0c;如下圖操作&#xff1a;如果是在ubuntu20.04中&#xff0c;還需要以下的操作&#xff1a; sudo mkdir /mnt/hgfs 此命令無效 sudo echo ‘vmhgfs-fuse /mnt/hgfs fu…

如何查看電腦后門IP和流量?

你是否也有以下經歷&#xff1f;深夜&#xff0c;你的電腦風扇突然狂轉&#xff0c;屏幕卻一片寂靜&#xff1b;每月流量莫名超標&#xff0c;賬單高得離譜&#xff1b;鼠標偶爾不聽使喚…這些可能不是電腦“鬧脾氣”&#xff0c;如何一探究竟&#xff1f; 想象一下&#xff1a…

分類預測 | MATLAB基于四種先進的優化策略改進蜣螂優化算法(IDBO)的SVM多分類預測

分類預測 | MATLAB基于四種先進的優化策略改進蜣螂優化算法(IDBO)的SVM多分類預測 目錄分類預測 | MATLAB基于四種先進的優化策略改進蜣螂優化算法(IDBO)的SVM多分類預測分類效果基本介紹多策略量子自適應螺旋搜索算法研究摘要1. 引言1.1 研究背景1.2 研究意義1.3 研究目標2. 文…

Android 修改系統時間源碼閱讀

鏈接&#xff1a;XRefAndroid - Support Android 16.0 & OpenHarmony 5.0 (AndroidXRef/AospXRef) 這里看的Android 10的代碼&#xff0c;選中Android 10&#xff0c;勾選所有工程&#xff0c;搜索DateTimeSettings?&#xff1a; 看到showTimePicker應該是顯示一個設置時…