Кількість посилань на метод збільшується після модуляції додатків


16

AS: 3.5.3; Плагін Android Gradle: 3.5.0; Gradle: 5.6.2;

Ми спостерігали різке збільшення кількості методів, на які посилається наш додаток, після розбиття модуля "app" на кілька невеликих модулів. Але дивна річ у тому, що додавання посилальних методів для кожного класу менше, ніж згадане загальне в Android Apk Analyzer Tool.

З метою тестування я перемістив WebActivity.class з модуля "app" на модуль "адаптери", а кількість посилань збільшена на 181 метод.

Узагальнити:

app / WebActivity = 63546 Фактичні посилання, але показані 65394 методи. Адаптер / WebActivity = 63543 Фактичні згадані методи , але показує 65575 методи.

Ми спостерігали, що кількість доданих методів збільшилася майже на 10 к. Після додавання / розбиття 4 нових модулів.

Яке саме питання?

Як модуляризація додатків може збільшити кількість посилань на метод настільки високо?

Нижче наводяться скріншоти, які я взяв з двох різних APK-файлів, лише WebActivity переміщена з модуля "додаток" на модуль "адаптер" і 181 посилальних методів збільшено:

WebActivity в модулі "app" введіть тут опис зображення

Переміщено WebActivity на модуль "адаптер" введіть тут опис зображення

Чому на скріншотах чому додавання посилальних методів кожним класом (позначеним червоним кольором) не дорівнює загальній кількості, наведеній в Apk Analyzer?


Я створив проблему, відстежити її можна тут issueetracker.google.com/isissue/146957168
Rohit Surwase

Відповіді:


9

Я довго читав про продуктивність коду та налаштування параметрів. В іншому, програми Android є одним із моїх фокусів.

Давайте спочатку введемо основні чи найважливіші поняття, в яких допомагають нам досягти рішення.

Як заявив розробник Android

Модуль може бути самостійно побудований, протестований та налагоджений

Тому модулі мають власні Gradle & Dependpendations. Ви можете вивчити це в проекті Hierarchy Viewer.

Власне, модуляризація акцентується на питаннях технічного обслуговування . На відміну від питань продуктивності. Тому модуляризація має такий важливий вплив:

  • Збільшити глибину спадкування

Ось схема, яку я склав, щоб зробити це зрозумілим. Як ви бачите. Тим часом, використовуючи дискретний модуль, для виклику методу А 2N micro secsпорівнюють його N micro secsбез дискретного модуля.

введіть тут опис зображення

Це питання мені прийшло в голову, що посилані методи розраховують, що стосується глибини спадкування?

Відповідь: Хоча використання модуляризації збільшує посилані Methods.but, це насправді не впливає на продуктивність програми, і головна можлива проблема - глибина спадкування, в якій у більшості випадків нехтують .

Я наголошую, що посилення посилальних методів на модуляризацію обумовлено кожним модулем Gradle & залежностей

Як модуляризація додатків може збільшити кількість посилань на метод настільки високо?

Умови, в яких впливає на аналізатор APK важливо посилаються методи

Також зауважте, що мінімізація та скорочення коду можуть також суттєво змінити вміст файлу DEX після того, як компілюється вихідний код.

На додаток до вищеописаного офіційного твердження, я хочу додати ще одну умову, в якій впливає аналізатор APK, це:

наскільки досвідчений розробник має модуляризацію?

модуляція - це як будинок, який архітектура (розробник) визначає, де повинна бути кухня, а де повинна бути кімната відпочинку, а де - туалет. Що робити, якщо архітектура вирішить поєднати туалет і кухню? Так це лихо.

Це може статися під час модуляризації, якщо розробник не має великого досвіду.


Відповідь на питання ОП у додатку до додаткової інформації

Ось я відповідаю на опитувані запитання в коментарях

Чому б окремий Gradle додав до числа посилається метод? А для окремої залежності, якщо кінцевий результат є єдиним APK, то я не думаю, що дублюючі залежності в "застосунку" та модулі функцій не додадуть до кількості посилань методу.

Оскільки модулі можуть бути побудовані, протестовані та налагоджені, вони ОБОВ'ЯЗКОВО мати свої Gradle & Dependpendes.

Поки виконується багатомодульний проект, компілятор генерує кілька .dexфайлів, включаючи:

  • .dexфайл для загальних інтегрованих залежностей
  • модулі .dexs

.dexФайл залежності - це інтеграція всіх модулів градулів

Давайте подивимось, як модуль gradle впливає на остаточну кількість посилань Mothods ?!

є 2 APK с з однаковим результатом, але різниця у згаданих методах.

Фігура 1 цифра 2

Вони обидві порожні види діяльності, які мають 1.7kрізницю в кількості посилань на методи, що дуже сильно залежать від їх функціональності. Вони Ключова відмінність полягає в Gradle модуля, на який було налаштовано

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
}

Ще одна налаштована на

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.2.0-alpha01'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta4'
}

Хоча це просто порожні заняття, але мінімальна різниця в Gradle викликала 1.7k різницю в підрахунку методів.

І App Gradle є

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    implementation project(path: ':module')
}

Основне занепокоєння викликає те, чому додавання індивідуально посилається методу відрізняється від загального підрахунку методу в Apk Analyzer?

Це просто фільтр IDE нічого іншого. напевно, якщо ви виберете лише .dexфайл Кількість довідкових методів дорівнює SUM кожного рядка Коефіцієнт посилань, але якщо ви вибрали кілька разів.dex файлів, ви побачите різницю в SUM і фактичному що через рівність у посиланнях, які аналізатор вважав за краще фільтруйте їх.

на своїх знімках екрана ви вибрали кілька .dexфайлів, а потім рівність фільтру Analyzer.

у нашому проекті ми використовуємо централізований файл залежностей.gradle, щоб не було шансів на іншу версію. Отже, ви думаєте, навіть якщо ми маємо однаковий / точний набір залежностей та їх версій у функціональних модулях, це збільшить кількість посилальних методів?

Теоретично НЕ повинно збільшувати кількість посилальних методів. Але , як я пояснив це, досвід розробників сильно впливає на кінцевий результат.

Командний аналізатор повинен перевірити та виправити проблеми з роботою перед тим, як випустити

  • правила прогуарда
  • скорочуються та мінімізуються ресурси
  • androidManifest.xml
  • налаштування gradle

Тепер я хочу уточнити, як досвід розробника та підтримка коду впливає на кінцевий результат. ЦІЛЬКО, якщо ваш APK використовує централізовані залежності

фіг.3

у вищенаведеному прикладі я збільшувався 5.1kв підрахунку посилань на методики, навіть якщо я мав централізовані залежності !!!!!

Як це можливо?

Відповідь: я просто додав марний і прихований .jarфайл у libsкаталог проекту. так само просто, як ви можете бачити, що я вплинув на кінцевий результат.

Як ви можете бачити, що досвід розробників впливає на кінцевий результат. Як результат, практично можливо, що кількість посилань на цей метод може бути збільшена, хоча теоретично НЕ слід .

І чому немає різниці в кількості посилань методу, коли я компілюю лише модуль "app", відключаючи паралельну компіляцію? Це мало б зменшитися, оскільки використовувались б лише залежності "модуля" програми, правда?

компіляція не має жодного відношення до посиланих методів counts.it відповідає тому, що розробник хоче виконати.


Висновок

Я висвітлив усі можливості навколо цього питання. Дійсно, це може виникнути з різних ситуацій, і розробник за допомогою цього керівництва може виправити проблему.

  • Я сподіваюся, що ви дізналися, чому посилані методи були розширені і чому в деяких випадках вона може бути різко зросла.
  • Модулі мають свої Gradle & Dependpendations та модулі збільшення модуляризації. отже, ці Методичні посилання.
  • Модуляризація фактично впливає на ефективність програми, але вона робить обслуговування Вашого додатка значно кращим.
  • Досвід розробників з модуляризації також сильно впливає на кінцевий результат.

ВАЖЛИВО ПРИМІТКА: майже всі заяви є моїми дослідженнями та дослідженнями. Дійсно, можуть бути помилки та помилки, і вони будуть оновлюватися, щоб додати набагато більше інформації в майбутньому.



Дякую, містер А.Ф., я сподівався отримати відповідь після "На це запитання я прийшов до Вашої думки, що Методи посилань підраховують, що пов'язане з Глибиною спадкування? Відповідь є", але Ви на це не відповіли. Чи можете ви, будь ласка, детальніше пояснити, чому кількість посилань збільшує кількість посилань? Як і в нашому випадку, ми не додали зайвого шару, а просто розділили модуль "додаток". Існує ймовірність збільшення кількості посилань методів у випадку, якщо модуль функції отримує доступ до методів іншого модуля функції через модуль "app", це причина?
Rohit Surwase

@RohitSurwase відповідь є рештою констатацією. Глибина спадкування не збільшує посилання на метод, модуляризація цього і модуляризація, оскільки глибина спадкування.
Mr.AF

@RohitSurwase, функція, що отримує доступ до іншої функції в іншому модулі, насправді не збільшує велику кількість посилальних методів. Основна причина збільшення кількості посилань методів - Gradle & Dependpendes, які потрібні кожному модулю.
Mr.AF

@RohitSurwase ви вказуєте на корисні поради щодо відношення модуля до модуля. насправді, якщо у двох модулях є занадто багато взаємозв'язків та посилальних методів, їх слід поєднувати для кращої продуктивності. насправді модуль повинен бути незалежним у терміні та концепції.
Mr.AF

1
@RohitSurwase, оскільки я не є невикористаною баночкою, можливо, це не ваш випадок. і я перерахував усі можливі джерела, які вам потрібні для пошуку
Mr.AF

2

Відповідаючи на моє власне запитання, як рішення просто натиснуло на думку, хоча це не пробували, але спрацювало б, безумовно, або, найімовірніше. :) Відповідь, яку дав Mr.AF була дуже корисною для досягнення остаточного рішення. Це говорить про Чому? але не як цього уникнути чи як покращити це.

Ось спосіб повернути початковий / фактичний згаданий метод -

Це залежить не від того, як ми модулюємо додаток, а від того, як ми додаємо залежності. Якщо ми додамо залежність, використовуючи ' реалізації ', то ця залежність залишається приватною для модуля, і жоден інший модуль не може його використовувати. І якщо ми додамо ту саму залежність, використовуючи ' api ' (рівний устареному 'компілювати'), то він стає загальнодоступним, і інші залежні модулі можуть використовувати його. оскільки існує стільки дублікатів посилальних методів.Оскільки ми використовуємо 'імплементацію' для додавання залежностей у кожен модуль у багатомодульний проект, кожен модуль має всі необхідні залежності як самостійні, це є причиною його складання індивідуально. Це призводить до скорочення часу збірки / компіляції, оскільки можуть бути складені лише модифіковані модулі. Але використання "реалізації" збільшує кількість посилальних методів

Отже, якщо час складання не викликає ваших проблем, але кількість посилається на метод, то ви можете намалювати дерево залежності всіх модулів і уникнути додавання дублюючої залежності, використовуючи 'api' в базовому модулі. Таким чином, навіть верхній модуль може використовувати залежність, яку додає базовий модуль, що дозволить уникнути дублікатів. Пам'ятайте, це збільшило б час збірки.

Ми можемо досягти обох, якби змогли розрізнити залежності для налагодження та збірки версій . Додайте всі залежності, використовуючи 'реалізації' для збирання налагодження та додайте лише необхідні та оптимізовані залежності для складання випуску за допомогою 'api' . Таким чином, налагодження налагодження буде швидшим, а випуск версії буде повільнішим, що є доступним.

Примітка: я б оновив цю відповідь, як тільки зрозумів, як забезпечити окремі залежності для налагодження та збірки версій.


мені сподобалось. хороші матеріали.
Mr.AF

0

Я бачу всю різницю у вашому пакеті "com". Ви можете розширити і порівняти, які саме класи були усаджені. Якщо ви будуєте з останньою R8, вона може видалити код за замовчуванням. Коли ви кладете деякі класи в модуль зменшення, не знаю, чи можна видалити загальнодоступні класи або методи для використання в іншому модулі. введіть тут опис зображення


Так, я розширив і перевірив кожен пакет, включаючи "com". Основне занепокоєння полягає в тому, чому додавання індивідуально-посилальних підрахунків методів відрізняється від загального підрахунку методу в Apk Analyzer?
Rohit Surwase
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.