2014-09-14 8 views
7

पर एंड्रॉइड जार/डीएक्स विधि गिनती मैंने लिनक्स और मैकोज़ पर विधियों की गिनती के लिए कुछ लिंक देखे हैं, लेकिन मैंने विंडोज के लिए कुछ भी नहीं देखा है। आप .dex या .jar फ़ाइल में कई विधियों की गणना कैसे करते हैं?विंडोज़

उत्तर

13

समाधान के लिए असफल खोज के बाद, मैंने दो साधारण बैच/खोल स्क्रिप्ट लिखीं जो ऐसा करती हैं।

पहला, methodcount.bat, अगर फ़ाइल .dex या .jar है, तो जांचता है, और यदि यह एक .jar फ़ाइल है, तो यह इसे डीएक्स फ़ाइल में डीएक्स के साथ संसाधित करता है और फिर दूसरा, printhex.ps1, जो वास्तव में डीएक्स फ़ाइल में विधियों की संख्या की जांच करता है - यह 88 (छोटे एंडियन) से शुरू होने वाले 2 बाइट्स को पढ़ता है और उन्हें दशमलव संख्या में परिवर्तित करता है।

इसका उपयोग करने के लिए आप अपने पथ में कहीं भी डीएक्स रखने के लिए (यह एंड्रॉइड एसडीके बिल्ड-टूल्स/xx.x.x फ़ोल्डर में है) और PowerShell इंस्टॉल है (यह पहले से ही विंडोज 7/8 पर स्थापित होना चाहिए)।

प्रयोग बहुत सरल है: methodcount.bat filename.dex | filename.jar

यहां स्क्रिप्ट हैं, लेकिन आप उन्हें भी उपलब्ध कर सकते हैं: https://gist.github.com/mrsasha/9f24e129ced1b1db791b

methodcount.bat

@ECHO OFF 
IF "%1"=="" GOTO MissingFileNameError 
IF EXIST "%1" (GOTO ContinueProcessing) ELSE (GOTO FileDoesntExist) 

:ContinueProcessing 
set FileNameToProcess=%1 
set FileNameForDx=%~n1.dex 
IF "%~x1"==".dex" GOTO ProcessWithPowerShell 

REM preprocess Jar with dx 
IF "%~x1"==".jar" (
    ECHO Processing Jar %FileNameToProcess% with DX! 
    CALL dx --dex --output=%FileNameForDx% %FileNameToProcess% 
    set FileNameToProcess=%FileNameForDx% 
    IF ERRORLEVEL 1 GOTO DxProcessingError 
) 

:ProcessWithPowerShell 
ECHO Counting methods in DEX file %FileNameToProcess% 
CALL powershell -noexit -executionpolicy bypass "& ".\printhex.ps1" %FileNameToProcess% 
GOTO End 

:MissingFileNameError 
@ECHO Missing filename for processing 
GOTO End 

:DxProcessingError 
@ECHO Error processing file %1% with dx! 
GOTO End 

:FileDoesntExist 
@ECHO File %1% doesn't exist! 
GOTO End 

:End 

printhex.ps1

<# 
.SYNOPSIS 
Outputs the number of methods in a dex file. 

.PARAMETER Path 
Specifies the path to a file. Wildcards are not permitted. 

#> 
param(
    [parameter(Position=0,Mandatory=$TRUE)] 
    [String] $Path 
) 

if (-not (test-path -literalpath $Path)) { 
    write-error "Path '$Path' not found." -category ObjectNotFound 
    exit 
} 

$item = get-item -literalpath $Path -force 
if (-not ($? -and ($item -is [System.IO.FileInfo]))) { 
    write-error "'$Path' is not a file in the file system." -category InvalidType 
    exit 
} 

if ($item.Length -gt [UInt32]::MaxValue) { 
    write-error "'$Path' is too large." -category OpenError 
    exit 
} 

$stream = [System.IO.File]::OpenRead($item.FullName) 
$buffer = new-object Byte[] 2 
$stream.Position = 88 
$bytesread = $stream.Read($buffer, 0, 2) 
$output = $buffer[0..1] 
#("{1:X2} {0:X2}") -f $output 
$outputdec = $buffer[1]*256 + $buffer[0] 
"Number of methods is " + $outputdec 
$stream.Close() 
+0

इतना अच्छा है, बहुत बहुत धन्यवाद, इस तरह से मैं अपनी एंड्रॉइड ऐप विधि – Devon

+0

देख सकता हूं कई बैर में बैच विधि गिनती के लिए मैं 'printhex.ps1' को' -noexit' विकल्प 'के बिना कॉल करने की सलाह दूंगा इस तरह एक बैच चक्र: '@echo "स्टार्ट"> mc_res.txt \ n @for/f "टोकन = *" %% टी (mc.txt) में (\ n \t कॉल methodcount.bat %% t >> mc_res.txt \ n ) \ n @ rem mc.txt में जार फ़ाइल नामों की एक सूची है। '\ n' का अर्थ है एक नई लाइन ' – IPSUS

1

मैं देख रहा हूँ इस सवाल पुराना है, लेकिन वहाँ एक Gradle प्लगइन है कि Windows पर काम करेंगे कि कौन सी विधि रिपोर्ट करेंगे है प्रत्येक निर्माण पर एक एपीके में संदर्भ गणना: https://github.com/KeepSafe/dexcount-gradle-plugin

+0

यह ग्रैडल प्लगइन उपयोग करना आसान है, और एपीके में कुल विधि गणना की रिपोर्ट करता है। अफसोस की बात यह है कि वह उस एपीके में गए जेएआर फाइलों की गणना की रिपोर्ट नहीं करता है। तो यह ओपी के डेक्स आधे का प्रभावी ढंग से जवाब देता है, लेकिन जार आधा नहीं। –

+0

यह सच है, लेकिन बिंदु के बगल में। एक जार की विधि गणना के बारे में बात करना व्यर्थ है - कई जारों को डीएक्स में इनपुट के रूप में, विधि संदर्भ विलय कर दिए जाते हैं और कभी-कभी डिस्क्सिंग के दौरान हटा दिए जाते हैं, और इसलिए क्लासफाइल और डेक्स विधि संदर्भों के बीच कोई भी एक मैपिंग नहीं है। – Ben

+0

पुन: 'जार में विधि गिनती के बारे में बात करने के लिए अर्थहीन' एक महत्वपूर्ण बिंदु। मैंने उल्लेख किया कि इस समाधान ने केवल JAR फ़ाइलों को संबोधित नहीं किया क्योंकि ओपी ने जेएआर फाइलों के बारे में पूछा था। –