當前位置:首頁 » 安卓系統 » 解釋器android

解釋器android

發布時間: 2023-03-16 21:33:30

❶ 為方便android調試的腳本,如出現:/bin/bash^m:損壞的解釋器:沒有

為方便android調試的腳本,如出現:/bin/bash^M:損壞的解釋器: 沒有該文件或目錄,問題多半是因為windows和linux的換行符不一樣造成,可以用vim中的用:set ff=unix來解決,vim真強大
#!/bin/bash
PRODUCTDIR="/media/UBUNTU/work-ubuntu/s5pc110/hardkernel/android"
MKBOOTFS="$PRODUCTDIR/out/host/linux-x86/bin/mkbootfs"
MINIGZIP="$PRODUCTDIR/out/host/linux-x86/bin/minigzip"
ROOT="./root"
CMD="mkimage -A arm -O linux -T ramdisk -C none -a 0x30800000 -n "ramdisk" -d ramdisk.img ramdisk-uboot.img"

function extract-ramdisk-uboot(){
dd if=ramdisk-uboot.img of=ramdisk.img.gz bs=1 skip=64
gunzip -S .gz ramdisk.img.gz
rm -rf ./root
mkdir root
cd root
cpio -i -F ../ramdisk.img
cd ..
rm ramdisk.img
}

function generate-ramdisk-uboot(){
$MKBOOTFS $ROOT | $MINIGZIP > ./ramdisk.img
$CMD
rm ramdisk.img
}

#MAIN fucntion
echo "To extract-ramdisk-uboot, enter 'e'."
echo "To generate-ramdisk-uboot enter 'g'."
echo -n "Enter e or g:"

read answer

case "$answer" in
e) extract-ramdisk-uboot; exit;;
g) generate-ramdisk-uboot; exit ;;
*) echo "Not a valid option. Exiting"; exit ;;
esac

❷ 安卓art虛擬機在什麼位置

一、概述
我們知道Android的程序雖然也是使用Java/Kotlin語言編碼,並生成.class位元組碼,但並不能直接運行在JVM上,而是運行在自己的VM上。而Android程序之所以不能在JVM上運行的根本原因是.class位元組碼文件並不是Android的最終可執行文件(執行頌喚首效率問題),而是一個過渡產物,最終會生成dex文件在Android VM上執行。

1.1 Android虛擬機分類:
Android VM大體分為兩種: Dalvik 虛擬機和 ART虛擬機。

Dilvik 虛擬機:Android 5.0 版本之前。
ART虛擬機:Android 5.0 版本全面使用。
1.2 虛擬機的演變及優化:
Android 1.0,使用Dalvik作為Android虛擬機運行環境,此時的虛擬機是一個解釋執行器。
Android 2.2,Android 虛擬機中加入了JIT編譯器(Just-In-Time Compiler)。
Android 4.4,全新的ART虛擬機運行環境誕生,此時ART和Dalvik是共存的,用戶可以在兩者之間進行選擇。
Android 5.0,ART全面取代了Dalvik成為了Android虛擬機運行環境,並使用AOT預編譯技術在安裝Apk時全量預編譯 。
Android 7.0,ART虛擬機採用 JIT/AOT混合編譯模式。
二、Dalvik
Dalvik是Google公司自己設計用於Android平台的虛擬機,它是Android平台的重要組成部分,支持dex格式(Dalvik Executable)的Java應用程序的運行。dex格式是專門為Dalvik設計的一種壓縮格式,適合內存和處理器速度有限的系統。Google對其進行了特定的優化,經過優化的Dalvik,具有高效、簡潔、節省資源的特點,同時還允許在有限的內存中同時運行多個虛擬機的實例,並且每一個Dalvik 應用作為一個獨立的Linux進程執行。獨立的進程可以防止在虛擬機崩潰的時候所有程序都被關閉。
2.1 Dalvik和JVM的區別
Dalvik 基於寄存器,而 JVM 基於棧。
指令數量:基於寄存器的操作指令,會增加操作數的大小(劣勢),但是會大大減少操作指令的數量(優勢)
操作效率:基於寄存器(CPU上)的指令操作速度比基於操作數棧(主存)的速度快。
移植性:基於寄存器執行效率好,但是可移植性差,難跨平台。
Dalvik虛擬機有共享機制,不同應用之間在運行時可以共享相同的類,擁有更高的效率。
2.2 JIT(Just-In-Time Compile)
Android 2.2之前,Dalvik虛擬機是通過解釋器 (解釋器逐條讀入位元組碼 -> 逐條翻譯成機器碼 -> 執行機器碼)來執行程序的,效率低。針對這個問題,引進了JIT(即時編譯器)技術。它是一種優化手段。

JIT技術:將解釋過的機器碼緩存起來,下次再執行時到這個方法的時候,則直接從緩存裡面取出機器碼來執行。減少了讀取位元組碼和翻譯位元組碼的操作。以此來提高效率。JIT技術的引入使得Dalvik的性能提升了3~6倍。

注意: 並不是所有執行過的代碼對應的機器碼都會被緩存起來。而是只有被認定為熱點代碼(Hot Spot Code) 的代碼才會。這里所指的熱點代碼主要有兩類,包括:
被多次調用的方法
被多次執行的循環體(雖然只是循環體被多次執行,但仍是將整個方法的機器碼緩存起來)。

缺點: JIT技術的缺點:
每次重新啟動引用都需要重新編譯。
運行時比較耗電。
三、ART 虛擬機
ART虛擬機在Android 5.0開始替換Dalvik虛擬機,其處理應用程序執行的方式不同於Dalvik虛擬機,它不使用JIT而是使用了AOT(Ahead-Of-Time),也就是鏈伏提前編譯技術。並對垃圾收集器也進行了改進和優化。

預先編譯機制(AOT)可提高應用的性能。同時ART 還具有比 Dalvik 更嚴格的安裝時驗證。

3.1 AOT(Ahead-Of-Time)預先編譯技術
AOT(提前編譯技術): 簡單來說就是提前將位元組碼轉換成本地機器碼,然後野數存儲在本地磁碟上,運行時可以直接執行,避免了Dalvik時期的應用運行時再來解釋位元組碼。運行時效率大大提高。

在Android 7.0 之前,Android系統安裝Apk時,會進行一次全量預編譯,將位元組碼預先編譯成本地機器碼,生成 oat文件,並存儲在本地磁碟上。這樣在App每次運行時就不需要重新編譯,可以直接使用編譯好本地機器碼,運行效率大大提升。但是這也使得安裝應用的時間大大增加,於是在Android7.0及之後,又重新引進了JIT技術,形成JIT/AOT混合編譯模式。

混合編譯的特點:

應用在安裝的時候,不進行AOT預編譯。
應用運行時直接通過解釋器翻譯位元組碼為機器碼然後執行。(在應用運行期間使用了JIT技術)並同時記錄熱點代碼信息到profile文件中。
手機進入空閑或充電狀態的時候,系統會掃描APP目錄下的profile文件,並通過AOT對熱點代碼進行編譯。
下一次啟動時,會根據profile文件來運行已編譯好的機器碼,避免在運行時對已經轉換為機器碼的方法又進行了JIT編譯。
應用運行期間會持續對熱點代碼進行記錄,以方便在空閑或充電時進行AOT,以此循環。
使用JIT編譯器來對AOT編譯器進行補充,降低了Apk安裝的時間,提升了運行時性能,節省了存儲空間,加快應用運行速度。

小結:
Android 7.0以前,採用AOT全量預編譯,Apk安裝時預編譯dex生成對應的機器碼文件。但預編譯量大導致Apk安裝時間長。
Android 7.0及之後,採用JIT/AOT混合編譯模式,根據對應的profile在空閑時進行AOT預編譯。

參考: 實現 ART 即時 (JIT) 編譯器

3.2 Dalvik與ART虛擬機的區別
Dalvik每次都要編譯再運行,Art只會安裝時啟動編譯(7.0之前全量預編譯)。
Art佔用空間比Dalvik大(原生代碼佔用的存儲空間更大),就是用「空間換時間」。
Art減少編譯,減少了CPU使用頻率,使用明顯改善電池續航。
Art應用啟動更快、運行更快、體驗更流暢、觸感反饋更及時。
3.3 Interpreter解釋器、JIT、AOT的在ART上的使用
解釋器: 逐條讀入位元組碼 -> 逐條翻譯成機器碼 -> 執行機器碼,重復執行同一代碼時需要重新翻譯執行。
JIT編譯器: 對運行時的熱點代碼(熱點代碼)進行編譯,且緩存在內存中,當下次繼續執行時,直接從內存中獲取,減少重復編譯。
AOT編譯器: 在運行前將位元組碼轉換為機器碼,在運行時直接運行轉換後的機器碼。

在這里插入圖片描述

3.4 垃圾回收方面的優化
Android虛擬機(Dalvik && ART)學習

四、Android中的幾種文件
4.1 Apk文件
APK 文件其實是 zip 格式,在Window平台上可以直接將後綴格式改為zip進行解壓。解壓後的目錄如下圖所示:
在這里插入圖片描述

文件名 說明
META-INF/ 信息描述,簽名等用途。編譯生成一個apk包時,會對所有要打包的文件做一個校驗計算,並把計算結果放在META-INF目錄下。而在Android手機上安裝apk包時,應用管理器會按照同樣的演算法對包里的文件做校驗,如果校驗結果與META-INF下的內容不一致,系統就不會安裝這個apk。這就保證了apk包里的文件不能被隨意替換
res/ 存放資源文件
libs/ 存放的是 ndk 編出來的 so 庫
AndroidManifest.xml 程序全局清單文件
classes.dex dalvik 位元組碼
resources.ars 編譯後的二進制資源文件,主要是對應的索引
assets/ 保留工程中assets目錄,其他工程下的、jar包中的assets也會合並到該assets目錄下。
4.2 dex文件
dex 文件是可被Dalvik虛擬機識別並執行的文件, Dalvik 會執行 .dex 文件中的 dalvik 位元組碼,但一般Dalvik在執行dex優化後的文件(即odex文件)。

dex文件特點:

dex文件是Android系統中的一種文件,是一種特殊的數據格式,和Apk、jar等格式文件類似。
文件更加緊湊:dex文件是能夠被DVM識別,載入並執行的文件格式。相比於Jar文件,dex會把所有包含的信息整合在一起,減少冗餘信息,從而降低了載入文件時的I/O耗時,提高類的查找速度。
dex文件包含應用程序的全部操作指令和運行時數據。
相對於PC上的JVM能運行 .class文件,Android上的Dalvik虛擬機能運行 .dex 文件。
.dex文件和 .class文件的格式對照:
在這里插入圖片描述
dex 文件結構:
在這里插入圖片描述

4.3 引起dex文件65535問題的原因
當Android系統啟動一個Apk時,會通過 dexopt 工具對dex進行優化。dexopt 的執行過程是在第一次載入dex文件的時候執行的。這個過程會生成一個odex文件,即Optimised Dex (執行odex的效率會比直接執行Dex文件的效率要高很多)。但早期Android系統中, dexopt 有一個問題(即65535問題)。dexopt會把每一個類的方法id檢索起來,存在一個鏈表結構裡面。但是這個鏈表的長度是用一個 short類型(2^16=65536)來保存的,導致了方法id的數目不能夠超過65536個。
4.4 odex文件 (Optimized DEX)
背景: 對Android dex文件進行優化來說,需要注意的一點是dex文件的結構是緊湊的,但是我們還是要想方設法進行運行速度的提高,因此我們仍然需要對dex文件進一步優化。
odex文件的使用場景:

安裝階段: Apk在安裝時,系統會進行驗證和優化,目的是為了校驗代碼合法性及優化代碼執行速度。當驗證和優化後,系統會從Apk中提取dex文件進行優化,並將優化後的產物(odex文件)保存到 data/dalvik-cache 目錄下。
運行階段: 當運行Apk的時候,會直接載入odex文件,避免重復驗證和優化,加快了Apk的響應時間。
odex 文件的生成過程:

Android 5.0之前:Dalvik虛擬機

Dalvik虛擬機會在執行dex文件前對dex文件做優化,生成可執行文件odex,保存到 data/dalvik-cache 目錄,最後把Apk文件中的dex文件刪除。

注意: 此時生成的odex文件後綴依然是dex ,它是一個dex文件,裡面仍然是位元組碼,而不是本地機器碼。
Android5.0 <= Version < Android 8.0 (Android O):ART虛擬機

Android5.0之後使用ART虛擬機,ART虛擬機使用AOT預編譯生成oat文件。oat文件是ART虛擬機運行的文件,是ELF格式二進制文件。oat文件包含dex和編譯的本地機器指令,因此比Android5.0之前的odex文件更大。

oat文件生成過程:
App在首次安裝的時候,dex2oat 工具默認會把 dex文件翻譯成本地機器指令,生成ELF格式的OAT文件,並將其放在了 /data/dalvik-cache 或 /data/app/packagename/ 目錄下,此時oat文件後綴格式為odex。
ART載入oat文件後不需要經過處理就可以直接運行,它在編譯時就從位元組碼裝換成機器碼了,因此運行速度更快。
Dalvik虛擬機執行程序dex文件前,系統會對dex文件做優化,生成可執行文件odex,保存到 data/dalvik-cache 目錄,最後把apk文件中的dex文件刪除。 (注意:此時生成的odex文件後綴依然是dex ,它是一個dex文件,裡面仍然還是位元組碼,而不是本地機器碼。)

注意: Android5.0及之後版本生成的 oat文件後綴還是odex,但是已經不是android5.0 及之前版本的文件格式,而是ELF格式封裝的本地機器碼。可以認為oat在dex上加了一層殼,可以從oat里提取出dex。
Android O及之後(>=Android 8.0):ART虛擬機

Android 8.0及之後版本,dex2oat會直接生成兩個oat文件 (即vdex文件 和 odex文件)。其中 odex 文件是從vdex 文件中提取了部分模塊生成的一個新的可執行二進制碼文件,odex 從vdex 中提取後,vdex 的大小就減少了。

文件生成過程:
App在首次安裝的時候,odex 文件就會生成在 /system/app/<packagename>/oat/ 下。
在系統運行過程中,虛擬機將其 從/system/app 下 到 /data/davilk-cache/ 下。
odex + vdex = Apk 的全部源碼 (vdex 並不是獨立於odex 的,文件 odex + vdex 才代表一個Apk )。
odex 的優點和缺點:

優點:
啟動快: 省去了系統第一次啟動應用時從Apk文件中讀取dex文件,並對dex文件做優化的過程。和
對RAM的佔用(Apk文件中的dex如果不刪除,同一個應用就會存在兩個dex文件:apk中和 data/dalvik-cache 目錄下)。
安全性:防止第三方用戶反編譯系統的軟體(odex文件是跟隨系統環境變化的,改變環境會無法運行;而apk文件中又不包含dex文件,無法獨立運行)
劣勢:
優化後的odex文件大小通常是原dex文件的1~4倍 (空間換時間)。
4.5 vdex文件
vdex文件是 Android O (Android 8.0) 新增的格式包,其目的是為了降低dex2oat時間。

dex2oat的觸發場景:

當系統OTA (系統升級) 後,用戶自己安裝的應用是不會發生任何變化的,但 framework 代碼已經發生了變化,因此就需要重新對這些應用也做dex2oat。如果沒有vdex文件,則需要重新校驗Apk里dex文件合法性;如果存在vdex文件,就可以省略校驗的過程,節省一部分時間。
當App的 JIT Profile 信息變化時,background dexopt會在後台重新做dex2oat,因為有了vdex,這個時候也可以直接跳過dex文件的校驗流程。
dex 文件直接轉化的可執行二進制碼文件:

App在首次安裝的時候,vdex文件就會生成在 /system/app/<packagename>/oat/下。
在系統運行過程中,虛擬機將其從 /system/app 下 到 /data/davilk-cache/ 下。
4.6 art文件
art文件是由虛擬機執行odex文件後,記錄虛擬機執行Apk啟動的常用函數地址信息後生成出來的文件(記錄函數地址信息方便定址),目的 是用於加快應用啟動速度。通常會在data/dalvik-cache/ 目錄中保存常用的jar包的相關地址記錄。

第一次開機不會生成在 /system/app/<packagename>/oat/ 下,以後也不會。
odex 文件在運行時,虛擬機會計算函數調用頻率,進行函數地址的修改。
最後在 /data/davilk-cache/ 由虛擬機生成 art文件(art文件生成)。
生成 art文件後,/system/app 下的odex 和 vdex 會無效,即使你刪除,apk也會正常運行。
push 一個新的apk file 覆蓋之前 /system/app 下Apk file ,會觸發 PMS 掃描時下發 force_dex 的flag ,強行生成新的vdex 文件 ,覆蓋之前的vdex 文件,由於某種機制,這個新vdex 文件會到 /data/dalvik-cache/ 下,於是 art 文件也變化了。
4.7 oat文件
ART虛擬機運行的是oat文件,oat文件是一種Android私有ELF文件格式,oat文件包含有從dex文件翻譯而來的本地機器指令,還包含有原來的dex文件內容(如下圖所示),因此oat文件比odex文件更大。APK在安裝的過程中,會通過dex2oat工具生成一個OAT文件(文件後綴還是odex)。對於apk來說,oat文件實際上就是對odex文件的包裝,即oat=odex。

注意: Android5.0 及之後的版本,oat文件的後綴還是odex,但是已經不是android5.0 之前的文件格式,而是ELF格式封裝的本地機器碼。可以認為oat在dex上加了一層殼,可以從oat里提取出dex。

❸ android sl4a是什麼

SL4A是Scripting Layer for Android 的縮寫,中文直譯為「安卓的腳本層」,與Android Scripting Environment(ASE)意義相同,據Google官方博客介紹,SL4A將腳本語言帶入Android,允許用戶編輯和執行腳本,直接在Android設備上運行互動式解釋器。
腳本將能大幅度簡化任務界面,用戶能在互動式終端中使用腳本。ASE目前支持Python、Perl、JRuby、Lua、BeanShell、JavaScript、Tcl、shell。

❹ Android逆向 ida動態調試問題

先輸入」adb shell」,然後輸入」su root」獲取root許可權。

接著輸入」 chmod 777 /data/local/tmp/android_server」 給android_server加上相應的許可權。

接著輸入」 /data/local/tmp/android_server」啟動android_server。

如下圖所示:

輸入」adb forward tcp:23946 tcp:23946」進行tcp埠轉發

命令,啟動所要調試的Activity。

app會彈出」Waitting for debugger」對話框,如下圖所示:

點擊」Debug options」按鈕,在」Suspend on process entry point」, 」Suspend on thread start/exit」, 」Suspend on library load/unload」 等選項的前面打上勾,如下圖所示:

點擊」ok」後會在以下對話框的hostname中填上」localhost」

在彈出和物的」Choose process to attach to」窗口中找到」com.example.testjniso」進程,選中該進程,然後點擊」ok」按鈕。

其中可以看到com.example.testjniso進程的埠為8700。

如下圖所示:

在ida彈出的」Add map」窗口中,一律點擊」Cancle」按鈕。

點擊ida中的暫停調試按鈕,暫停當前的調試,如下圖所示:

右擊libTestJniSo.so文件,在彈出的隱告框中點擊」Jump to mole base」,跳轉到libTestJniSo.so文件的起始地址。

按下Alt+T,彈出查找對話框中輸入」 Java_com_example_testjniso_MainActivity_helloFromJni」 如下圖所示:

點擊」ok」按鈕後,即可跳轉到 Java_com_example_testjniso_MainActivity_helloFromJni 函數所在的起始地址。

然後在地址處下斷點喚攜液:

再按F9重新開始調試,點擊app中的」點擊載入so文件」按鈕重新載入libTestJniSo.so,即可看到程序成功地停在了斷點處:

到此處就可以正常地調試so文件了。

Linker是什麼?
Linker就是/system/lib/linker,它是進程啟動時第一個載入的模塊,它負責管理elf可執行文件以及各個so文件的載入執行,還參與了調試的一些東西。通俗地說,它是一個elf文件的解釋器。它可以載入elf可執行文件及so動態庫。

在android 5.0下,不能執行android_server是因為android5.0自帶的linker不支持載入非pie的elf文件,但如果自己實現一個可以載入pie的linker,不就可以解決這個問題了嗎?對的,就是醬紫,補上自己的自定義linker在附件.

https://bbs.pediy.com/thread-206084.htm

❺ Android各版本虛擬機的Dexopt區別

從Android 2.1版本到現在的Android 11 , 中間虛擬機變化過三次 :

對於5.0以下的版本 , 載入Multidex的時候 , 會優先判斷 odex 是否存在 , 如果不存在 , 則會通過dexopt生成odex , 然後再載入odex , 同時 , 如果存在 多個Dex文件 的話 , Dexopt 也會執行多次.

使用Dalvik虛擬機 , 生成odex文件 . Dalvik採用的是JIT編譯+解釋器,也就是即時編譯,每次應用運行時會實時將Dex翻譯成機器碼.

使用ART虛擬機 , 生成oat文件. 在ROM OTA或者恢復出場設置後 , 會要進行dex2oat根據當前ROM進行重新編譯生成.oat文件.

使用ART虛擬機 , 但是在7.0之上 , 增加了 .vdex 與 .art 機制 , 在ART虛擬機再次啟動/升級 , 載入Dex/Oat文件時 , 會減少Dex的校驗時間 , 提升載入與運行效率

在ART虛擬機的基礎上 , 增加了 Cdex ( Compat Dex ) 機制 ,

compat_dex_file.h

在dex2oat的時候 , 會有一個目標編譯類型 , 會有以下幾類 , 根據時機不同dex2oat的編譯方式也會不同

配置

熱點內容
預編譯頭子目錄 發布:2025-05-09 23:05:39 瀏覽:175
出軌資料庫 發布:2025-05-09 22:48:47 瀏覽:149
java過濾器的作用 發布:2025-05-09 22:44:06 瀏覽:858
定投策略演算法 發布:2025-05-09 22:21:36 瀏覽:602
梯形糾正演算法 發布:2025-05-09 22:16:46 瀏覽:718
解壓心跳聲 發布:2025-05-09 22:16:10 瀏覽:719
如何取消安卓手機程序隱私密碼 發布:2025-05-09 21:48:03 瀏覽:48
c語言字元串數組連接 發布:2025-05-09 21:46:37 瀏覽:133
源碼的移碼 發布:2025-05-09 21:25:01 瀏覽:754
ie內核緩存 發布:2025-05-09 21:19:35 瀏覽:545