安卓資源文件編譯成位元組碼
『壹』 apk軟體是用什麼語言編寫和編譯的如何開發滴
apk
APK是AndroidPackage的縮寫,即Android安裝包(anapk)。APK是類似Symbian
Sis或Sisx的文件格式。通過將APK文件直接傳到Android模擬器或Android手機中執行即可安裝。
apk文件和sis一樣最終把android
sdk編譯的工程打包成一個安裝程序文件格式為apk。
APK文件其實是zip格式,但後綴名被修改為apk,通過UnZip解壓後,可以看到Dex文件,Dex是Dalvik
VM
executes的全稱,即Android
Dalvik執行程序,並非java
ME的位元組碼而是Dalvik位元組碼。一個APK文件結構為:
META-INF
Jar文件中常可以看到
res
存放資源文件的目錄
AndroidManifest.xml
程序全局配置文件
classes.dex
Dalvik位元組碼
resources.arsc
編譯後的二進制資源文件總結下我們發現Android在運行一個程序時首先需要UnZip,然後類似Symbian那樣直接,和Windows
Mobile中的PE文件有區別,這樣做對於程序的保密性和可靠性不是很高,通過dexmp命令可以反編譯,但這樣做符合發展規律,微軟的
Windows
Gadgets或者說WPF也採用了這種構架方式。在Android平台中dalvik
vm的執行文件被打包為apk格式,最終運行時載入器會解壓然後獲取編譯後的androidmanifest.xml文件中的permission分支相關的安全訪問,但仍然存在很多安全限制,如果你將apk文件傳到/system/app文件夾下會發現執行是不受限制的。最終我們平時安裝的文件可能不是這個文件夾,而在android
rom中系統的apk文件默認會放入這個文件夾,它們擁有著root許可權。
『貳』 Android的APK包里的文件類型都是什麼
一個APK文件結構為: res/ 存放資源文件的目錄 META-INF/ Jar文件中常可以看到 resources.arsc 編譯後的二進制資源文件,主要是程序中使用字元串! AndroidManifest.xml 程序全局配置文件 classes.dex Dalvik位元組碼文件,我們寫的JAVA文件被編譯成DEX格式的位元組碼了 總結下我們發現Android在運行一個程序時首先需要UnZip,然後類似Symbian那樣直接,和Windows Mobile中的PE文件有區別,這樣做對於程序的保密性和可靠性不是很高,通過dexmp命令可以反編譯,但這樣做符合發展規律,微軟的 Windows Gadgets或者說WPF也採用了這種構架方式。 1. Java文件-----應用程序源文件 我想這是大家聽到android時就聽到的文件,android本身相當一部分都是用java編寫而成(基本上架構圖里頭藍色的部份都是用Java開發的),android的應用必須使用java來開發。 2. Class文件------Java編譯後的目標文件 不像通常我們使用的J2se,java編譯成class就可以直接運行,android平台上class文件不能直接在android上運行。由於Google使用了自己Dalvik來運行應用,所以這里的class也肯定不能在sun的java環境中運行,我個人感覺android的class文件實際上只是編譯過程中的中間目標文件,需要鏈接成dex文件後才能在dalvik上運行。 3. Dex文件-----Android平台上的可執行文件 Android虛擬機Dalvik支持的位元組碼文件格式Google在新發布的Android平台上使用了自己的Dalvik虛擬機來定義,這種虛擬機執行的並非Java位元組碼,而是另一種位元組碼:dex格式的位元組碼。在編譯Java代碼之後,通過Android平台上的工具可以將Java位元組碼轉換成Dex位元組碼。雖然Google稱Dalvik是為了移動設備定做的,但是業界很多人認為這是為了規避向sun申請Java license。由於沒有太多的細節公開,現在還找不到Dalvik的具體實現,只能根據SDK做一些簡單的分析工作。 這個Dalvik VM針對手機程式/CPU做過最佳化,可以同時執行許多VM而不會佔用太多Resource,Dalvik VM的source目前還沒有開放讓人下載(未來整個系統都會開放),目前Google的角度是希望能讓大家用這套SDK開始開發AP,底層的東西會慢慢發布。 4. Apk文件-------Android上的安裝文件 Apk是Android安裝包的擴展名,一個Android安裝包包含了與某個Android應用程序相關的所有文件。 apk文件將AndroidManifest.xml文件、應用程序代碼(.dex文件)、資源文件和其他文件打成一個壓縮包。
『叄』 求助:Android逆向涉及到的dalvik位元組碼和smali文件,ARM匯編三者的聯系和區別是什麼
dalvik位元組碼就是smali或者(java)用編譯產生的dalvik可執行文件
ARM匯編,是操作晶元級的指令集。這三個東西不在一個層面
android
|(編譯產生.dex,也可理解為smali壓縮文件,也就是虛機可執行文件)
dalvik虛機
|
ARM匯編
|
硬體
『肆』 什麼是程序源代碼文件,什麼是編譯後生成的位元組碼文件
你好,你在編寫程序的時候,將寫的代碼保存到一個文件中,而這個文件的格式是.java。這樣的文件就是源代碼文件。經過javac編譯後,生成的.class文件就是位元組碼文件。
『伍』 如何反編譯Android 的apk/dex/odex,獲得源碼
關於APK,DEX的介紹
當我們編譯一個安卓項目的時候,整個項目會被打包成一個 .apk文件。這個文件其實是一個標準的zip文件,因此可以用解壓縮工具打開。這個apk文件一般都包含程序的代碼(在classes.dex文件中), 資源文件, 證書, manifest 文件等。 其中對我們最重要的是classes.dex文件,因為編譯後的位元組碼(bytecode)都是放在這個文件中。我們後面講的反編譯就是針對這個dex文件來的。
反編譯普通的APK文件:
對於普通的APK/DEX文件的反編譯,其實工具有很多, 包括:
ByteCode Viewer: 一個可視化的集成工具,說實話,不太好用,不夠穩定,生成代碼質量中等。
dex2jar + jd_gui: 這兩個工具組合還可以, 用起來比ByteCode Viewer麻煩一些,但比較穩定,生成代碼質量中等。
在線反編譯工具JADX: http://www.javadecompilers.com/apk , 這是基於SourceForge上的JADX的開源工具來實現的。本來以為在線反編譯質量不會好,但出人意料的是:JADX是我發現的最好的反編譯工具, 不但使用簡單(直接上傳,轉換,下載就ok),而且反編譯出來的代碼質量很高,特別是變數命名方面,可讀性很不錯。
反編譯ODEX文件:
Android 5.0 Lollipop以後,Google用ART代替了以前的Dalvik,對於普通的app來說我們仍然可以用上面的方法來把dex文件反編譯成Java源代碼。但對於系統預裝的App,特別是類似應用商店,播放器等, 你會發現這些應用的apk文件中找不到對應的classes.dex文件,而是會發現在其子目錄下有個.odex文件。 那如何反編譯這個odex文件呢?我通過google查了查,知道應該用baksmali,但從github上下載了幾個版本都不行,報各種不同錯誤。經過反復搜索和嘗試,終於找到了這篇文章
: http://www.naldotech.com/how-to-deodex-applications-on-android-5-0-lollipop/ 。 具體方法如下:
1. 從這里下載工具包, 解壓縮到本地。 這里的baksmali的版本是2.0.3. 不同版本的baksmali針對的Android內核不同。有時候高版本反倒不好用。
2. 打開工具所在目錄, 按住shift鍵, 點擊滑鼠右鍵,打開windows命令窗口
3. 把 odex文件拷貝到該目錄
4. 在命令窗口運行: oat2dex.bat *.odex. 正常情況下,應該顯示OK等信息。如果報錯的話,說明這個文件無法轉換,後面的也不用試了。
5. 運行 oat2dex.bat *.odex temp.dex . 運行後會創建一個temp.dex文件。
6. 運行 java -jar baksmali-2.0.3.jar -a 21 -x temp.dex -o source . 運行後會創建一個source的文件夾,並將temp.dex反編譯到該文件夾。-a 21 表明的是Android內核的版本21
7. 運行 java -jar small-2.0.3.jar -a 21 source -o classes.dex, 反編譯為classes.dex文件。
需要注意的是:由這種方式反編譯成的classes.dex 文件相比原生的classes.dex 還是缺少了些信息,因此反編譯這種classes.dex 文件後生成的java代碼可讀性會更差些。
8. 用在線工具JADX 來把 classes.dex 最終反編譯為java代碼。
『陸』 android中怎麼把圖片資源(png,jpg 等等)轉換成 byte數組
直接用流啊
『柒』 android問題 如何將drawable中的圖片轉換成byte
//從資源中獲取BitmapResources res = getResources(); Bitmap bmp = BitmapFactory.decodeResource(res, R.drawable.icon);//Bitmap → byte[]public byte[] Bitmap2Bytes(Bitmap bm) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); bm.compress(Bitmap.CompressFormat.PNG, 100, baos); return baos.toByteArray(希望對你有用