33

jar ファイルで使用されているすべてのメソッドの数を取得できますか。私の APK は特定の外部 JARS を使用しており、正確には約 100 のクラスがあります。

dex2jar JAD などの逆コンパイラを使用していくつか例を挙げましたが、それらはすべて特定のクラス ファイルでのみメソッドを表示しているようです。

合計数を取得する方法はありますか?

4

12 に答える 12

81

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 つの合計になります。

于 2012-12-24T22:35:36.217 に答える
11

この 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

これにより、依存関係ツリーが出力され、どの依存関係にいくつのメソッドが必要かの概要がわかります。

于 2015-09-01T09:43:08.013 に答える
3

http://github.com/mihaip/dex-method-countsを使用して、どこからでもメソッドの数を計算します (JAR、AAR、DEX、APK)

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

最初にそれを解凍します(ええ、AARは実際にはZIPです)。次に、上記のJARセクションで示したようにclasses.jarを使用します

unzip mylib.aar -d mylib

dx --dex --output=temp.dex mylib/classes.jar

dex-method-counts temp.dex

于 2016-03-10T12:16:07.027 に答える
3

Cyvis.jarはファイルまたはファイルを読み取ることができ.class、合計メソッド数と各メソッドの循環的複雑度および命令数の両方を表示します。GUIは少し...ポータブルです...しかし、Ubuntuで実行したところ、Windowsで動作すると表示されます。ライブラリが問題を引き起こす可能性についての最初の情報源としてはかなり良いようです。

于 2013-03-06T02:12:20.380 に答える
0
  1. -x パラメータを指定して jar プログラムを使用し、jarファイルからファイルを抽出し ます。

  2. 各 .class ファイルに逆コンパイラを適用して、各ファイル内のメソッドの数を取得します。

  3. メソッド数を合計します。

于 2012-12-24T17:55:01.610 に答える
0

Gradleライブラリでメソッドカウントを見つけるには、これを使用できます - http://www.methodscount.com

また、Android Studio 用のプラグインも提供します。

http://www.methodscount.com/plugins

于 2018-01-07T07:48:19.780 に答える
0

ソースコードを持っている (またはダウンロードできる) 場合、Sonarはこのような静的解析を行います。また、実行しようとしていることに役立つ可能性のある他の複雑さの指標を確認することもできます。(あなたが何をしようとしているのか教えてくれるとうれしいかもしれません。;))

于 2012-12-24T17:11:58.657 に答える
-1

コマンドラインを使用して、JAR を解凍した後、次のように動作するはずです。

for f in *.class; do javap -c $(basename -s .class $f) | grep invoke | sed 's/.*Method\(.*\)/\1/g'; done | wc -l
于 2013-05-31T19:53:53.140 に答える
-2
(public|protected|private|static|\s) +[\w\<\>\[\]]+\s+(\w+) *\([^\)]*\) *(\{?|[^;])

を使用してプロジェクト内を検索しCTRL+SHIFT+Fます。それは私を助けました

于 2016-05-10T10:02:08.670 に答える