背景:安卓編包有個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...