pxb1988 / dex2jar

Tools to work with android .dex and java .class files
Apache License 2.0
12.21k stars 2.1k forks source link

baksmali: java.util.IllegalFormatConversionException: d != java.lang.String #409

Open TWiStErRob opened 3 years ago

TWiStErRob commented 3 years ago

test.kt:

private val supportedLocales = setOf(
    "en", "pt-br", "nb", "sv", "nl", "da"
)

The following is essentially what gradlew :lib:dexDebug does on an Android project:

# c:\dev\tools\android-studio-40\plugins\Kotlin\kotlinc\bin\
kotlinc test.kt
# c:\dev\tools\android-sdk\build-tools\30.0.1\
d8 --min-api 21 --debug --no-desugaring --intermediate --output classes.dex.jar TestKt.class
# c:\dev\tools\android-studio-40\jre\bin\
jar -xvf classes.dex.jar classes.dex
# c:\dev\tools\tools\dex2jar-2.0\
d2j-baksmali classes.dex --force

The most important flag is --min-api 21, because without that everything is fine.

baksmali classes.dex -> classes-out
com.googlecode.d2j.DexException: Error process class: [0]LTestKt;
        at com.googlecode.d2j.reader.DexFileReader.accept(DexFileReader.java:604)
        at com.googlecode.d2j.reader.DexFileReader.accept(DexFileReader.java:565)
        at com.googlecode.d2j.smali.Baksmali.to(Baksmali.java:99)
        at com.googlecode.d2j.smali.BaksmaliCmd.doCommandLine(BaksmaliCmd.java:60)
        at com.googlecode.dex2jar.tools.BaseCmd.doMain(BaseCmd.java:288)
        at com.googlecode.d2j.smali.BaksmaliCmd.main(BaksmaliCmd.java:24)
Caused by: java.util.IllegalFormatConversionException: d != java.lang.String
        at java.util.Formatter$FormatSpecifier.failConversion(Formatter.java:4302)
        at java.util.Formatter$FormatSpecifier.printInteger(Formatter.java:2793)
        at java.util.Formatter$FormatSpecifier.print(Formatter.java:2747)
        at java.util.Formatter.format(Formatter.java:2520)
        at java.util.Formatter.format(Formatter.java:2455)
        at java.lang.String.format(String.java:2940)
        at com.googlecode.d2j.smali.BaksmaliDumpOut.s(BaksmaliDumpOut.java:62)
        at com.googlecode.d2j.smali.BaksmaliCodeDumper.visitFilledNewArrayStmt(BaksmaliCodeDumper.java:252)
        at com.googlecode.d2j.node.DexCodeNode$FilledNewArrayStmtNode.accept(DexCodeNode.java:300)
        at com.googlecode.d2j.node.DexCodeNode.accept(DexCodeNode.java:62)
        at com.googlecode.d2j.smali.BaksmaliDumper.baksmaliCode(BaksmaliDumper.java:517)
        at com.googlecode.d2j.smali.BaksmaliDumper.baksmaliMethod(BaksmaliDumper.java:445)
        at com.googlecode.d2j.smali.BaksmaliDumper.baksmaliClass(BaksmaliDumper.java:397)
        at com.googlecode.d2j.smali.BaksmaliDexFileVisitor$1.visitEnd(BaksmaliDexFileVisitor.java:60)
        at com.googlecode.d2j.reader.DexFileReader.accept(DexFileReader.java:601)
        ... 5 more

Note: the --intermediate flag doesn't matter, because I first found the issue on a classes6.dex in an APK.

kotleni commented 2 years ago

I have this error too