jar ファイルで使用されているすべてのメソッドの数を取得できますか。私の APK は特定の外部 JARS を使用しており、正確には約 100 のクラスがあります。
dex2jar JAD などの逆コンパイラを使用していくつか例を挙げましたが、それらはすべて特定のクラス ファイルでのみメソッドを表示しているようです。
合計数を取得する方法はありますか?
jar を dex ファイルに変換してから、ヘッダーからメソッド参照の数を引き出すことができます。これは、オフセット 88 (0x58) に符号なしリトルエンディアン整数として格納されます。
dx --dex --output=temp.dex orig.jar
cat temp.dex | head -c 92 | tail -c 4 | hexdump -e '1/4 "%d\n"'
これは、メソッド参照の数ではなく、参照された一意のメソッドの数であることに注意してください。つまり、特定のメソッドが dex ファイルで 2 回参照されている場合、ヘッダーのカウントでは 1 回だけカウントされます。そして、この jar を apk にインポートすると、2 つの間で共通のメソッド参照が重複排除されるため、最終的にマージされた apk の合計メソッド参照カウントは <= 2 つの合計になります。
この gradle プラグインhttps://github.com/KeepSafe/dexcount-gradle-pluginは、アセンブル後の合計メソッド数を表示し、各パッケージのメソッド数を含むレポートも生成します。ソート後は次のようになります。
30145 com
27704 org
20950 android
17140 org.spongycastle
16605 android.support
9760 com.google
8930 com.fasterxml.jackson
8930 com.fasterxml
8633 android.support.v4
7020 com.fasterxml.jackson.databind
6426 android.support.v7
5311 com.google.protobuf
4705 org.spongycastle.crypto
...
gradle コマンドと組み合わせて
.\gradlew app:dependencies
これにより、依存関係ツリーが出力され、どの依存関係にいくつのメソッドが必要かの概要がわかります。
http://github.com/mihaip/dex-method-countsを使用して、どこからでもメソッドの数を計算します (JAR、AAR、DEX、APK)
./dex-method-counts <your_file_path>.DEX
また
./dex-method-counts <your_file_path>.APK
上に示したように、次のように JAR から DEX を作成するだけです。
<your_path_to_android_buil_tools>/dx --dex --output=temp.dex orig.jar
その後
./dex-method-counts temp.dex
最初にそれを解凍します(ええ、AARは実際にはZIPです)。次に、上記のJARセクションで示したようにclasses.jarを使用します
unzip mylib.aar -d mylib
dx --dex --output=temp.dex mylib/classes.jar
dex-method-counts temp.dex
Cyvis.jar
はファイルまたはファイルを読み取ることができ.class
、合計メソッド数と各メソッドの循環的複雑度および命令数の両方を表示します。GUIは少し...ポータブルです...しかし、Ubuntuで実行したところ、Windowsで動作すると表示されます。ライブラリが問題を引き起こす可能性についての最初の情報源としてはかなり良いようです。
-x パラメータを指定して jar プログラムを使用し、jarファイルからファイルを抽出し ます。
各 .class ファイルに逆コンパイラを適用して、各ファイル内のメソッドの数を取得します。
メソッド数を合計します。
Gradleライブラリでメソッドカウントを見つけるには、これを使用できます - http://www.methodscount.com
また、Android Studio 用のプラグインも提供します。
ソースコードを持っている (またはダウンロードできる) 場合、Sonarはこのような静的解析を行います。また、実行しようとしていることに役立つ可能性のある他の複雑さの指標を確認することもできます。(あなたが何をしようとしているのか教えてくれるとうれしいかもしれません。;))
コマンドラインを使用して、JAR を解凍した後、次のように動作するはずです。
for f in *.class; do javap -c $(basename -s .class $f) | grep invoke | sed 's/.*Method\(.*\)/\1/g'; done | wc -l
(public|protected|private|static|\s) +[\w\<\>\[\]]+\s+(\w+) *\([^\)]*\) *(\{?|[^;])
を使用してプロジェクト内を検索しCTRL+SHIFT+F
ます。それは私を助けました