【工具】統計jar包和apk中的java方法數

【工具】統計jar包和apk中的java方法數 :http://www.baidufe.com/item/5891ec6f737268c7f675.html html

這兩天被Unable to excute DX的問題纏身,工程太大,方法數量超過65536限制,開發正常build都是you有問題的!納悶兒爲何Google要搞這個64K方法數的限制?通常大點兒的工程,引入的jar包很多的話,都會超過這個限制。
java

今天弄了兩個小工具,分別用於統計jar包和apk中java方法的數量,工具名稱分別爲:jarmethod.sh 和 apkmethod.sh,兩個工具在Linux環境下跑,分享給你們:android

一、jarmethod.sh工具,用於統計jar包中的方法數,腳本內容以下,將其保存爲jarmethod.sh便可:shell

#! /bin/sh
   
# 得到輸入的jar文件
JAR_FILE=$1;
   
# 這裏直接使用dx命令,是由於我已經提早配置好了環境變量,dx目錄位於:
# $ANDROID_HOME/sdk/build-tools/android-4.3.1/dx
dx --dex --verbose --no-strict --output=temp.dex $JAR_FILE > /dev/null
   
# 計算jar包中的方法數
METHOD_COUNT=`cat temp.dex | head -c92 | tail -c4 | hexdump -e '1/4 "%d\n"'`
   
# 顯示結果
echo $METHOD_COUNT
   
# 刪除臨時文件temp.dex
rm -f temp.dex

爲了使用起來更方便,建議將其添加一個軟鏈到bin目錄,好比能夠這樣:工具

# 先更改下權限
chmod 0755 jarmethod.sh
  
# 軟連到bin目錄,這樣能夠在任何目錄直接執行該工具
cd /usr/local/bin
ln -s ~/Document/Tool/jarmethod.sh jarmethod

OK ,這個時候能夠到任何目錄去使用該工具了,如:ui

# 直接在工具後面指定jar包地址便可
jarmethod ~/tieba/libs/browser-sdk.jar

如上命令執行後,將會輸出方法數:4245spa

二、apkmethod.sh工具,用於統計apk包中的java方法數,腳本內容以下,將其保存爲apkmethod.sh便可:code

#! /bin/sh
  
# 得到完整apk路徑
APK_PATH=$1
  
# 建立一個臨時目錄,來解壓這個apk文件
rm -rf apk_temp
mkdir apk_temp
cp $APK_PATH apk_temp/
cd apk_temp
  
# 得到apk的名稱
APK_NAME="$(basename *.apk)"
  
# 重命名爲zip
mv $APK_NAME $APK_NAME.zip
  
# 解壓apk,獲得classes.dex包
unzip -x $APK_NAME.zip > /dev/null
  
# 計算dex中的method數量
METHOD_COUNT=`cat classes.dex | head -c92 | tail -c4 | hexdump -e '1/4 "%d\n"'`
  
# 輸出method數量
echo $METHOD_COUNT
  
# 刪除無用目錄
cd .. && rm -rf apk_temp
#! /bin/sh
APK_FILE=$1
rm -rf apktemp
mkdir apktemp
cp $APK_FILE  apktemp/
cd apktemp
APK_NAME=${filename%.*}
mv $1 $APK_NAME.zip
unzip -x $APK_NAME.zip >/dev/null
METHOD_COUNT=`cat classes.dex | head -c92 | tail -c4 | hexdump -e '1/4 "%d\n"'`
seconddex=classes2.dex
if [ -f "$seconddex" ]; then
   METHOD_COUNT_TWO=`cat classes2.dex | head -c92 | tail -c4 | hexdump -e '1/4 "%d\n"'`
fi
echo $1  dex method num: $METHOD_COUNT
if [ ! -n "$METHOD_COUNT_TWO" ]; then
   echo ''
else
   echo $1 dex2 method num: $METHOD_COUNT_TWO
fi
cd .. && rm -rf apktemp


使用方法同jarmethod,軟鏈方式略,使用方式以下:orm

# 直接在工具後面指定apk地址便可
apkmethod ~/tieba/tieba.apk

如上命令執行後,會輸出apk包中的方法數:58370htm


apk在打包的時候,是能夠進行混淆的(proguard),而這個混淆的工做,是在生成dex包後進行的!因此,這個65536的限制,是對混淆以前的dex包而言的,值得注意!

相關文章
相關標籤/搜索