解決安卓so庫異常無法打印堆棧的問題

解決方案:

設置 android:extractNativeLibs="true"

直接在 AndroidManifest.xml 里加上:

<applicationandroid:extractNativeLibs="true">
</application>

這樣,so 文件會被解壓,崩潰時可以正常打印完整的 native 堆棧。


分析

1. android:extractNativeLibs 的作用

android:extractNativeLibsAndroidManifest.xmlapplication 標簽的一個屬性:

<applicationandroid:extractNativeLibs="true">
</application>

它控制的是 應用安裝時是否解壓 native 庫(.so 文件)到 /data/data/<package>/lib/ 目錄

  • true(傳統模式):

    • 系統會解壓 APK 內的 .so 文件到 /data/data/<package>/lib/ 目錄。
    • System.loadLibrary() 直接加載這個解壓后的 .so 文件。
    • 崩潰時堆棧信息可見
  • false(默認,優化模式):

    • 直接在 APK 的 ZIP 文件中使用 mmap 方式映射 .so 文件,不解壓。
    • 這是一種更高效的加載方式(節省存儲空間)。
    • 但如果 native 代碼崩潰,可能不會打印完整的堆棧信息

2. 為什么 false 時堆棧信息可能缺失?

android:extractNativeLibs="false" 時:

  • .so 文件不會被解壓,而是直接通過 mmap 映射到進程地址空間。
  • 但如果發生 native 崩潰(如 SIGSEGV),gdb、ndk-stack 等調試工具可能無法正確解析內存中的 so 文件,導致:
    • 崩潰日志中的 so 文件路徑可能是 /apex/.../libfoo.so(映射路徑)。
    • 符號解析失敗,導致堆棧信息缺失或不完整

android:extractNativeLibs="true" 時:

  • .so 文件被解壓到 /data/data/<package>/lib/,進程使用的是磁盤上的真實文件。
  • 崩潰時,日志工具能正確解析符號表,所以 堆棧信息可以正確顯示

在 Android 6.0 (API 23) 之前,extractNativeLibs 默認為 true;在 Android Gradle Plugin 3.6.0+ 后,該屬性默認為 false,需顯式設置為 true。


3. 總結

  • android:extractNativeLibs="false"(默認):節省空間,但可能導致 native 崩潰堆棧缺失
  • android:extractNativeLibs="true".so 文件被解壓,崩潰日志可以正確解析
  • 建議
    • 開發調試時,設為 true,確保看到完整的崩潰日志。
    • 正式發布時,設為 false,減少存儲占用,但保留 unstripped so 文件用于離線解析崩潰日志。

你可以根據實際情況選擇適合的方案!

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

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

相關文章

清華大學.智靈動力-《DeepSeek行業應用實踐報告》附PPT下載方法

導 讀INTRODUCTION 今天分享是由清華大學.智靈動力&#xff1a;《DeepSeek行業應用實踐報告》&#xff0c;主要介紹了DeepSeek模型的概述、優勢、使用技巧、與其他模型的對比&#xff0c;以及在多個行業中的應用和未來發展趨勢。為理解DeepSeek模型的應用和未來發展提供了深入的…

屏幕刷新機制(一):機制

屏幕刷新機制&#xff08;一&#xff09;&#xff1a;機制 屏幕刷新機制&#xff08;二&#xff09;&#xff1a;Choreographer、SurfaceFlinger 綜述 屏幕整體刷新機制&#xff1a;就是通過Choreographer、SurfaceFlinger&#xff0c;以垂直同步技術(VSYNC)加三重緩沖技術(T…

VSCODE上ckg_server_linux進程占用CPU過多

現象描述 每次一打開VSCODE&#xff0c;ckg_server_linux進程就啟動了&#xff0c;并且一直運行&#xff0c;且占用CPU過高&#xff1b; 推測應該是某個插件的問題導致的&#xff1b; 問題處理 本地搜索了一下&#xff0c;發現是 marscode插件影響的&#xff1b; 禁用marsc…

【大模型理論篇】CogVLM:多模態預訓練語言模型

1. 模型背景 前兩天我們在《Skywork R1V: Pioneering Multimodal Reasoning with Chain-of-Thought》中介紹了將ViT與推理模型結合構造多模態推理模型的案例&#xff0c;其中提到了VLM的應用。追溯起來就是兩篇前期工作&#xff1a;Vision LLM以及CogVLM。 今天準備回顧一下Cog…

Vue 項目編譯錯誤:These dependencies were not found,To install them, you can run...

問題與處理策略 問題描述 運行一個 Vue 項目時&#xff0c;報如下錯誤 ERROR Failed to compile with 47 errors …

python 模擬登錄

在Python中模擬登錄通常涉及到發送HTTP請求到服務器&#xff0c;并處理響應。這可以通過多種方式實現&#xff0c;最常見的方法之一是使用requests庫。下面是一個簡單的示例&#xff0c;展示了如何使用requests庫來模擬登錄一個網站&#xff08;以一個假想的登錄表單為例&#…

優化 Docker 鏡像 技巧

優化 Docker 鏡像可以提高構建速度、減少鏡像大小、提高安全性和效率。以下是一些優化 Docker 鏡像的方法&#xff1a; 使用適當的基礎鏡像 選擇合適的基礎鏡像可以減小鏡像大小&#xff0c;并確保基礎鏡像的安全性和更新性。Alpine、Ubuntu Minimal 等輕量級基礎鏡像是常用選…

2021年藍橋杯第十二屆CC++大學B組真題及代碼

目錄 1A&#xff1a;空間&#xff08;填空5分_單位轉換&#xff09; 2B&#xff1a;卡片&#xff08;填空5分_模擬&#xff09; 3C&#xff1a;直線&#xff08;填空10分_數學排序&#xff09; 4D&#xff1a;貨物擺放&#xff08;填空10分_質因數&#xff09; 5E&#xf…

Python入門基礎

python基礎類型轉換 str()與int()類型轉換 name 張三 age 20 print(type(name),type(age))print(我叫name 今年&#xff0c; str(age)歲 )a10 b198.8 cFalse print(type(a),type(b),type(c)) print(str(a),str(b),str(c))s1 128 f198.7 s276.77 ffTrue s3hello print(type(s…

HTTP/HTTPS 中 GET 請求和 POST 請求的區別與聯系

一、基礎概念 HTTP (HyperText Transfer Protocol, 超文本傳輸協議) 是一種用于瀏覽器與服務器之間進行數據交互的協議。HTTPS (加密的 HTTP) 則通過 SSL/TLS 協議實現通信加密與數據安全性。 二、GET 和 POST 概述 GET 請求: 用于從服務器獲取資源。 POST 請求: 用于將數據…

OPENCV數字識別(非手寫數字/采用模板匹配)

這篇文章的重點在于 模板匹配 的使用。模板匹配是計算機視覺中的一項基本技術&#xff0c;它通過比對輸入圖像與模板圖像的相似度&#xff0c;來進行目標識別。對于數字識別&#xff0c;特別是標準數字的識別&#xff0c;模板匹配非常有效。 請看效果&#xff1a; 文章結構 …

在 Kubernetes 中部署 Trivy 漏洞掃描服務

創建專用 Namespace # trivy-ns.yaml apiVersion: v1 kind: Namespace metadata: name: trivy-system配置持久化存儲&#xff08;緩存數據庫&#xff09; apiVersion: v1 kind: PersistentVolumeClaim metadata: name: trivy-db-cache namespace: trivy-system spec: acc…

Cursor安裝注冊+基礎配置+入門實操

一、安裝注冊 官網地址&#xff1a;https://www.cursor.com/ 下載按鈕會根據電腦系統來匹配&#xff0c;點擊對應「Download」按鈕進行下載。完成后&#xff0c;按步驟安裝即可。 安裝完成后&#xff0c;即可點擊圖標打開軟件。 基礎設置完成后&#xff0c;就需要選擇注冊賬號…

秒殺業務優化之從分布式鎖到基于消息隊列的異步秒殺

一、業務場景介紹 優惠券、門票等限時搶購常常出現在各類應用中&#xff0c;這樣的業務一般為了引流宣傳而降低利潤&#xff0c;所以一旦出現問題將造成較大損失&#xff0c;那么在業務中就要求我們對這類型商品嚴格限時、限量、每位用戶限一次、準確無誤的創建訂單&#xff0c…

MiniMax GenAI 可觀測性分析:基于阿里云 SelectDB 構建 PB 級別日志系統

“阿里云SelectDB作為MiniMax日志存儲服務的核心支撐&#xff0c;為在線和離線業務提供了高效、穩定的查詢與聚合分析能力。其支持實時物化視圖、租戶資源隔離、冷熱分離等企業級特性&#xff0c;不僅有效解決了日志場景下PB級別數據查詢的性能瓶頸&#xff0c;還通過智能化的資…

【YOLO V3】目標檢測 Darknet 訓練自定義模型

【YOLO V3】目標檢測 Darknet 訓練自定義模型 前言整體思路環境檢查與依賴配置克隆 YOLOv3 Darknet 并編譯Clone Darknet 項目文件修改 Makefile 文件修改模型保存頻率項目編譯 準備數據集配置訓練文件數據集&#xff1a;datasets &#xff08;自制&#xff09;權重文件 yolov3…

Kafka分區分配策略詳解

Kafka分區分配策略詳解 Kafka作為當前最流行的分布式消息隊列系統&#xff0c;其分區分配策略直接影響著系統的性能、可靠性和可擴展性。合理的分區分配不僅能夠提高數據處理的效率&#xff0c;還能確保系統負載的均衡。 Kafka提供了多種內置的分區分配策略&#xff0c;包括R…

C#中 String類API(函數)

字符串屬性 string str "打工人";Console.WriteLine(str);char s str[0];Console.WriteLine(s); 字符串內置API(函數) 1. Concat 拼接字符串 string s1 "打";string s2 "工";string s3 "人";string sthstring.Concat(s1, s2, s…

JavaScript性能優化實戰手冊:從V8引擎到React的毫秒級性能革命

目錄 一、性能優化的本質挑戰1.1 瀏覽器渲染管線的性能瓶頸2.1 內存管理優化2.2 執行效率優化2.3 網絡傳輸優化 三、React框架深度調優3.1 渲染性能優化3.2 性能監控體系 四、企業級優化案例4.1 電商平臺首頁優化4.2 數據可視化大屏優化 五、新一代性能優化技術5.1 WASM性能突破…

【PostgreSQL】pg各版本選用取舍邏輯與docker安裝postgres:15

企業常用 PostgreSQL 版本推薦 1. PostgreSQL 14&#xff08;最常見&#xff0c;穩定&#xff09; 目前許多企業仍在使用 PostgreSQL 14&#xff0c;因為它在性能、并發處理、JSON 支持等方面做了較多優化&#xff0c;同時又非常穩定。官方支持時間&#xff1a;2026 年 11 月…