void CompareSymbols(string file, string other, string padding) { var sym1 = ParseNMOutput(RunNMCmd(file)); var sym2 = ParseNMOutput(RunNMCmd(other)); Program.ColorWriteLine($"{padding} Symbol size difference", ConsoleColor.Yellow); var differences = new Dictionary <string, long> (); var singles = new HashSet <string> (); foreach (var entry in sym1) { var key = entry.Key; if (sym2.ContainsKey(key)) { var otherEntry = sym2 [key]; differences [key] = otherEntry.Size - sym1 [key].Size; } else { differences [key] = -sym1 [key].Size; singles.Add(key); } } foreach (var key in sym2.Keys) { if (sym1.ContainsKey(key)) { continue; } differences [key] = sym2 [key].Size; singles.Add(key); } foreach (var diff in differences.OrderByDescending(v => v.Value)) { if (diff.Value == 0) { continue; } var single = singles.Contains(diff.Key); ApkDescription.PrintDifference(diff.Key, diff.Value, single ? $" *{(diff.Value > 0 ? 2 : 1)}" : null, padding); } }
public override void Compare(string file, string other, string padding) { using (var dex1 = new DexFile(file, padding)) { using (var dex2 = new DexFile(other, padding)) { if (dex1.linkSize != dex2.linkSize) { ApkDescription.PrintDifference("link section size", dex2.linkSize - dex1.linkSize, "", padding); } if (dex1.stringIdsSize != dex2.stringIdsSize) { ApkDescription.PrintDifference("strings count", dex2.stringIdsSize - dex1.stringIdsSize, "", padding); } if (dex1.typeIdsSize != dex2.typeIdsSize) { ApkDescription.PrintDifference("types count", dex2.typeIdsSize - dex1.typeIdsSize, "", padding); } if (dex1.protoIdsSize != dex2.protoIdsSize) { ApkDescription.PrintDifference("prototypes count", dex2.protoIdsSize - dex1.protoIdsSize, "", padding); } if (dex1.fieldIdsSize != dex2.fieldIdsSize) { ApkDescription.PrintDifference("fields count", dex2.fieldIdsSize - dex1.fieldIdsSize, "", padding); } if (dex1.methodIdsSize != dex2.methodIdsSize) { ApkDescription.PrintDifference("methods count", dex2.methodIdsSize - dex1.methodIdsSize, "", padding); } if (dex1.classDefsSize != dex2.classDefsSize) { ApkDescription.PrintDifference("classes count", dex2.classDefsSize - dex1.classDefsSize, "", padding); } if (dex1.dataSize != dex2.dataSize) { ApkDescription.PrintDifference("data section size", dex2.dataSize - dex1.dataSize, "", padding); } } } }