Số lượng phương thức tham chiếu tăng sau khi mô đun hóa ứng dụng


16

NHƯ: 3.5.3; Plugin Android Gradle: 3.5.0; Lớp: 5.6.2;

Chúng tôi đã quan sát thấy sự gia tăng mạnh mẽ số lượng phương thức được tham chiếu trong ứng dụng của chúng tôi sau khi chia mô-đun 'ứng dụng' thành nhiều mô-đun nhỏ. Nhưng điều kỳ lạ là việc bổ sung các phương thức được tham chiếu của mỗi lớp ít hơn tổng số được đề cập trong Công cụ phân tích Apk của Android.

Với mục đích thử nghiệm, tôi đã chuyển WebActivity. Class từ mô đun 'ứng dụng' sang mô đun 'bộ điều hợp' và số phương thức được tham chiếu tăng lên bằng 181 phương thức.

Tóm tắt:

app / WebActivity = 63546 Phương thức tham chiếu thực tế nhưng hiển thị 65394 phương thức. bộ chuyển đổi / WebActivity = 63543 Phương thức tham chiếu thực tế nhưng hiển thị 65575 phương thức.

Chúng tôi đã quan sát 'số phương thức được tham chiếu' tăng gần 10 nghìn sau khi thêm / tách 4 mô-đun mới.

Vấn đề chính xác là gì?

Làm thế nào mô đun hóa ứng dụng có thể tăng số lượng phương thức tham chiếu rất cao?

Sau đây là các ảnh chụp màn hình tôi chụp với hai sự khác biệt chỉ dành cho APK là WebActivity được chuyển từ mô-đun 'ứng dụng' sang mô-đun 'bộ điều hợp' và tăng thêm 181 phương thức tham chiếu:

WebActivity trong mô-đun 'ứng dụng' nhập mô tả hình ảnh ở đây

Đã chuyển WebActivity sang mô đun 'bộ chuyển đổi' nhập mô tả hình ảnh ở đây

Trong các ảnh chụp màn hình, tại sao việc thêm các phương thức được tham chiếu của mỗi lớp (được đánh dấu màu đỏ) không bằng tổng số được đưa ra trong Apk Phân tích?


Tôi đã tạo ra một vấn đề, bạn có thể theo dõi vấn đề này tại đâyetetracker.google.com/issues/146957168
Rohit Surwase

Câu trả lời:


9

Tôi đã đọc về hiệu suất mã và các tham số điều chỉnh trong một thời gian dài. Thực tế, các chương trình Android là một trong những trọng tâm của tôi.

Trước tiên, hãy giới thiệu các khái niệm cơ bản hoặc quan trọng nhất giúp chúng tôi đạt được giải pháp.

Như nhà phát triển Android đã tuyên bố

mô-đun có thể được xây dựng, thử nghiệm và gỡ lỗi độc lập

Do đó, các Mô-đun có Gradle & Dependencies của riêng họ . Và bạn có thể khám phá nó trong dự án Hierarchy Viewer.

Như một vấn đề thực tế, Modularization nhấn mạnh vào các vấn đề Bảo trì . Không giống như vấn đề hiệu suất. Bởi vì, Modularization có tác động quan trọng này:

  • Tăng độ sâu của thừa kế

Đây là một sơ đồ mà tôi đã vẽ nó để làm cho nó rõ ràng. Như bạn có thể thấy. Trong khi sử dụng mô-đun rời rạc, để gọi Phương thức A, có 2N micro secsso sánh với N micro secsmô-đun rời rạc.

nhập mô tả hình ảnh ở đây

Câu hỏi này tôi nghĩ rằng Phương thức được tham chiếu tính những gì liên quan đến Độ sâu của thừa kế?

Câu trả lời là: Mặc dù sử dụng mô-đun hóa tăng Khảo Methods.but, nó không thực sự ảnh hưởng đến hiệu quả hoạt động ứng dụng và vấn đề chính có thể là Depth thừa kế , trong đó ở hầu hết các trường hợp là có thể bỏ qua .

Tôi nhấn mạnh rằng các Phương thức tham chiếu tăng trong mô đun hóa là do mỗi Lớp và phụ thuộc mô-đun

Làm thế nào mô đun hóa ứng dụng có thể tăng số lượng phương thức tham chiếu rất cao?

Các điều kiện trong đó tác động đến phân tích APK quan trọng Phương thức được tham chiếu

Cũng lưu ý rằng việc thu nhỏ và thu nhỏ mã cũng có thể thay đổi đáng kể nội dung của tệp DEX sau khi mã nguồn được biên dịch.

Ngoài tuyên bố chính thức ở trên, tôi muốn thêm một điều kiện khác trong đó tác động đến trình phân tích APK đó là:

Nhà phát triển có kinh nghiệm trong việc mô đun hóa bao nhiêu?

mô đun hóa giống như một ngôi nhà mà kiến trúc (nhà phát triển) xác định nơi nào nên là nhà bếp và nơi nên là phòng nghỉ và nơi nên là WC. Nếu kiến ​​trúc quyết định kết hợp WC & Bếp thì sao? Phải đây là một thảm họa.

Điều này có thể xảy ra trong khi mô đun hóa nếu nhà phát triển không có nhiều kinh nghiệm.


Trả lời các câu hỏi của OP trong Bổ sung thêm thông tin

Ở đây tôi trả lời cho câu hỏi op trong các ý kiến

Tại sao phân tách Gradle thêm vào số phương thức được tham chiếu? Và đối với phụ thuộc riêng biệt, nếu kết quả cuối cùng là APK đơn thì tôi không nghĩ phụ thuộc trùng lặp trong 'ứng dụng' và mô-đun tính năng sẽ thêm vào số phương thức được tham chiếu.

Bởi vì các mô-đun có thể được xây dựng, thử nghiệm và gỡ lỗi, sau đó chúng PHẢI có Cấp độ & Phụ thuộc riêng.

Trong khi dự án đa mô-đun đang được tuân thủ, trình biên dịch tạo ra một số .dextệp bao gồm:

  • một .dextập tin cho các phụ thuộc tổng hợp
  • mô-đun .dexs

.dextập tin phụ thuộc là một sự tích hợp của tất cả các lớp mô-đun

Chúng ta hãy xem làm thế nào một lớp mô-đun tác động đến Đếm Mothods được tham chiếu cuối cùng?!

2 APK giây có cùng kết quả nhưng khác nhau về số lượng Phương thức được tham chiếu.

Hình 1 Hình 2

Cả hai đều là các hoạt động trống có 1.7ksự khác biệt về Số lượng phương thức được tham chiếu rất cao phụ thuộc vào chức năng của chúng. Sự khác biệt chính của chúng là trên Lớp của Mô-đun, một trong số chúng được cấu hình để

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

Một cái khác được cấu hình để

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

Mặc dù chúng chỉ là các hoạt động trống rỗng nhưng sự khác biệt tối thiểu trong Gradle đã gây ra 1.7ksự khác biệt về Số lượng phương thức được tham chiếu.

ứng dụng Gradle là

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')
}

mối quan tâm chính là tại sao việc thêm số lượng phương thức được tham chiếu riêng lẻ lại khác với tổng số phương thức được tham chiếu trong Apk Phân tích?

Đây chỉ là bộ lọc IDE không có gì khác. chắc chắn, nếu bạn chỉ chọn một .dextệp Đếm phương thức tham chiếu bằng với SUM của mỗi hàng Đếm phương thức được tham chiếu nhưng nếu bạn chọn nhiều .dextệp, bạn sẽ thấy sự khác biệt về SUM và Đếm thực tế vì tính bằng nhau trong Tham chiếu mà Trình phân tích ưa thích lọc chúng.

trong ảnh chụp màn hình của bạn, bạn đã chọn nhiều .dextệp rồi phân tích bộ lọc bình đẳng.

trong dự án của chúng tôi, chúng tôi đang sử dụng tập tin phụ thuộc tập trung. Nâng cấp để không có cơ hội của phiên bản khác nhau. Vì vậy, bạn có nghĩ ngay cả khi chúng ta có tập hợp phụ thuộc giống hệt / chính xác và các phiên bản của chúng trong các mô-đun tính năng, nó sẽ tăng số lượng phương thức được tham chiếu không?

Về mặt lý thuyết, nó KHÔNG nên tăng số lượng phương thức tham chiếu. NHƯNG , như tôi đã giải thích, Trải nghiệm nhà phát triển tác động rất lớn đến kết quả cuối cùng.

Nhóm phân tích nên kiểm tra và khắc phục các sự cố về hiệu suất trước khi phát hành như

  • quy tắc bảo vệ
  • tài nguyên bị thu hẹp
  • androidManifest.xml
  • cài đặt lớp

Bây giờ tôi muốn làm rõ nó như thế nào Trải nghiệm nhà phát triển và bảo trì mã ảnh hưởng đến kết quả cuối cùng. NGAY CẢ nếu APK của bạn sử dụng Phụ thuộc tập trung

hình 3

trong ví dụ trên, tôi đã tăng số lượng 5.1kPhương thức tham chiếu NGAY CẢ NẾU tôi có Phụ thuộc tập trung !!!!!

Làm thế nào nó có thể?

Câu trả lời là: tôi chỉ thêm một .jartập tin vô dụng và ẩn trong libsthư mục của dự án. chỉ cần dễ dàng như bạn có thể thấy tôi đã ảnh hưởng đến kết quả cuối cùng.

Như bạn có thể thấy Trải nghiệm của nhà phát triển ảnh hưởng đến kết quả cuối cùng. Như một kết quả, thực tế có thể các phương thức được tham chiếu sẽ được tăng lên mặc dù về mặt lý thuyết KHÔNG nên .

Và tại sao không có sự khác biệt về số lượng phương thức được tham chiếu khi tôi chỉ biên dịch mô-đun 'ứng dụng' bằng cách vô hiệu hóa biên dịch song song? Nó đáng lẽ đã giảm vì chỉ phụ thuộc mô-đun 'ứng dụng' sẽ được sử dụng, phải không?

việc biên dịch không có bất kỳ mối quan hệ nào với các phương thức được tham chiếu. Nó tuân thủ những gì nhà phát triển muốn tuân thủ.


Phần kết luận

Tôi đã bao gồm tất cả các khả năng xung quanh vấn đề. Thật vậy, nó có thể xuất hiện từ các tình huống khác nhau và một nhà phát triển bằng cách sử dụng hướng dẫn này có thể khắc phục vấn đề.

  • Tôi hy vọng rằng bạn đã tìm thấy lý do tại sao Phương thức tham chiếu được tăng lên và tại sao trong một số trường hợp, nó có thể được tăng mạnh.
  • Các mô-đun có Gradle & Dependencies và mô-đun tăng mô-đun. do đó, các tài liệu tham khảo phương pháp này.
  • Modularization thực sự tác động đến hiệu suất ứng dụng không thể biết được nhưng làm cho Bảo trì ứng dụng của bạn tốt hơn rất nhiều.
  • Kinh nghiệm của nhà phát triển trong việc mô đun hóa cũng tác động rất lớn đến kết quả cuối cùng.

LƯU Ý QUAN TRỌNG: gần như tất cả các tuyên bố là nghiên cứu & nghiên cứu của tôi. thật vậy, có thể có lỗi và lỗi và sẽ được cập nhật để thêm nhiều thông tin hơn trong tương lai.



Cảm ơn Mr.AF, tôi đã hy vọng nhận được câu trả lời sau "Câu hỏi này tôi nghĩ rằng Phương thức tham chiếu có tính những gì liên quan đến Độ sâu của thừa kế không? Câu trả lời là", nhưng bạn không trả lời. Bạn có thể giải thích rõ hơn tại sao độ sâu của thừa kế tăng số lượng phương thức tham chiếu không? Như trong trường hợp của chúng tôi, chúng tôi đã không thêm bất kỳ lớp bổ sung nào mà chỉ tách mô-đun 'ứng dụng'. Có khả năng tăng số lượng phương thức được tham chiếu trong trường hợp mô đun tính năng truy cập các phương thức của mô đun tính năng khác thông qua mô đun 'ứng dụng', đây có phải là lý do không?
Rohit Surwase

Câu trả lời @RohitSurwase là phần còn lại của câu lệnh. Phần thừa kế không làm tăng Tài liệu tham khảo Phương thức, mô đun hóa làm điều đó và mô đun hóa độ sâu của kế thừa.
Mr.AF

@RohitSurwase, một tính năng truy cập một tính năng khác trong một mô-đun khác thực sự không làm tăng các phương thức tham chiếu. lý do chính để tăng số lượng phương thức được tham chiếu là Gradle & Dependencies mà mỗi mô-đun cần.
Mr.AF

@RohitSurwase bạn chỉ ra những lời khuyên hay về mô đun đến quan hệ mô đun. như một vấn đề thực tế, nếu 2 mô-đun có quá nhiều quan hệ và các phương thức được tham chiếu thì chúng nên được kết hợp để có hiệu suất tốt hơn. thực sự mô-đun cần phải độc lập trong thuật ngữ & khái niệm.
Mr.AF

1
@RohitSurwase như tôi đã sai, jar không được sử dụng có thể không phải là trường hợp của bạn. Một cái gì đó mà tôi muốn nói là kinh nghiệm của nhà phát triển và có thể, khả năng có thể xuất hiện từ các nguồn khác nhau. và tôi đã liệt kê tất cả các nguồn có thể mà bạn cần tìm kiếm
Mr.AF

2

Trả lời câu hỏi của riêng tôi khi giải pháp vừa nhấp vào tâm trí tôi, mặc dù điều này không được thử nhưng sẽ hiệu quả, chắc chắn hoặc có lẽ là nhất. :) Câu trả lời được đưa ra bởi Mr.AF là rất hữu ích để đi đến một giải pháp cuối cùng. Nó nói về Tại sao? nhưng không phải làm thế nào để tránh nó hoặc làm thế nào để cải thiện điều đó.

Đây là một cách để lấy lại số phương thức được tham chiếu ban đầu / thực tế -

Nó không phụ thuộc vào cách chúng ta mô đun hóa ứng dụng mà phụ thuộc vào cách chúng ta thêm phụ thuộc. Nếu chúng ta thêm một phụ thuộc bằng cách sử dụng ' triển khai ' thì sự phụ thuộc đó vẫn riêng tư cho mô-đun và không có mô-đun nào khác có thể sử dụng nó. Và nếu chúng ta thêm cùng một phụ thuộc bằng cách sử dụng ' api ' (bằng với 'biên dịch' không dùng nữa) thì nó sẽ trở thành công khai và các mô-đun phụ thuộc khác có thể sử dụng nó. Vì chúng tôi đang sử dụng 'triển khai' để thêm các phụ thuộc vào từng mô-đun trong dự án đa mô-đun, mỗi mô-đun có tất cả các phụ thuộc bắt buộc là khép kín, đây là lý do có thể được biên dịch riêng lẻ. Điều này dẫn đến giảm thời gian xây dựng / biên dịch vì chỉ các mô-đun sửa đổi có thể được biên dịch. Nhưng, việc sử dụng 'triển khai' làm tăng số lượng phương thức được tham chiếu vì có rất nhiều phương pháp tham chiếu trùng lặp.

Vì vậy, nếu thời gian xây dựng không phải là mối quan tâm của bạn mà là số phương thức được tham chiếu thì bạn có thể vẽ cây phụ thuộc của tất cả các mô-đun và tránh thêm phụ thuộc trùng lặp bằng cách sử dụng 'api' trong mô-đun cơ sở. Bằng cách này, ngay cả mô-đun hàng đầu cũng có thể sử dụng phụ thuộc được thêm bởi mô-đun cơ sở , điều này sẽ tránh trùng lặp. Hãy nhớ rằng, điều này sẽ tăng thời gian xây dựng.

Chúng ta có thể đạt được cả hai nếu chúng ta có thể phân biệt các phụ thuộc cho gỡ lỗi và phát hành bản dựng . Thêm tất cả các phụ thuộc bằng cách sử dụng 'triển khai' để xây dựng gỡ lỗi và chỉ thêm các phụ thuộc được yêu cầu và tối ưu hóa để xây dựng bản phát hành bằng cách sử dụng 'api' . Cách này gỡ lỗi xây dựng sẽ nhanh hơn và phát hành xây dựng sẽ chậm hơn mà giá cả phải chăng.

Lưu ý: Tôi sẽ cập nhật câu trả lời này khi tôi tìm ra cách cung cấp các phụ thuộc riêng cho gỡ lỗi và phát hành bản dựng.


tôi thích nó. vật liệu tốt.
Mr.AF

0

Tôi thấy tất cả sự khác biệt trong gói 'com' của bạn. Bạn có thể mở rộng và so sánh những lớp chính xác đã được thu nhỏ. Nếu bạn xây dựng với R8 mới nhất, nó có thể xóa một số mã theo mặc định. Khi bạn đặt một số lớp vào trình thu nhỏ mô-đun, không biết liệu các lớp / phương thức công khai có thể được gỡ bỏ hay phải ở lại để sử dụng trong mô-đun khác. nhập mô tả hình ảnh ở đây


Có, tôi đã mở rộng và kiểm tra từng gói bao gồm 'com'. Mối quan tâm chính là tại sao việc thêm số lượng phương thức được tham chiếu riêng lẻ lại khác với tổng số phương thức được tham chiếu trong Apk Phân tích?
Rohit Surwase
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.