自動化實戰1 實現檢查dex檔案,獲取方法數

2021-10-08 06:12:02 字數 3315 閱讀 8901

背景:安卓編包有個65535規則,所有dex檔案的方法數和field數值都不能超過65535,否則會導致編包失敗,因此在研發過程中需要對分支包的方法數進行監控。

實現邏輯:

1.採用dexdump工具對dex檔案進行解析;

dexdeump -f 

>

1.txt

2.獲取apk包路徑,將其變成zip檔案(zip格式檔案才能實現解壓獲取dex檔案);

傳入的apk複製乙份至本地目錄下(避免修改到原檔案),將複製後的apk利用rename(

)重新命名為test.

zip,後續對test.

zip進行解壓獲取

3.定義函式一,實現獲取dex數量

**中定義get_dex(

),利用os.system(

)執行dexdump命令獲取方法數並返回

4.提取所要檢查的dex檔案,呼叫3

zip中有很多檔案,提取出我們想要的dex檔案,後續對該目錄下的dex檔案進行解析即可
5.輸出完成後將過程中建立的檔案和資料夾都刪掉,避免占用空間

主要運用shutil.rmtree(

)對非空資料夾進行刪除,os.remove(

)對檔案進行刪除

6.編譯為exe檔案,執行不受環境限制。

py檔案執行需要python編譯環境,為更加方便其他人使用,利用pyinstaller打包為exe檔案。

pyinstaller -f get_dex_count.py

**實現:

'''

獲取主dex、othermain、extlib方法數

'''import os

import shutil

import zipfile

class

getdexcount

(object):

defget_dex

(self, path)

: os.system(

'dexdump -f '

+ path +

' > '

+'1.txt'

) dex_txt_path = os.path.abspath(

'1.txt'

)try

:# apk_size = round(os.path.getsize(path)/(1024*1024),2)

with

open

(dex_txt_path,

'r', encoding=

'utf-8'

)as f:

for i in f.readlines():

if'field_ids_size'

in i:

field_count = i.split(

':')[1

].strip(

'\n'

)elif

'method_ids_size'

in i:

method_count = i.split(

':')[1

].strip(

'\n'

)break

return field_count, method_count

except filenotfounderror as msg:

print

(msg)

defprint_dex_count

(self, apk_zip, dex_dst_dir):if

not os.path.exists(dex_dst_dir)

: os.mkdir(dex_dst_dir)

if zipfile.is_zipfile(apk_zip)

: apk_file = zipfile.zipfile(apk_zip,

'r')

forfile

in apk_file.namelist():

iffilein[

'classes.dex'

,'classes12.dex'

,'classes2.dex']:

apk_file.extract(

file

, dex_dst_dir)

try:

for home, dirs, dex_file in os.walk(dex_dst_dir)

:for i in dex_file:

dex_path = os.path.join(home, i)

field_count, method_count = self.get_dex(dex_path)

print

('******'

+i+'********'

)print

('field_count:'

+str

(field_count)

)print

('method_count:'

+str

(method_count)

)except filenotfounderror as msg:

print

(msg)

else

:print

("not zip"

)if __name__ ==

'__main__'

: path = os.getcwd(

) dex_dst_dir = path +

'\\dex'

apk =

input

("拖入apk:"

) apk_file = shutil.copy(apk, dex_dst_dir)

zip_file =

'test.zip'

if os.path.exists(zip_file)

: os.remove(zip_file)

os.rename(apk_file, zip_file)

#可以重新命名也可以修改路徑

getdexcount(

).print_dex_count(zip_file, dex_dst_dir)

os.remove(zip_file)

shutil.rmtree(dex_dst_dir)

os.remove(

'1.txt'

) os.system(

'pause'

)

自動化測試 實戰1

媽呀。老淚縱橫。終於在老大的n次幫助下。執行出來了。我這只小菜鳥不得不驚嘆於自動化的神奇。觸屏站自助查詢 1 點查詢按鈕點不過去 public void nextstep throws exception 2 明明證件號碼取到了值,但是就輸不進控制項裡去,原來是這控制項的名字不唯一,老大幫我在web...

python實現介面自動化(1)

http簡介 http協議是什麼呢,是乙個基於 請求 與 響應 模式的,無狀態,應用層的協議 url詳解 http https 為兩種協議型別,第一種為不加密的,第二種加密的 www.baidu.com 稱為主機位址或者網域名稱 192.168.1.1 8080 位址加埠號 localhost808...

pytest自動化運用實戰

環境 python 3.7 由於3.0 3.5以下部分pytest可能有部分相容問題安裝建議2.7 2.9,3.5 最新 pip install pytest專屬 pytest框架包 pip install allure pytest 專屬allure的報告包後面會用到可以不安裝這裡 pip ins...