ConsumerProguardFiles vs ProguardFiles

Я пытался создать приложение, содержащее библиотечный модуль La с proguard, и я заметил, что библиотека не была запутана. Попытался понять, почему. В этот момент времени это был мой buildType:

release {
 minifyEnabled false
 useProguard true
 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
} 

После некоторого поиска я столкнулся с функцией ConsumerProguardFiles, которая гласит:

Файлы правил ProGuard, которые будут включены в опубликованный AAR.

Эти файлы правил proguard будут затем использоваться любым прикладным проектом который потребляет AAR (если включен ProGuard).

Это позволяет AAR указывать правила сокращения или обфускации исключений.

Это допустимо только для проекта библиотеки. Это игнорируется в приложении проект.

С этим теперь buildType моей библиотеки La выглядит следующим образом:

release {
 minifyEnabled false
 useProguard true
 consumerProguardFiles 'proguard-rules.pro'
}

И теперь моя библиотека La использует его правила proguard, а код библиотеки запутан.

Итак, мои вопросы:

1) В чем причина этого различного поведения. Почему ProguardFiles не запутывает библиотеку, а игнорирует ее?

2) Я предполагаю, что то, что делает ConsumerProguardFiles, заключается в объединении правил библиотеки с основными правилами proguard приложения. Правильно ли это предположение?

3) Короче: используйте proguardFiles для приложений и ConsumerProguardFiles для библиотек. Правильно?

Спасибо, что прочитали время!

Ответ 1

Насколько я понимаю, minifyEnabled false означает, что ProGuard не запускается, чтобы минимизировать/обфускать ваш библиотечный модуль. Это то, что вы хотите, потому что библиотечный модуль не может знать, какие его части будут использоваться в вашем прикладном модуле.

Вместо этого библиотечный модуль должен предоставить свои соответствующие правила proguard модулю приложения (через consumerProguardFiles), а затем модуль приложения запустит ProGuard как с собственными правилами, так и с правилами библиотеки, чтобы минимизировать конечное приложение APK.