編輯:關於Android編程
首先我們來看下dex文件的格式:
class_defs的結構:
(1) class_idx 描述具體的 class 類型 ,值是 type_ids 的一個 index 。值必須是一個 class 類型 ,不能是數組類型或者基本類型 。
(2) access_flags 描述 class 的訪問類型 ,諸如 public , final , static 等 。在 dex-format.html 裡 “access_flags Definitions” 有具體的描述 。
(3) superclass_idx , 描述 supperclass 的類型 ,值的形式跟 class_idx 一樣 。
(4) interfaces_off , 值為偏移地址 ,指向 class 的 interfaces , 被指向的數據結構為 type_list 。class 若沒有 interfaces ,值為 0。
(5) source_file_idx , 表示源代碼文件的信息 ,值是 string_ids 的一個 index 。若此項信息缺失 ,此項值賦值為 NO_INDEX=0xffff ffff 。
(6) annotions_off , 值是一個偏移地址 ,指向的內容是該 class 的注釋 ,位置在 data 區,格式為 annotations_direcotry_item 。若沒有此項內容 ,值為 0 。
(7) class_data_off , 值是一個偏移地址 ,指向的內容是該 class 的使用到的數據 ,位置在 data 區,格式為 class_data_item 。若沒有此項內容 ,值為 0 。該結構裡有很多內容 ,詳細描述該 class 的 field , method , method 裡的執行代碼等信息 ,後面有一個比較大的篇幅來講述 class_data_item 。
(8) static_value_off , 值是一個偏移地址 ,指向 data 區裡的一個列表 ( list ) ,格式為 encoded_array_item 。若沒有此項內容 ,值為 0 。
重點關注下(5),這一項代表的是源文件的名字。因此,一種可行的方案是往dex中添加一個項目中根本就用不到的類,然後修改source_file_idx,因為用不到,所以運行時不會報錯的,但是但編譯工具在做靜態解析的時候,就會解析不出來而報錯!
然後看下頭部的具體組成部分:
(1)magic value
這 8 個 字節一般是常量 ,為了使 .dex 文件能夠被識別出來 ,它必須出現在 .dex 文件的最開頭的位置 。
(2)checksum 和 signature
4字節的文件校驗碼 ,使用alder32 算法校驗文件除去 maigc ,checksum 外余下的所有文件區域 ,用於檢查文件錯誤 。
20個字節的signature , 使用 SHA-1 算法 hash 除去 magic ,checksum 和 signature 外余下的所有文件區域 ,用於唯一識別本文件 。
從上面的結構可以看出來,如果是修改了source_file_idx,那麼要同時修改signature 和checksum 。
總結步驟如下:
(1)項目源碼打包成jar包(混淆)以後,添加進入一個無用的類x.x.x.x.x.x。
(2)把新的jar包轉換成dex
(3)修改dex中x.x.x.x.x.x類的 source_file_idx。
(4)重新計算signature 。
(5)重新計算checksum 。
(6)更新dex。
(7)正常打包簽名安裝。
Android中的Intent是一個非常重要且常用的類,可以用來在一個組件中啟動App中的另一個組件或者是啟動另一個App的組件,這裡所說的組件指的是Activity、S
顯示地圖和定位對於一個地圖SDK來說,首先要顯示地圖,然後定位到當前城市。這方面百度地圖和高德地圖的處理代碼差不多,下面是兩種地圖sdk顯示並定位的代碼例子:百度地圖//
天天看高清影視片庫無法連接,不知道為什麼老是連接不上,下面是我總結了一下為什麼會這樣的問題,看能不能在裡面找到你們所需要的,幫你們解決天天看高清影視出現的問
由於Android並未提供滑動開關之類的組件,所以我們需要自己去實現一個自定義的視圖組件來實現滑動開關效果。 這裡有一個示例代碼,它包括三個類:開關組件視圖、狀態監聽接口