【原創(chuàng)】如何檢測Android應用是32位還是64位

本文為個人原創(chuàng)峡继,歡迎轉(zhuǎn)載暗挑,但請務必在明顯位置注明出處更舞!

http://www.reibang.com/p/8686931d31f0

1掠剑、前言

從Android 4.4宣布支持64位系統(tǒng)以來竟痰,各終端方案廠商逐步推出了各自的64位soc解決方案尚胞。Google為了兼容之前32位系統(tǒng)的應用硬霍,在64位系統(tǒng)上也實現(xiàn)了對32位應用的支持。那么問題就來了笼裳,在一個64位系統(tǒng)的Android手機上如何檢測應用是運行在32位還是64位環(huán)境唯卖?本博文將為大家解答這個問題。

本文會分別對Android系統(tǒng)中的App躬柬、Native進程以及動態(tài)鏈接庫的32/64位檢測方法進行介紹拜轨。

2、檢測App

任何一個Android手機用戶對APK文件肯定不會陌生允青,它是一個Android應用資源的封裝文件橄碾。當你下載安裝一個App之后,從Launcher啟動該應用颠锉,系統(tǒng)會由Zygote分叉出一個子進程來提供App運行的虛擬機和Runtime環(huán)境法牲。與32位系統(tǒng)不同的是,在64系統(tǒng)中會同時存在兩個Zygote進程——zygote和zygote64琼掠,分別對應32位和64位應用拒垃。所以,要進行App的32/64位檢測眉枕,只需要看它的父進程是哪個Zygote即可恶复。

下面的例子通過App的PPID信息——2759怜森,檢測出了終端系統(tǒng)中所有的64位應用速挑,且該方式無需root權(quán)限。

$ adb shell ps |grep zygote
root      2759  1     2131692 87052          0 0000000000 S zygote64
root      2760  1     1574048 53740          0 0000000000 S zygote

$ adb shell ps|grep 2759
root      2759  1     2131692 87052          0 0000000000 S zygote64
system    3257  2759  2339956 158936          0 0000000000 S system_server
radio     3393  2759  1601272 96220          0 0000000000 S com.android.phone
u0_a85    3407  2759  1564856 88740          0 0000000000 S com.android.inputmethod.latin
u0_a20    3422  2759  1970228 167288          0 0000000000 S com.android.systemui
u0_a7     3769  2759  1548288 63384          0 0000000000 S android.ext.services
u0_a13    3958  2759  1896704 131832          0 0000000000 S com.android.launcher3
u0_a6     3989  2759  1562416 94060          0 0000000000 S android.process.acore
u0_a17    4046  2759  1563300 88504          0 0000000000 S android.process.media
u0_a28    4112  2759  1555640 82004          0 0000000000 S com.android.quicksearchbox
u0_a64    4157  2759  1554484 72944          0 0000000000 S com.android.calendar
u0_a57    4215  2759  1572160 83532          0 0000000000 S com.android.email
u0_a77    4231  2759  1554408 67192          0 0000000000 S com.android.exchange
u0_a5     4279  2759  1549136 66072          0 0000000000 S com.android.onetimeinitializer
u0_a10    4299  2759  1552472 74088          0 0000000000 S com.android.providers.calendar
u0_a94    4325  2759  1869948 112984          0 0000000000 S com.android.soundrecorder
system    4345  2759  1561180 73680          0 0000000000 S com.sprd.engineermode
u0_a15    4887  2759  1874612 106196          0 0000000000 S com.android.packageinstaller
u0_a73    5133  2759  2425904 205912          0 0000000000 S com.android.browser

3副硅、檢測Native進程

Andorid手機開機啟動之后姥宝,init進程會啟動一些后臺守護進程。通常恐疲,這些進程會對整個Android系統(tǒng)起到重要作用腊满,例如Zygote、MediaServer和ServiceManager等培己。因為這些Native進程并不是通過安裝APK獲得碳蛋,所以上一章節(jié)的方法在這里并不適用。我們知道Andorid Framework層以下都是繼承自Linux省咨,因此可以采用Linux系統(tǒng)的一些工具和方法來對Native進程進行32/64位系統(tǒng)的檢測肃弟。

方法一,通過readelf工具來分析Native進程對應的bin文件,下面以mediaserver為例

$readelf -h mediaserver 
ELF Header:
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              DYN (Shared object file)
  Machine:                           ARM
  Version:                           0x1
  Entry point address:               0x1e24
  Start of program headers:          52 (bytes into file)
  Start of section headers:          20980 (bytes into file)
  Flags:                             0x5000000, Version5 EABI
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         9
  Size of section headers:           40 (bytes)
  Number of section headers:         29
  Section header string table index: 28

從上面的信息中我們看到mediaserver文件的Class字段為ELF32笤受,Machine字段為ARM穷缤。由此可知,在Android 64位系統(tǒng)中箩兽,mediaserver運行在32位環(huán)境中津肛。

方法二,在運行時通過打印Native進程的內(nèi)存映射列表(maps)來檢測32/64位汗贫,這個方法同樣也適用于App的32/64位檢測身坐。這里以com.android.email為例,從上一章節(jié)的進程列表打印可以看到落包,com.android.email的PID為4215掀亥。

u0_a57    4215  2759  1572160 83532          0 0000000000 S com.android.email

然后,通過proc文件系統(tǒng)便可查詢到PID=4215的內(nèi)存映射列表 (截取片段)

$adb root
$adb shell cat /proc/4215/maps
......
71ebcb1000-71ebcb3000 r-xp 00000000 103:15 1453                          /system/lib64/libOpenSLES.so
71ebcb3000-71ebcb4000 r--p 00001000 103:15 1453                          /system/lib64/libOpenSLES.so
71ebcb4000-71ebcb5000 rw-p 00002000 103:15 1453                          /system/lib64/libOpenSLES.so
71ebcb5000-71ebcd5000 r--s 00000000 00:12 282                            /dev/__properties__/u:object_r:logd_prop:s0
71ebcd5000-71ebcf5000 r--s 00000000 00:12 287                            /dev/__properties__/u:object_r:log_tag_prop:s0
71ebcf5000-71ebcf6000 r--p 00000000 00:00 0                              [anon:linker_alloc]
71ebcf6000-71ebcf7000 rw-p 00000000 00:00 0                              [anon:linker_alloc_vector]
71ebcf7000-71ebcf8000 r--p 00000000 00:00 0                              [anon:linker_alloc]
71ebcf8000-71ebcf9000 rw-p 00000000 00:00 0                              [anon:linker_alloc]
71ebcf9000-71ebcfb000 r-xp 00000000 103:15 1452                          /system/lib64/libOpenMAXAL.so
71ebcfb000-71ebcfc000 r--p 00001000 103:15 1452                          /system/lib64/libOpenMAXAL.so
71ebcfc000-71ebcfd000 rw-p 00002000 103:15 1452                          /system/lib64/libOpenMAXAL.so
71ebcfd000-71ebcff000 rw-p 00000000 00:01 22281                          /dev/ashmem/dalvik-indirect ref table (deleted)
71ebcff000-71ebd00000 r-xp 00000000 103:15 1565                          /system/lib64/libjnigraphics.so
71ebd00000-71ebd01000 r--p 00000000 103:15 1565                          /system/lib64/libjnigraphics.so
71ebd01000-71ebd02000 rw-p 00001000 103:15 1565                          /system/lib64/libjnigraphics.so
71ebd02000-71ebd04000 rw-p 00000000 00:01 22280                          /dev/ashmem/dalvik-indirect ref table (deleted)
71ebd04000-71ebd05000 r-xp 00000000 103:15 1644                          /system/lib64/libsigchain.so
71ebd05000-71ebd06000 r--p 00000000 103:15 1644                          /system/lib64/libsigchain.so
71ebd06000-71ebd07000 rw-p 00001000 103:15 1644                          /system/lib64/libsigchain.so
......

從上面的打印中可以看出妥色,com.android.email加載的動態(tài)鏈接庫均位于/system/lib64搪花。由此便可判斷com.android.email運行于64位環(huán)境。需要注意的是這個方法要root權(quán)限才能檢測嘹害。

4撮竿、檢測動態(tài)鏈接庫(*.so文件)

如果想要對一個.so文件的進行32/64位檢測,那么采用上一章節(jié)中的方法一就可以做到笔呀。但是幢踏,有native開發(fā)經(jīng)驗的讀者應該知道,64位系統(tǒng)中動態(tài)鏈接庫通常會同時存在32位和64位兩個版本许师,它們分別位于/system/lib和/system/lib64路徑中房蝉。所以,孤立地對某一個.so文件進行32位/64位檢測并沒有現(xiàn)實意義微渠,應該將其與加載該.so文件的App或Native進程作為一個整體來分析搭幻。

5、后語

本文分別對Android系統(tǒng)中App逞盆、Native進程和動態(tài)鏈接庫進行32/64位檢測的方法進行了介紹檀蹋,希望對大家的學習開發(fā)工作有所幫助。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末云芦,一起剝皮案震驚了整個濱河市俯逾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌舅逸,老刑警劉巖桌肴,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異琉历,居然都是意外死亡坠七,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來灼捂,“玉大人离例,你說我怎么就攤上這事∠こ恚” “怎么了宫蛆?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長的猛。 經(jīng)常有香客問我耀盗,道長,這世上最難降的妖魔是什么卦尊? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任叛拷,我火速辦了婚禮,結(jié)果婚禮上岂却,老公的妹妹穿的比我還像新娘忿薇。我一直安慰自己,他們只是感情好躏哩,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布署浩。 她就那樣靜靜地躺著,像睡著了一般扫尺。 火紅的嫁衣襯著肌膚如雪筋栋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天正驻,我揣著相機與錄音弊攘,去河邊找鬼。 笑死姑曙,一個胖子當著我的面吹牛襟交,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播渣磷,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼婿着,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了醋界?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤提完,失蹤者是張志新(化名)和其女友劉穎形纺,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體徒欣,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡逐样,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脂新。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡挪捕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出争便,到底是詐尸還是另有隱情级零,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布滞乙,位于F島的核電站奏纪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏斩启。R本人自食惡果不足惜序调,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望兔簇。 院中可真熱鬧发绢,春花似錦、人聲如沸垄琐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽此虑。三九已至甚纲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間朦前,已是汗流浹背介杆。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留韭寸,地道東北人春哨。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像恩伺,于是被迫代替她去往敵國和親赴背。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容