1. 程式人生 > >一個Android多平臺問題相容解決思路

一個Android多平臺問題相容解決思路

問題:使用AS打出來的簽名包,在除錯一直用的5.0的小米手機上可以正常執行,4.4的聯想手機上閃退,5.1的模擬器上閃退。

丟擲:java.lang.UnsatisfiedLinkError,ClassLoader找不到相關的so庫。

解決思路:

猜想跟CPU架構有關係,查詢如下(cat /proc/cpuinfo):

      模擬器:                     電腦使用的是Intel的cpu                         x86_64架構

      聯想:Processor       : ARMv7 Processor rev 2 (v7l)                armeabi-v7a

      小米:Processor       : AArch64 Processor rev 2 (aarch64)      arm64-v8a

問題一、Android支援哪些cpu架構?

答案很容易搜尋到:android目前支援7種架構

  1. x86_64

  2. x86

  3. mips64

  4. mips

  5. armeabi-v7a

  6. armeabi

  7. arm64-v8a

問題二、系統是怎麼查詢so庫的呢?

查詢so庫規則:

      執行的時候,系統會到Jnidirs目錄裡查詢so庫,會根據當前平臺架構查詢對應的目錄。這裡面有一個規則是這個問題的元凶。當你只提供了armeabi目錄時,armeabi-v7a、arm64-v8a架構的程式都會去armeabi裡尋找,而當你同時也

提供了armeabi-v7a、armeabi-v8a目錄,而裡面又不存在對應的so庫時,系統就不會再去armeabi裡面尋找了,直接找不到報錯。

      而簽名包裡面這七個目錄都有,這個問題後面討論。

驗證猜想:

      將app-release.apk使用打包軟體開啟,刪除其中的armeabi-v7a目錄,發現聯想手機可以正常運行了(去armeabi裡面尋找了)。移除x86_64資料夾,模擬器可以正常執行(去x86裡面尋找了)。

問題三、簽名包為什麼七個目錄全都有?

      對應Jnidirs目錄中的七個目錄。開啟簽名包,發現這七個目錄都有。奇怪的是我的專案裡只有x86、armeabi和arm64-v8a三個型別的so庫。開啟其他的目錄發現都是隻有一個so檔案:libgenius_graphics.so。百思不得其解這個從何而來,查詢build-gradle的時候發現:compile 'net.qiujuer.genius:graphics:2.0.0-beta8' 非常相似,這是一個開源的UI庫。猜測是引入這個庫在編譯的時候自動生成各個平臺下的libgenius_graphics.so檔案。移除之,rebuild,確實如此,只剩下原本的三個資料夾。

問題四、armeabi能否相容x86平臺?

      而當我連x86資料夾都移除,則根本不能安裝在模擬器上,提示:INSTALL_FAILED_NO_MATCHING_ABIS。證明x86架構不會去尋找armeabi目錄。當你想在x86的機器上執行app時,一定要獲得對應的x86版本so庫檔案。

相關推薦

一個Android平臺問題相容解決思路

問題:使用AS打出來的簽名包,在除錯一直用的5.0的小米手機上可以正常執行,4.4的聯想手機上閃退,5.1的模擬器上閃退。 丟擲:java.lang.UnsatisfiedLinkError,Cl

在cmakeLists中這是平臺相容

在你想要做成庫的.h檔案中新增如下的程式碼: #ifndef DBZHANG_HELLO_ #define DBZHANG_HELLO_ #if defined _WIN32 #if LI

Android資料庫併發操作解決思路

資料庫作為Android資料儲存重要的一部分,相信很多應用中都會用到,面試也會遇到很多關於資料庫的問題。實際開發中我沒遇到過特別複雜的資料庫使用,所以對這一塊的優化沒怎麼研究過。 以前面試的時候被問到過這麼一個問題: 面試官:資料庫併發訪問怎麼處理? 我:

一個解決unity3d 平臺下完美本地文字檔案讀取的方法

http://blog.csdn.net/hpsoft/article/details/8227255 unity3d可以把遊戲釋出在很多遊戲平臺下,但unity3d在不同的執行平臺下,本地檔案路徑是不一樣的,這樣給我們用給應用配置的本地文字檔案的讀取帶來不小的麻煩,要

Android---apk打包libs自動刪除第三方so問題解決(armeabi/armeabi-v7a等平臺so)

開發工具eclipse,如果是as,則不存在這樣的問題。在引用第三方so時,常常會碰到一個問題:編譯之後,libs中的第三方so被刪除掉了,導致程式無法執行,而且第三方so是多個平臺(armeabi/armeabi-v7a等等)的,這個問題如何解決?首先在jni目錄下,新建一

android-繼承BaseAdapter--自己定義適配器,getView運行次的解決方法

能夠 popu con data ssa baseadapt tracking you idt 定義的getView運行多次的ListView布局: <ListView android:id="@+id/lv_messages"

Cocos2d-x: 安卓打包問題 “ GoogleAPIs:21 不是一個有效的 Android 目標平臺

一個 androi 發生 cocos2 api clip strong googl color   問題:GoogleAPIs:21 不是一個有效的 Android 目標平臺。   產生原因:這是由於使用Eclipse運行Android項目後, 項目的bulid Targe

Android線程分析之中的一個:使用Thread異步下載圖像

htm .net ins ace tca inside 分享 sdi 集中 Android多線程分析之中的一個:使用Thread異步下載圖像羅朝輝 (http://blog.csdn.net/kesalin)CC 許可。轉載請註明出處打算整理一下對 Android Fr

linux刪除不了文件, 修改文件屬性也刪除不了的一個解決思路

邏輯 連接 文件屬性 英文 一個 -- span 隱藏屬性 linux 場景:   公司要求卸載軟件時, 也包含卸載一個目錄下的所有文件. 於是去修改刪除文件的shell腳本, 添加了刪除文件及文件夾的命令(當然是在root權限下的)   如: rm -rf /home/v

一例對一個個實體的驗證失敗。有關詳細信息,請參閱“EntityValidationErrors”屬性的解決

tro https span cep 實例 tps lte .data 防止 這個問題相信只要是做MVC的,都碰到過,也都知道錯誤的原因,就是觸發了定義的實例字段校驗規則。比如定義的不為空,但是為空了,或者定義的字段長度為50,但是超過50了。 可是有時雖然知道是這樣,

短信轟炸,得罪一個Android轉Python的程序員是件麽可怕的事?

trac apk term 一點 測試 實用 -s lar ext Android支持python的,首先我們要明確這一點。 Android運行python,需要先安裝龐大的python及需要的庫。開發出的app需要包含python,安裝包很大。運行的速度也會稍微

一個程序員都應該知道的高並發處理技巧、創業公司如何解決高並發問題、互聯網高並發問題解決思路、caoz大神多年經驗總結分享

海量數據 限定 微博 https 2.3 tst 日誌分析 如何 ive 目錄: 場景及解決方法解讀 認識負載 數據跟蹤 腦圖、caoz大神公眾號分享 參考資料 秉承知其然及其所以然的思路,以撥蟬拔絲的思維,一一解讀各個技巧的使用場景: a.網絡通道+前臺控制 原因

[開源應用]-一個Android平臺的 IM 應用

平臺 android model ogr github img 咖啡 com upload 這是一個簡單的 IM 應用,寫這個應用的本意只是想練練手,暫且實現了私聊和群聊功能,後邊再根據用戶反饋情況再來更新吧~ 應用完全是以 MVVM 的思想來實現的,使用的是 Google

一次下載個檔案的解決思路-JS

一次下載多個檔案的解決思路(iframe) - Eric 真實經歷 最近開發專案需要做檔案下載,想想挺簡單的,之前也做過,後臺提供下載介面,前端使用window.location.href就行了唄。不過開發的時候發現,有些檔案有附屬檔案,點選 下載按鈕 需要下載兩個檔案,而且不能使用壓縮包的形式。想想

VS2013無法載入解決方案中專案,提示未能正確載入解決方案中的一個個專案

現象:開啟一個工程,上午還能正常操作,下午就打不開了。試了所有的工程都打不開。 提示: 未能正確載入解決方案中的一個或多個專案 解決辦法: 1、關閉VS; 2、去C:\Users\AppData\Local\Microsoft\VisualStudio\12.0\ComponentMod

執行緒深入學習及面試解決思路

課程目標 執行緒與程序區別 為什麼要使用多執行緒? 多執行緒應用場景? 多執行緒建立方式 獲取執行緒物件以及名稱 守護執行緒 多執行緒執行狀態 join()方法作用 多執行緒分批處理資料 作業題 面試題 備註單詞 執行緒與程序區別

android 功能自定義畫板控制元件(用於解決特定需求)

在專案中需要做一個可以自定義軌跡,但始終只有一條線,並且支援撤銷(撤銷單位為MotionEvent的down事件到up事件),還要支援動畫預覽等功能,最重要的是能夠按照間隔畫素來獲取所有點的座標,用於專案的其他功能。 整體的思路 1.專案中的應用場景需要畫板是一個圓形的,這個好實現用canv

Android程序app中Application回撥onCreate()方法被執行次分析及解決

最近工作中碰到一個問題,在優化app,使用DDMS檢視Application log過程中看到,app啟動了三個程序,一個主程序,兩個附帶的程序。如下圖可看到一個app啟動的三個程序。  自定義Application回撥方法onCreate()被執行了3次。開始不知是何原因。 相

Java之執行緒安全(屌絲版,兩大解決思路,要麼不去競爭(開闢執行緒副本)、要麼有順序的競爭資源(用鎖規定執行緒秩序))

0、多執行緒安全,如果多個執行緒操作一個變數,每次都能達到預期的結果,那麼說明當前這個類起碼是執行緒安全的,我這白話的,可能有點噁心。   1、看看牛人是怎麼說的,為什麼多執行緒併發是不安全的? 在作業系統中,執行緒是不再擁有資源的,程序是擁有資源的。而執行緒是由程序建立的

一個頁面個swiper問題解決

  關於一個頁面中多處使用swiper而引起的翻頁問題 最近公司專案做了一個雙12活動,活動頁面中存在18個輪播!!!然後在進行swiper宣告的時候發現了問題,如果頁面只是有一兩個輪播,可以直接給每一個swiper-container 元素重新增加一個新類名,然後使用新類名進行宣告。