1. 程式人生 > >android 5.0 64bit系統載入庫檔案失敗問題淺析

android 5.0 64bit系統載入庫檔案失敗問題淺析

最近公司的一個專案使用android 5.0 64 bit平臺,相對以前版本,除了android 5.0 有很大變動之外,64 bit系統和32 bit系統也存在很多差異性。

目前碰到的問題就是以前在32位上的so庫檔案,到64 位系統上不能載入的問題。首先來看一下相關log資訊

logcat資訊:

01-01 08:00:09.322 D/SensorService( 1606): nuSensorService starting...
01-01 08:00:09.323 E/HAL  ( 1606): load: module=/system/lib64/hw/sensors.default.so
01-01 08:00:09.323 E/HAL  ( 1606

): dlopen failed: "/system/lib64/hw/sensors.default.so" is 32-bit instead of 64-bit
01-01 08:00:09.323 E/SensorService( 1606): couldn't load sensors module (Invalid argument)

ps資訊:

USER     PID   PPID  VSIZE  RSS     WCHAN    PC        NAME

root      1172  1     1254940 56612 ffffffff 8e579300 S zygote64
root      1173  1     940684 49112 ffffffff f75da8a8 S zygote
shell     1174  1     4136   956   000b45f4 9bcef2e8 S /system/bin/sh

system    1606  1172  1411680 87808 ffffffff 8e579b88 S system_server
u0_a11    1730  1172  1298048 43684 ffffffff 8e579b88 S com.android.systemui
root      1742  1174  4136   976   000b45f4 8d71b2e8 S sh

從上面的log資訊我們可以得出如下資訊:

1. 64 bit 系統啟動後,會執行兩個程序zygote64 ,zygote ,對應的程序號為1172 和1173

2.sysrem_server程序由zygote64 啟動,它的程序號為1606

3.logcat 資訊裡面提示的錯誤資訊,是在sysrem_server程序呼叫的,也就是說sensors.default.so庫是在程序sysrem_server中去載入的。

綜合上面資訊,不難發現,sysrem_server是由zygote64啟動的,所以載入的so庫也必須是64bit型別。否則就會報如下錯誤

dlopen failed: "/system/lib64/hw/sensors.default.so" is 32-bit instead of 64-bit

為了解決這個問題,就必須把原來so檔案的原始碼,放到64 bit的編譯環境下編譯。

首先,我直接複製原始碼到64 bit的android原始碼下編譯,沒有做任何修改,編譯資訊如下,

build/core/shared_library.mk:12: sensors.default: LOCAL_MODULE_PATH for shared libraries is unsupported in multiarch builds, use LOCAL_MODULE_RELATIVE_PATH instead
Import includes file: out/target/product/coconut/obj_arm/SHARED_LIBRARIES/sensors.default_intermediates/import_includes
target thumb C: sensors.default_32 <= external/tcl_sensors/sensors.c
external/tcl_sensors/sensors.c: In function 'sensors__get_sensors_list':
external/tcl_sensors/sensors.c:203:63: warning: unused parameter 'module' [-Wunused-parameter]
 static int sensors__get_sensors_list(struct sensors_module_t* module,
                                                               ^
target SharedLib: sensors.default_32 (out/target/product/coconut/obj_arm/SHARED_LIBRARIES/sensors.default_intermediates/LINKED/sensors.default.so)
Import includes file: out/target/product/coconut/obj/SHARED_LIBRARIES/sensors.default_intermediates/import_includes
target  C: sensors.default <= external/tcl_sensors/sensors.c
external/tcl_sensors/sensors.c: In function 'sensors__get_sensors_list':
external/tcl_sensors/sensors.c:203:63: warning: unused parameter 'module' [-Wunused-parameter]
 static int sensors__get_sensors_list(struct sensors_module_t* module,
                                                               ^
target SharedLib: sensors.default (out/target/product/coconut/obj/SHARED_LIBRARIES/sensors.default_intermediates/LINKED/sensors.default.so)
target Symbolic: sensors.default (out/target/product/coconut/symbols/system/lib64/hw/sensors.default.so)
Export includes file: external/tcl_sensors/Android.mk -- out/target/product/coconut/obj/SHARED_LIBRARIES/sensors.default_intermediates/export_includes
target Strip: sensors.default (out/target/product/coconut/obj/lib/sensors.default.so)
Export includes file: external/tcl_sensors/Android.mk -- out/target/product/coconut/obj_arm/SHARED_LIBRARIES/sensors.default_intermediates/export_includes
target Strip: sensors.default_32 (out/target/product/coconut/obj_arm/lib/sensors.default.so)
Install: out/target/product/coconut/system/lib64/hw/sensors.default.so

在/system/lib64/hw/目錄下面生成了庫檔案sensors.default.so,然後我把該庫檔案替換到終端裡面,既然發現還是會出現和上面一樣的錯誤,找不到so庫。

在網上查了一下資料,很少相關介紹,這個時候感覺沒思路了,找不到問題突破點。

後來再編譯操作了一遍,發現了一條很重要的資訊提示,

build/core/shared_library.mk:12: sensors.default: LOCAL_MODULE_PATH for shared libraries is unsupported in multiarch builds, use LOCAL_MODULE_RELATIVE_PATH instead

這個資訊提示已經說得很明白,然後我查看了一下android.mk檔案,果斷的把LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw語句改成了

LOCAL_MODULE_RELATIVE_PATH := hw,然後再重新編譯。log如下

Import includes file: out/target/product/coconut/obj/SHARED_LIBRARIES/sensors.default_intermediates/import_includes
target  C: sensors.default <= external/tcl_sensors/sensors.c
external/tcl_sensors/sensors.c: In function 'sensors__get_sensors_list':
external/tcl_sensors/sensors.c:203:63: warning: unused parameter 'module' [-Wunused-parameter]
 static int sensors__get_sensors_list(struct sensors_module_t* module,
                                                               ^
target SharedLib: sensors.default (out/target/product/coconut/obj/SHARED_LIBRARIES/sensors.default_intermediates/LINKED/sensors.default.so)
target Symbolic: sensors.default (out/target/product/coconut/symbols/system/lib64/hw/sensors.default.so)
Export includes file: external/tcl_sensors/Android.mk -- out/target/product/coconut/obj/SHARED_LIBRARIES/sensors.default_intermediates/export_includes
target Strip: sensors.default (out/target/product/coconut/obj/lib/sensors.default.so)
Install: out/target/product/coconut/system/lib64/hw/sensors.default.so
Import includes file: out/target/product/coconut/obj_arm/SHARED_LIBRARIES/sensors.default_intermediates/import_includes
target thumb C: sensors.default_32 <= external/tcl_sensors/sensors.c
external/tcl_sensors/sensors.c: In function 'sensors__get_sensors_list':
external/tcl_sensors/sensors.c:203:63: warning: unused parameter 'module' [-Wunused-parameter]
 static int sensors__get_sensors_list(struct sensors_module_t* module,
                                                               ^
target SharedLib: sensors.default_32 (out/target/product/coconut/obj_arm/SHARED_LIBRARIES/sensors.default_intermediates/LINKED/sensors.default.so)
target Symbolic: sensors.default_32 (out/target/product/coconut/symbols/system/lib/hw/sensors.default.so)
Export includes file: external/tcl_sensors/Android.mk -- out/target/product/coconut/obj_arm/SHARED_LIBRARIES/sensors.default_intermediates/export_includes
target Strip: sensors.default_32 (out/target/product/coconut/obj_arm/lib/sensors.default.so)
Install: out/target/product/coconut/system/lib/hw/sensors.default.so

注意看這次的log資訊,沒有上面的提示資訊,並且還有一個關鍵的不同點,就是在system/lib64/hw 和system/lib/hw兩個目錄下都生成了sensors.default.so庫檔案

趕緊把system/lib64/hw/目錄下的sensors.default.so替換到終端的system/lib64/hw/目錄,重啟驗證,發現庫檔案可以正常執行。

小結一下:

1. 初次在64bit系統上開發,相對在32bit上,會發現出現很多意想不到問題,以前很多直接移植的東西可能在64bit上就不能使用。

針對這類問題,解決問題的核心思想一定要放在分析64bit 和32bit的差異性,包括編譯、資料處理方式、資料型別等方面。

2.針對64bit系統平臺的一些執行機制,還存在很多疑問,這個還得在實踐中慢慢去摸索了。



相關推薦

android 5.0 64bit系統入庫檔案失敗問題淺析

最近公司的一個專案使用android 5.0 64 bit平臺,相對以前版本,除了android 5.0 有很大變動之外,64 bit系統和32 bit系統也存在很多差異性。 目前碰到的問題就是以前在32位上的so庫檔案,到64 位系統上不能載入的問題。首先來看一下相關lo

Android 7.0呼叫系統相機(檔案訪問crash android.os.FileUriExposedException)

最近專案中做圖片上傳的功能中遇到一個問題,就是7.0的手機上呼叫系統相機指定圖片路徑的情況下回crash,報錯android.os.FileUriExposedException uri暴露的錯誤。 Android7.0對應用共享檔案這塊做了一些強制性的要求。

Android 5.0 Camera系統原始碼分析(2):Camera開啟流程

1. 前言 本文將分析android系統原始碼,從frameworks層到hal層,暫不涉及app層和kernel層。由於某些函式比較複雜,在貼出程式碼時會適當對其進行簡化。本文屬於自己對原始碼的總結,僅僅是貫穿程式碼流程,不會深入分析各個細節。歡迎聯絡討論,QQ:1026

React Native之Android 5.0以下系統WebView訪問https頁面變成空白頁

在我們的React Native專案中,需要開發一個tab頁面專門配置三方h5連結,供使用者瀏覽。自動化測試:Android 5.0以下系統此tab頁面為空白頁面。看效果: 而我們去檢視這個三方的

android 5.0以下系統Intent傳遞序列化物件的bug

    專案中使用外掛框架,當外掛在Intent中傳遞Serializable物件時,在android 5.0以下系統上會出現 E/InstrumentationHacker(25176): Parcelable encounteredClassNotFoundExce

Android 5.0 Camera系統原始碼分析(4):Camera預覽流程資料流

1. 前言 上一篇講了怎麼讓Camera進入預覽模式,提到了DisplayClient負責顯示影象資料,而CamAdapter負責提供影象資料,這裡主要記錄了CamAdapter怎麼獲取影象,然後DisplayClient怎麼將影象顯示在螢幕上。 2.

Android 5.0 Camera系統原始碼分析(3):Camera預覽流程控制流

1. 前言 本文分析的是Android系統原始碼,從frameworks層到hal層,記錄了Camera進入預覽模式的重點程式碼,主要為控制流程的程式碼,有關影象buffer的傳遞暫不涉及,硬體平臺基於mt6735。由於某些函式比較複雜,在貼出程式碼時會適當對

Android 7.0以上系統獲取以content開頭的檔案拿不到正確路徑,報錯column-data-does-not-exist

我們專案的使用場景,手機qq開啟檔案,選擇其他開啟方式,選擇我們自己的應用開啟,通過intent.getData()獲取檔案地址,後來發現在Android7.0之後的版本,獲取到的地址不正確,說檔案不存在。日誌報錯column-data-does-not-exist, 經過一天的折騰,終於在網上

Android WebView擷取所有內容生成長圖在5.0以上系統異常問題

最近在做webview擷取所有內容生成長圖時出現一些問題,在Android5.0以下系統能正常生成長圖,但是在5.0以上會出現只能擷取第一屏的內容,剩下的全部為空白,檢視資料發現原來是系統在5.0+版本上,Android對webview做了優化,為了減少記憶體佔用以提高效能,因此在預設情況下會智慧的

android 5.0以上so檔案關於平臺支援問題的淺析

背景 近期,因為一些原因,需要整理一個最簡單的外掛框架使用的demo,此過程中出現了一個非常詭異的問題, 在實際專案中一直執行正常的一些外掛,在demo裡面卻執行崩潰,得到的異常資訊如下:06-01 15:44:59.462 26609 26609 E Instrument

修復android 5.0 Xutils的框架問題retry error, curr request is null

top ims 訂閱 height trac ber request ext key Android 5.0手機對xUtils-2.6.13.jar請求時會出現retry error, curr request is null 情況, 修復解決方式:

Android 5.0 Lollipop介紹

seq 手勢 不包含 傾斜 pan 配色方案 lol for gles Android Lollipop介紹 Android 5.0 Lollipop,此版本為用戶提供了豐富的新功能,並為開發者新增了數以千計的 API,它進一步擴展了 Android 的應用範圍,從手機

Android探究2:Android 5.0下 Dialog&AlertDialog 並不會影響Activity的生命周期

lac wid cancel test () onclick posit make div 先給出結論:Dialog和AlertDialog並不會影響到Activity的生命周期,但會影響到Activity的優先級。 核心代碼: onCreated中:

Android 5.0+高級動畫開發 矢量圖動畫 軌跡動畫 路徑變換

Android 第1章 課程介紹為了成就更多高逼格的人才,我專門整理了Android5.0以後主推的實現酷炫動畫的新技術,教你掌握實現動畫的高逼格技巧。課程中我會詳細講解每個動畫效果實現的原理和所用的技術,並帶你一步一步的實現每個動畫效果,讓你在學完本次課程後,能夠舉一反三,再也不必擔心設計MM的設計你沒法實

Android 5.0 行為變更

rmi camera rec about md5 加密 進行 評估 訪問權限 stream Android 5.0 除了提供諸多新特性和功能外,還對系統和 API 行為做出了各種變更。本文重點介紹您應該了解並在開發應用時加以考慮的一些主要變更。 如果您之前發布過 Andro

如何解決Android 5.0中出現的警告:Service Intent must be explicit

有些時候我們使用Service的時需要採用隱私啟動的方式,但是Android 5.0一出來後,其中有個特性就是 Service Intent  must be explitict ,也就是說從Lollipop開始,service服務必須採用顯示方式啟動。

Android 5 0中使用JobScheduler

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Android 5.0及以上WebView不能使用第三方Cookies解決方案

最近在做老專案SDK的升級,突然發現以前能用的功能,現在不能使用了。除錯的時候發現返回了錯誤401.需要認證。奇怪以前都是正常的。所以就去看看webView是否有過變動 解決方法 if (Build.VERSION.SDK_INT >= Build.VERSION_CODE

android 5.0 titilebar分享

colorAccent,colorPrimary,colorPrimaryDark……來這裡你就明白了 伴隨著Android5.0的釋出也更新了support-v7-appcompat到V21,其中增加了ToolBar、recyclerview、cardview等控制元

Android 5.0 and later only support position-independent executables

在參考Android利用tcpdump和wireshark抓取網路資料包使用tcpdump的時候,會提示如下資訊: λ adb shell /data/local/tcpdump "/data/local/tcpdump": error: Android 5.0 and later