앱 모듈화 후 참조 된 메소드 수 증가


16

AS : 3.5.3; 안드로이드 Gradle 플러그인 : 3.5.0; 그래들 : 5.6.2;

'app'모듈을 여러 개의 작은 모듈로 분할 한 후 앱에서 참조되는 메소드 수가 크게 증가했습니다. 그러나 이상한 점은 각 클래스별로 참조 된 메소드를 추가하는 것이 Android Apk Analyzer Tool에서 언급 된 총계보다 적다는 것입니다.

테스트 목적으로 WebActivity.class를 'app'모듈에서 'adapters'모듈로 이동했으며 참조 된 메소드 수가 181 개의 메소드로 증가했습니다.

요약:

app / WebActivity = 63546 실제 참조 된 메소드이지만 65394 개의 메소드를 표시 합니다. adapter / WebActivity = 63543 실제 참조 된 메소드이지만 65575 개의 메소드가 표시 됩니다 .

우리는 한 추가 / 분할 4 개 개의 새로운 모듈 후 거의 10K 증가 '참조하는 방법의 수를'관찰했다.

정확한 문제는 무엇입니까?

앱 모듈화가 어떻게 참조 된 메소드 수를 크게 높일 수 있습니까?

다음은 두 가지 다른 APK 전용 차이점에 대한 스크린 샷입니다. WebActivity는 'app'모듈에서 'adapter'모듈로 이동했으며 181 참조 메소드가 증가했습니다.

'앱'모듈의 WebActivity 여기에 이미지 설명을 입력하십시오

WebActivity를 '어댑터'모듈로 이동 여기에 이미지 설명을 입력하십시오

스크린 샷에서 각 클래스별로 참조 된 메소드를 추가하는 것 (빨간색으로 표시)이 Apk Analyzer에 주어진 합계와 같지 않은 이유는 무엇입니까?


내가 문제를 만들었습니다, 당신은 여기를 추적 할 수 있습니다 issuetracker.google.com/issues/146957168
Rohit Surwase

답변:


9

코드 성능과 튜닝 매개 변수에 대해 오랫동안 읽었으며 실제로 Android 프로그램이 내 초점 중 하나입니다.

먼저 솔루션에 도달하는 데 도움이되는 기본 또는 가장 중요한 개념을 소개하겠습니다.

으로 안드로이드 개발자는 주장했다

모듈은 독립적으로 구축, 테스트 및 디버깅 가능

따라서 모듈에는 자체 Gradle & Dependencies 가 있으며 프로젝트에서 탐색 할 수 있습니다 Hierarchy Viewer.

사실, 모듈화유지 관리 문제를 강조합니다 . 성능 문제와 달리 모듈화는 다음과 같은 중요한 영향을 미칩니다.

  • 상속 깊이 증가

다음은 명확하게하기 위해 플롯 한 다이어그램입니다. 알 수 있듯이 이산 모듈을 사용하는 동안 메소드 A를 호출하기 위해 이산 모듈 2N micro secsN micro secs없는 것과 비교됩니다 .

여기에 이미지 설명을 입력하십시오

이 질문은 참조 된 메소드가 상속 깊이와 관련된 것을 계산 한다고 생각합니다 .

대답은 다음과 같습니다. 모듈화를 사용하면 Referenced Methods가 증가하지만 실제로는 앱 성능에 영향을 미치지 않으며 가능한 주요 문제는 대부분의 경우 무시할 수 있는 상속 깊이입니다 .

모듈화에서 증가 된 참조 방법은 각 모듈 Gradle & Dependencies로 인한 것임을 강조합니다.

앱 모듈화가 어떻게 참조 된 메소드 수를 크게 높일 수 있습니까?

APK 분석기에 중요한 영향을 미치는 조건 참조 방법

또한 축소 및 코드 축소는 소스 코드를 컴파일 한 후 DEX 파일의 내용을 각각 변경할 수도 있습니다.

위의 공식 진술 외에도 다음과 같은 APK 분석기에 영향을 미치는 다른 조건을 추가하고 싶습니다.

개발자가 모듈화 경험이 어느 정도입니까?

모듈화는 건축 (개발자) 이 부엌이 있어야하는 곳과 휴게실이 있어야하는 곳, 화장실이 있어야하는 곳을 정의 하는 집과 같습니다 . 아키텍처가 WC와 주방을 결합하기로 결정하면 어떻게됩니까? 예, 이것은 재앙입니다.

개발자가 경험이 많지 않으면 모듈화하는 동안 발생할 수 있습니다.


추가 정보 외에 OP 질문에 대한 답변

여기 나는 의견에서 op 질문에 대답합니다.

별도의 Gradle이 참조 된 메소드 수에 추가되는 이유는 무엇입니까? 그리고 별도의 의존성에 대해 최종 결과가 단일 APK 인 경우 'app'의 중복 종속성이 없으며 기능 모듈이 참조 된 메소드 수에 추가 될 것이라고 생각합니다.

모듈은 빌드, 테스트 및 디버깅 할 수 있으므로 반드시 고유 한 Gradle & Dependencies를 가져야합니다.

멀티 모듈 프로젝트가 준수되는 동안 컴파일러는 .dex다음을 포함한 여러 파일을 생성 합니다.

  • .dex전체 통합 종속성 파일
  • 모듈 .dex

종속성 .dex파일은 모든 모듈 gradles 의 통합입니다

모듈 gradle이 최종 Referenced Mothods Count에 어떤 영향을 미치는지 살펴 봅시다!

결과는 같지만 참조 방법 수에는 차이 가있는 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.7kReferenced Method Counts의 차이가 발생 했습니다.

그리고 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파일을 선택한 다음 분석기 필터 평등을 선택했습니다.

우리 프로젝트에서 우리는 centralized dependencies.gradle 파일을 사용하므로 버전이 다를 가능성이 없습니다. 따라서 기능 모듈에 동일한 / 정확한 종속성 세트와 해당 버전이 있어도 참조 된 메소드 수가 증가 할 것이라고 생각하십니까?

이론적으로 참조 된 메소드 수를 증가 시키지 않아야 합니다. 그러나 내가 설명했듯이 개발자 경험은 최종 결과에 큰 영향을 미칩니다.

팀 분석기 는 출시 전에 성능 문제를 확인하고 수정해야합니다.

  • 규칙을 지키다
  • 축소 및 축소 된 리소스
  • androidManifest.xml
  • gradle 설정

이제 개발자 경험 및 코드 유지 관리가 최종 결과에 어떤 영향을 미치는지 명확히하고 싶습니다 . APK가 중앙 집중식 종속성을 사용하는 경우에도

그림 3

위의 예에서, i'v 증가 5.1k개수 참조 된 방법으로 하더라도 내가 가진 중앙 종속 !!!!!

어떻게 가능?

답은 : 프로젝트의 디렉토리에 쓸모없고 숨겨진 .jar파일을 추가했습니다 libs. 당신이 볼 수 있듯이 쉽게 나는 최종 결과에 영향을 미쳤다.

당신이 볼 수 있듯이 개발자 경험을 최종 result.as에게 결과에 영향을 미치는, 실질적으로 그것을 참조하는 방법 카운트 만 증가 될 가능성이 있습니다 이론적으로 해야 하지 .

그리고 병렬 컴파일을 비활성화하여 'app'모듈 만 컴파일 할 때 참조 된 메소드 수에 차이가없는 이유는 무엇입니까? 'app'모듈의 의존성 만 사용 되었기 때문에 줄어들었을 것입니다.

컴파일은 참조 된 메소드와 아무런 관련이 없습니다. counts.it는 개발자가 준수하고자하는 것을 준수합니다.


결론

이 문제와 관련된 모든 가능성을 다뤘습니다. 실제로 다른 상황에서 발생할 수 있으며 개발자는이 지침을 사용하여 문제를 해결할 수 있습니다.

  • 참조 된 방법이 증가한 이유와 경우에 따라 크게 증가하는 이유를 발견했으면합니다.
  • 모듈에는 Gradle & Dependencies와 모듈화로 모듈이 증가합니다. 따라서 이러한 방법 참조.
  • 모듈화는 실제로 무시할 수없는 앱 성능에 영향을 주지만 앱 유지 관리 수준을 크게 향상시킵니다.
  • 모듈화에 대한 개발자 경험 또한 최종 결과에 큰 영향을 미칩니다.

중요 사항 : 거의 모든 진술은 나의 조사 및 연구입니다. 실제로 오류와 결함이있을 수 있으며 향후 더 많은 정보를 추가하기 위해 업데이트 될 예정입니다.



AF 씨에게 감사드립니다. "이 질문은 참조 된 메소드가 상속 깊이와 관련이 있는가? 상속 깊이가 참조 된 메소드 수를 증가시키는 이유를 자세히 설명해 주시겠습니까? 우리의 경우와 같이 추가 레이어를 추가하지 않고 'app'모듈을 분할했습니다. 기능 모듈이 'app'모듈을 통해 다른 기능 모듈의 방법에 액세스하는 경우 참조 된 방법 수가 증가 할 가능성이 있습니까?
Rohit Surwase

@RohitSurwase 답변은 나머지 문장입니다. 상속 깊이는 메소드 참조, 모듈화 및 모듈화 cuz 상속 깊이를 증가시키지 않습니다.
Mr.AF

다른 모듈의 다른 기능에 액세스하는 기능인 @RohitSurwase는 실제로 참조 된 메소드 수를 크게 늘리지 않습니다. 참조 된 메소드 수를 증가시키는 주된 이유는 각 모듈에 필요한 Gradle & Dependencies입니다.
Mr.AF

@RohitSurwase 당신은 모듈 대 모듈 관계에 대한 좋은 팁을 지적합니다. 사실, 만약 2 개의 모듈이 너무 많은 관계와 참조 된 방법을 가지고 있다면 더 나은 성능을 위해 그것들을 결합해야합니다. 실제로 모듈은 용어 및 개념에서 독립적이어야합니다.
Mr.AF

1
내가 말한 @RohitSurwase, 사용하지 않는 jar는 귀하의 경우가 아닐 수도 있습니다. 내가 의미하는 것은 개발자 경험이며 가능할 수 있으며, 가능성은 다른 출처에서 나올 수 있습니다. 그리고 나는 당신이 그것을 찾는 데 필요한 모든 출처를 나열했습니다
Mr.AF

2

솔루션이 방금 클릭 한 것처럼 내 자신의 질문에 대답했지만 이것이 시도되지는 않았지만 확실히 또는 아마도 효과가 있습니다. :) Mr.AF답변 은 최종 솔루션에 도달하는 데 매우 유용했습니다. 왜?에 대해 이야기합니다. 그러나 그것을 피하는 방법이나 그것을 개선하는 방법이 아닙니다.

여기입니다 원래 / 실제 참조하는 방법의 수를 다시 얻을 수있는 방법 -

우리가 앱을 모듈화하는 방법에 의존하는 것이 아니라 의존성을 추가하는 방법에 달려 있습니다. ' 구현 '을 사용하여 종속성을 추가하면 해당 종속성이 모듈 전용으로 유지되며 다른 모듈에서는 사용할 수 없습니다. 그리고 ' api '(더 이상 사용되지 않는 '컴파일'과 동일)를 사용 하여 동일한 종속성을 추가하면 공용이되고 다른 종속 모듈에서 사용할 수 있습니다. 다중 모듈 프로젝트에서 각 모듈에 종속성을 추가하기 위해 '구현'을 사용하고 있기 때문에 각 모듈에는 필요한 모든 종속성이 포함되어 있으므로 개별적으로 컴파일 할 수 있습니다. 수정 된 모듈 만 컴파일 할 수 있으므로 빌드 / 컴파일 시간이 줄어 듭니다. 그러나 '구현'을 사용 하면 참조 된 메소드 수가 증가합니다. 중복 참조 메소드가 너무 많기 때문에.

따라서 빌드 시간이 중요하지 않지만 참조 된 메소드 수는 모든 모듈의 종속성 트리를 그릴 수 있으며 기본 모듈에서 'api'를 사용하여 중복 종속성을 추가 하지 않아도 됩니다. 이런 식으로 최상위 모듈조차도 기본 모듈에 의해 추가 된 종속성을 사용하여 중복을 피할 수 있습니다. 이렇게하면 빌드 시간이 늘어납니다.

디버그 빌드와 릴리스 빌드에 대한 종속성을 구별 할 수 있으면 두 가지를 모두 달성 할 수 있습니다 . 디버그 빌드에 '구현'을 사용하여 모든 종속성을 추가하고 'api'를 사용하여 릴리스 빌드에 대해 필수 및 최적화 된 종속성 만 추가하십시오 . 이런 식으로 디버그 빌드가 빨라지고 릴리스 빌드가 느려져 저렴합니다.

참고 : 디버그 및 릴리스 빌드에 별도의 종속성을 제공하는 방법을 알아 내면이 답변을 업데이트 할 것입니다.


나는 그것을 좋아했다. 좋은 재료.
Mr.AF

0

'com'패키지의 모든 차이점을 봅니다. 정확한 클래스가 축소 된 것을 확장하고 비교할 수 있습니다. 최신 R8로 빌드하면 기본적으로 일부 코드를 제거 할 수 있습니다. 일부 클래스를 모듈 축소기에 넣을 때 공개 클래스 / 메소드를 제거 할 수 있는지 또는 다른 모듈에서 사용하기 위해 유지 해야하는지 알 수 없습니다. 여기에 이미지 설명을 입력하십시오


예, 'com'을 포함하여 각 패키지를 확장하고 확인했습니다. 주요 관심사는 Apk Analyzer에서 개별적으로 참조 된 분석법 수의 추가가 총 참조 된 분석법 수와 다른 이유는 무엇입니까?
Rohit Surwase
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.