الكاتب | علي بابا متقدمة المهندسين وتطوير وسائل الترفيه لاسلكية من الشمس طويل
ذبيان | تو مين
خلفية
من أجل التكيف مع التكرار السريع للمنتج، وسيتم استثمار عادة عدد كبير من الموارد R & D في تطوير ميزات جديدة، وظائف والحكم للاهتمام عديمة الفائدة ولكن القليل. مع مرور الوقت، سوف الطلب على الانترنت تتراكم الكثير من التعليمات البرمجية الميت، جنبا إلى جنب مع تغيير الموظفين وظيفة نقل، وإدارة التكاليف كود غير مجدية على نحو متزايد. حزمة تثبيت التطبيق النهائية هي كبيرة جدا، مما أدى إلى انخفاض معدل التحويل تحميل التطبيق، ومحدودية تطبيق منصة الجرف (مثل التطبيق لا يمكن أن يتجاوز 100M جوجل رفوف المتاجر)، والحد من كفاءة البحث والتطوير وهلم جرا.
كيف عديمة الفائدة رموز الحكم؟ الأول هو يتم مسح رمز ثابت. لتطبيقات أندرويد، ويمكن ProGuard أدوات تحليل ساكنة علاقة المراجع الرمز، قطع تلقائيا رمز لم يتم ذكرها للحد من تركيب حجم صفقة خلال مرحلة البناء.
وبطبيعة الحال، إلا أن المسح متاحة لا تزال غير كافية، لأنها ليست تمثيلا للاستخدام الفعلي لمستخدمي الانترنت، لذلك يحتاج خط المستخدم برنامج إحصاءات مدونة التغطية.
خط الإحصاءات مدونة التغطية هنا سوف يقتطع من تطبيقات الروبوت لتبادل الفكر والكلمة التقنية خطة YOUKU الحكم كود ميتا.
برنامج اكتساب التقليدي
أولا وقبل كل شيء، مع رمز الإحصائي في التعليمات البرمجية في الإحصاءات المطلوبة. عندما يتم تنفيذ التعليمات البرمجية والإحصاءات والتقارير. عدد الخطوط من التطبيقات كودي هي عادة عشرات الآلاف، يدويا إضافة غير واقعي بشكل واضح، فإنه عادة ما يكون لادخال كود الإحصائي (المشار إليها فيما يلي باسم الأجهزة) من قبل الجانب برمجة (اوب) في مرحلة البناء، ويمكن الاستفادة من بعض تنضج اوب الوسيطة الانتهاء، على سبيل المثال، Jacoco، ASM.
ثانيا، ضرورة التفكير هي، ما كنا نتوقع أن جمع حجم الجسيمات؟ عموما، من الغرامة إلى الخشنة حجم الجسيمات ينقسم إلى: تعليمات، فرع، وهي طريقة ومستوى الصف، أدق وحجم الجسيمات، وأكثر دقة التغطية رمز النتيجة، ولكن فقدان أداء أكبر. على سبيل المثال، إذا كنت تريد التقاط تحبب مستوى التعليم، فمن الضروري لكل تعليمات المجهزة، ولكن هذا يمكن أن يؤدي إلى خرطوشة كما تضاعف عدد من التعليمات، يتم زيادة حزمة التثبيت وتشغيل تدهور الأداء.
وقد حاولت YOUKU إلى حجم فرع مع Jacoco الأجهزة، وكنا نأمل أن تغطية أكبر عدد من المستخدمين لأن المزيد من المستخدمين تغطي نتائج أكثر دقة. ومع ذلك، وبعد الاختبار، وهذا البرنامج يزيد من 10M حزمة التثبيت، تدهور خطير في تشغيل الأداء، والعزم على إعطاء هذا البرنامج.
من أجل الموازنة بين الأداء وحجم عملية الاستحواذ، نحن اتخاذها الآن عموما مستوى الفئة من الأجهزة تحبب، ويرجع ذلك جزئيا مثل هذا التأثير صغير على الأداء، من ناحية أخرى حجم صغير جدا من اقتناء ما يضيف إلى صعوبة الجانب التجاري من الحكم. ومع ذلك، فإن هذا النظام ليس كاملا:
1) وقت أداء: متى سيتم تنفيذ الطبقة عند تحميلها أولا كود الإحصائية، فإن عملية التمهيد التطبيقات تحميل الألاف من فئة، ويسبب له بعض التأثير على أداء البدء.
2) حجم الحزمة: كم عدد الطبقات، وكيف سيتم إدراج العديد من خطوط كود الإحصاءات، لمثل هذه التطبيقات كبير مثل YOUKU، سوف تزيد من عدد من تثبيت حجم العبوة.
3) بناء المعالجة: بسبب الحاجة لكل عملية من الدرجة بناء المجهزة، وزيادة البناء تستغرق وقتا طويلا.
برنامج اقتناء الجديد -SlimLady
هدف
Yoqoo يريد مخطط خط التجميع قد losslessly مدونة التغطية، جوهر الأهداف التالية:
أداء وقت التشغيل: أي تأثير.
حجم الحزمة: أي تأثير.
البناء من الزمن: أي تأثير.
تحقيق
من خلال دراسة الكود المصدري، يمكنك أن تجد تم تحميل المعلومات حول فئة من ديناميكية DVM الاستعلام الجهاز الظاهري للحصول على مدونة التغطية على مستوى الطبقة، تحت الرقم قسم "تغطية اقتناء" هو جمع SlimLady التخطيطي، وهنا علينا أن نركز فقط على هذا الجزء، وسيتم شرح أجزاء أخرى في وقت لاحق في الخطة الشاملة.
ClassTable
جافا مواصفات الجهاز الظاهري، الطبقة يجب أولا تحميل الجهاز الظاهري قبل الاستخدام. الروبوت، ويتم تحميل الطبقة التي كتبها ClassLoader، حفظه آخر في طبقة ClassTable الأصلية، لذلك إذا أردنا الحصول على ClassTable كافة الكائنات ClassLoader، فمن الممكن لتحديد الجهاز الظاهري الذي يتم تحميل الطبقات.
أولا، وعلى كل وجوه ClassLoader. لفئات APK، إذا لم يذكر على وجه التحديد، فإن الافتراضي يكون تحميل PathClassLoader عموما، لتحميل الديناميكي، يتطلب مخصصة ClassLoader تحميل، على سبيل المثال، يخلق المقابلة أطلس ClassLoader باقة لكل من خلاله ClassLoader حزمة من فئة لتحميل. بمجرد أن تعرف ما تستخدم التطبيقات في ClassLoder، والحصول على قطعة من كعكة
ثانيا، للحصول على عنوان ClassTable الكائن ClassLoader. جافا البرمجية المصدر من خلال طبقات يمكن رؤية الطبقة ClassLoader، هناك متغير عضو ClassLoader classTable (7.0 وما فوق)، ويتضمن هذا المتغير عنوان طبقة الأم الكائن ClassTable، يمكننا الحصول على هذا العنوان عن طريق التأمل:
ClassLoader classLoader = XXX. classTableField الميدان = ClassLoader.class.getDeclaredField ( "classTable")؛ classTableField.setAccessible (صحيح)؛ منذ فترة طويلة classTableAddr = classTableField.getLong (classLoader)؛ومع ذلك، في نظام يضاف 9.0 متغير العضو classTable إلى قائمة رمادية داكنة، والحد من انعكاس مباشر، ينعكس حول مطلوب هذا القيد من قبل الطبقة النظام:
ClassLoader classLoader = XXX. طريقة metaGetDeclaredField = Class.class.getDeclaredMethod ( "getDeclaredField"، String.class)؛ classTableField الحقل = (الميدان) metaGetDeclaredField.invoke (ClassLoader.class "classTable")؛ classTableField.setAccessible (صحيح)؛ منذ فترة طويلة classTableAddr = classTableField.getLong (classLoader)؛عند هذه النقطة، نحصل على عناوين جميع الكائن ClassTable التي تتولى كافة المعلومات الدرجة التحميل.
الطبقة القائمة اسم
من خلال قراءة شفرة المصدر وجدت ClassTable هناك طريقة إذا تحميلها من قبل الطبقة اسم الفئة الاستعلام جدا (يصف المقطع التالي في التفاصيل)، لذلك نحن بحاجة فقط للحصول على قائمة بجميع أسماء فئة، ثم استدعاء هذه الطريقة التي يمكن أن تحدد ما إذا كان يتم تحميل فئة جدا .
APK في القائمة اسم فئة يمكن الحصول عليها عن طريق DexFile، على النحو التالي:
قائمة < سلسلة > فصول = ArrayList جديد < > . DexFile مدافع = DexFile الجديدة (context.getPackageCodePath)؛ ل(التعداد < سلسلة > ايتر = df.entries، iter.hasMoreElements.) { classes.add (iter.nextElement)؛ }وبالمثل، تحميل الديناميكي يمكن الحصول على DexFile.
اذا كانت محملة الطبقة
وجدت Class_table.cc في مصدر القراءة، ClassTable بحث هناك، ويمر أسماء فئة وأسماء فئة من قيمة التجزئة، والعودة عنوان كائن الفئة، على النحو التالي:
مرآة :: الفئة * ClassTable :: بحث (CONST شار * واصف، تجزئة size_t)
إذا كان PTR قيمة المقابل، لم يتم تحميل كان هذا الوصف، وغير ذلك، مما يدل على بعض المتهمين.
مرآة :: الفئة * ClassTable :: بحث (CONST شار * واصف، تجزئة size_t)هذا الأسلوب هو أسلوب للحصول على عنوان:
تحميل ذلك: class_table.cc في libart.so، كل ما تحتاج إلى تحميل libart.so مع dlopen الحصول على هذا حتى المعالج. في الواقع، قبل التحميل، libart.so يجب أن يكون قد تم تحميلها في العملية الحالية، فقط للحصول على معالج الحمل، لا تستغرق وقتا طويلا.
جدول الرموز: الاستعلام بواسطة readelf بحث رمز: _ZN3art10ClassTable6LookupEPKcj.
مؤشر الطريقة: دعوة dlsym، واردة معالج ورمز الجداول التي يمكن العثور عليها في أساليب بحث عنوانه؛
ملاحظة: من نظام 7.0، جوجل تحظر نظام الاتصال من API الأصلي، وهنا نجد libart.so عنوان عبر / إجراءات / الذات / خرائط، والتي سوف نسخ جدول الرموز، وبالتالي الالتفاف على هذا القيد.
عند هذه النقطة، يمكننا من خلال الدعوة طريقة ClassTable بحث، ويمر اسم الفئة وقيمة التجزئة لتحديد ما إذا كان يتم تحميل الدرجة من قبل.
ملخص
وبهذه الطريقة، سوف نعرف في وقت ما ما الدرجة يتم تحميل قبل، وتحميلها، وعملية البلمرة، وبعد ذلك من خلال مقارنة قائمة بجميع اسم الفئة، يمكنك الحصول على بيانات مدونة التغطية. هذا المخطط لا تتطلب الأجهزة، والتغطية يمكن جمعها من دون خسارة.
التصميم العام للبرنامج الجديد
مخطط الاستحواذ المذكورة أعلاه هي جوهر عملية دعم، بالإضافة إلى التسويق والتوزيع للبرنامج ككل، مخطط التصميم العام كما هو مبين أدناه:
1) APK توزيع: أحدث APK شيدت خلال بناء المراكز، وزعت على المستخدمين.
2) الزناد: سهولة تثبيت التطبيق، أثناء الاستخدام، وAPP بعد الذهاب 10S الظهر، ويتم احتساب معدل أخذ العينات من ضرب، وإذا ضرب، ويتم تشغيل تغطية رمز اكتساب
3) الصادر تكوين: عند الحاجة، يمكن إرسال تكوين لضبط وظيفة التبديل، فإن معدل أخذ العينات من قبل التكوين التالية مرتبة في مركز حيوي.
4) جمع البيانات: وسيط شراء مدونة التغطية (الطبقة SlimLady) الإحصاءات التي يتم تحميلها، وأسماء فئة تحميل تخزينها في ملف مضغوطة، والبيانات المضغوطة ينتقل لتحميل الوسيطة.
5) نقل البيانات: تحميل البيانات التي يتم تحميلها إلى الوسيطة سحابة.
6) بيانات التحميل: الخوادم السحابية بشكل دوري لتحميل البيانات؛
7) تقديم معلومات فئة: معلومات الفئة حصول الملقم من بناء المركز، بما في ذلك قائمة من جميع الطبقات والخلط بين أسماء الملفات.
8) تحليل البيانات: وفقا لنسخة من قانون الخادم ضغط بيانات التغطية، تنعيم والإحصاءات التجميع، وتشمل النتائج الإحصائية بعد البلمرة الطبقة وعدد من تحميلها في وقت سابق، مقارنة مع قائمة بأسماء جميع الفئات التي يمكن أن تعرف أي الطبقات لم يتم تحميل منه، حفظ النتائج إلى قاعدة البيانات؛
9) نتائج البلمرة: صفحة نتائج البلمرة قراءة من الجانب قاعدة البيانات، اضغط على تغطية رمز وحدة العرض، والحرارة وحدة، حجم الكتلة وغيرها من المعلومات.
ملخص
فواصل البرنامج من خلال إحصاءات التقليدية الأجهزة دفن، والوصول إلى المعلومات الديناميكية الجهاز الظاهري، غير مدمرة تغطية رمز جمع. مع بيانات مدونة التغطية، لدينا الكثير من السيطرة، على سبيل المثال: وحدة حاليا كود عديمة الفائدة، دعوة رقيقة أو غير متصل منخفضة، وحدة نمطية حجم كبير، إضافة مدونة التغطية حربة خلال مرحلة الاندماج وهلم جرا.