apk文件,即Android application package文件。
每個要安裝到Android平臺的應用都要被編譯打包為一個單獨的文件,后綴名為.apk,其中包含了應用的二進制代碼、資源、配置文件等。APK文件其實是zip格式,但后綴名被修改為apk,
在Android 系統安裝時,APK 程序會被存放在系統默認的APP 目錄中。
既然是一個Zip壓縮包,那我們就不妨先解壓出來看看其目錄結構和內容,在我這我以NDK中的two-libs為例,以NDK為例,主要是要在本文中介紹SDK和NDK結合打包的方法。先看圖:
其實這個目錄結構與源代碼的目錄結構類似,接下來我們對比看看源代碼(我用的是eclipse):
看見沒有,幾乎就是一樣的!接下來挨個介紹下apk中個文件及目錄的內容和作用吧,一下資料來源于網絡和官方文檔當然還有個人理解。
?AndroidManifest.xml
該文件是每個應用都必須定義和包含的,它描述了應用的名字、版本、權限、引用的庫文件等等信息[ , ],如要把apk上傳到Google Market上,也要對這個xml做一些配置。在apk中的AndroidManifest.xml是經過壓縮的,可以通過AXMLPrinter2工具[ , ]解開,具體命令為:java -jar AXMLPrinter2.jar AndroidManifest.xml
?META-INF目錄
META-INF目錄下存放的是簽名信息,用來保證apk包的完整性和系統的安全。在eclipse編譯生成一個apk包時,會對所有要打包的文件做一個校驗計算,并把計算結果放在META-INF目錄下。這就保證了apk包里的文件不能被隨意替換。比如拿到一個apk包后,如果想要替換里面的一幅圖片,一段代碼, 或一段版權信息,想直接解壓縮、替換再重新打包,基本是不可能的。如此一來就給病毒感染和惡意修改增加了難度,有助于保護系統的安全。
?res目錄
????? res目錄存放資源文件。包括圖片,字符串等等。
?lib目錄
lib目錄下的子目錄armeabi存放的是一些so文件。這個地方多講幾句,都是在開發過程中摸索出來的。eclipse在打包的時候會根據文件名的命名規則(lib****.so)去打包so文件,開頭和結尾必須分別為“lib”和“.so”,否則是不會打包到apk文件中的。其他非eclipse開發環境沒有測試過。如果你是用SDK和NDK開發的話,這部分很重要,甚至可以通過把一些不是so文件的文件通過改名打包到apk中,具體能干些什么那就看你想干什么了,呵呵呵!
?assets目錄
assets目錄可以存放一些配置文件,這些文件的內容在程序運行過程中可以通過相關的API獲得。具體的方法可以參考SDK中的例子:在sdk的 \SDK\1.6\android-sdk-windows-1.6_r1\platforms\android-1.6\samples\ApiDemos 例子中,有個com.example..android.apis.content 的例子,在這個例子中他把一個text文件放到工程的asset目錄下,然后把這個txt當作普通文件處理。處理的過程在ReadAsset.java中。同理,asset也可以放置其他文件。
?classes.dex文件
????? classes.dex是java源碼編譯后生成的java字節碼文件。但由于Android使用的dalvik虛擬機與標準的java虛擬機是不兼容的,dex文件與class文件相比,不論是文件結構還是opcode都不一樣。目前常見的java反編譯工具都不能處理dex文件。Android模擬器中提供了一個dex文件的反編譯工具,dexdump。用法為首先啟動Android模擬器,把要查看的dex文件用adb push上傳的模擬器中,然后通過adb shell登錄,找到要查看的dex文件,執行dexdump xxx.dex。另,有人介紹到Dedexer是目前在網上能找到的唯一一個反編譯dex文件的開源工具,需要自己編譯源代碼。
?resources.arsc
????? 編譯后的二進制資源文件
其中其他的res下的資源文件也可以完全的無縫的反編譯出來,所以拿到一個優秀的軟件我們在看布局更方便了,首先可以通過布局查看器來看布局,甚者就可以把他的layout都反編譯出來,但這樣也有些安全問題,不通過二進制存儲的資源可以直接被替換。
對于更詳細的換膚,詳見
http://xy0811.spaces.live.com/Blog/cns!F8AECD2A067A6B17!1513.entry
每個要安裝到Android平臺的應用都要被編譯打包為一個單獨的文件,后綴名為.apk,其中包含了應用的二進制代碼、資源、配置文件等。APK文件其實是zip格式,但后綴名被修改為apk,
在Android 系統安裝時,APK 程序會被存放在系統默認的APP 目錄中。
既然是一個Zip壓縮包,那我們就不妨先解壓出來看看其目錄結構和內容,在我這我以NDK中的two-libs為例,以NDK為例,主要是要在本文中介紹SDK和NDK結合打包的方法。先看圖:
其實這個目錄結構與源代碼的目錄結構類似,接下來我們對比看看源代碼(我用的是eclipse):
看見沒有,幾乎就是一樣的!接下來挨個介紹下apk中個文件及目錄的內容和作用吧,一下資料來源于網絡和官方文檔當然還有個人理解。
?AndroidManifest.xml
該文件是每個應用都必須定義和包含的,它描述了應用的名字、版本、權限、引用的庫文件等等信息[ , ],如要把apk上傳到Google Market上,也要對這個xml做一些配置。在apk中的AndroidManifest.xml是經過壓縮的,可以通過AXMLPrinter2工具[ , ]解開,具體命令為:java -jar AXMLPrinter2.jar AndroidManifest.xml
?META-INF目錄
META-INF目錄下存放的是簽名信息,用來保證apk包的完整性和系統的安全。在eclipse編譯生成一個apk包時,會對所有要打包的文件做一個校驗計算,并把計算結果放在META-INF目錄下。這就保證了apk包里的文件不能被隨意替換。比如拿到一個apk包后,如果想要替換里面的一幅圖片,一段代碼, 或一段版權信息,想直接解壓縮、替換再重新打包,基本是不可能的。如此一來就給病毒感染和惡意修改增加了難度,有助于保護系統的安全。
?res目錄
????? res目錄存放資源文件。包括圖片,字符串等等。
?lib目錄
lib目錄下的子目錄armeabi存放的是一些so文件。這個地方多講幾句,都是在開發過程中摸索出來的。eclipse在打包的時候會根據文件名的命名規則(lib****.so)去打包so文件,開頭和結尾必須分別為“lib”和“.so”,否則是不會打包到apk文件中的。其他非eclipse開發環境沒有測試過。如果你是用SDK和NDK開發的話,這部分很重要,甚至可以通過把一些不是so文件的文件通過改名打包到apk中,具體能干些什么那就看你想干什么了,呵呵呵!
?assets目錄
assets目錄可以存放一些配置文件,這些文件的內容在程序運行過程中可以通過相關的API獲得。具體的方法可以參考SDK中的例子:在sdk的 \SDK\1.6\android-sdk-windows-1.6_r1\platforms\android-1.6\samples\ApiDemos 例子中,有個com.example..android.apis.content 的例子,在這個例子中他把一個text文件放到工程的asset目錄下,然后把這個txt當作普通文件處理。處理的過程在ReadAsset.java中。同理,asset也可以放置其他文件。
?classes.dex文件
????? classes.dex是java源碼編譯后生成的java字節碼文件。但由于Android使用的dalvik虛擬機與標準的java虛擬機是不兼容的,dex文件與class文件相比,不論是文件結構還是opcode都不一樣。目前常見的java反編譯工具都不能處理dex文件。Android模擬器中提供了一個dex文件的反編譯工具,dexdump。用法為首先啟動Android模擬器,把要查看的dex文件用adb push上傳的模擬器中,然后通過adb shell登錄,找到要查看的dex文件,執行dexdump xxx.dex。另,有人介紹到Dedexer是目前在網上能找到的唯一一個反編譯dex文件的開源工具,需要自己編譯源代碼。
?resources.arsc
????? 編譯后的二進制資源文件
其中其他的res下的資源文件也可以完全的無縫的反編譯出來,所以拿到一個優秀的軟件我們在看布局更方便了,首先可以通過布局查看器來看布局,甚者就可以把他的layout都反編譯出來,但這樣也有些安全問題,不通過二進制存儲的資源可以直接被替換。
對于更詳細的換膚,詳見
http://xy0811.spaces.live.com/Blog/cns!F8AECD2A067A6B17!1513.entry
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
