示例#1
0
        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);
            }
        }
示例#2
0
        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);
                    }
                }
            }
        }