Google Android - это несложно

Добро пожаловать на форум сайта startandroid.ru
Текущее время: 21 ноя 2018, 21:30

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
 Заголовок сообщения: Proguard и всё, что с ним связано
СообщениеДобавлено: 14 мар 2016, 07:45 

Зарегистрирован: 08 янв 2015, 14:32
Сообщений: 115
Благодарил (а): 6 раз.
Поблагодарили: 5 раз.
Столкнулся с проблемой обфускации. в итоге нарыл массу интересной инфы. Копирую сюда. Может кто чего дополнит или подправит.

КАК ЮЗАТЬ Proguard

Суть в том, что наш код в APK очень кривой непожатый и не обфускован. Eсть полезная штука - proguard, который решает эту проблему. Во-первых делает код не читаемым - и это очень полезно, чтобы вашему приложению не выкручивали руки нерадивые юзвери. Ну и самое главное то, что всё внутри Вашего APK сжимается и упорядочивается так, чтобы мало весило и быстро работало.

Как это вообще делается - инфы достаточно в нете: Просто при релизе в студии ставится галка (или задаётся в коде билда) minifyEnabled true.

В app build.gradle должна появиться вот такая запись:

Код: [ Загрузить ] [ Скрыть ]
  1.   buildTypes { 
  2.         release { 
  3.             minifyEnabled true 
  4.             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'  
  5. #// - собстна два файла, первый - студия получит из SDK, а второй файлик настроек, в котором пишется что делать гварду с конкретными библиотеками или классами 
  6.             signingConfig signingConfigs.namecfg 
  7.         } 
  8.         debug { 
  9.             signingConfig signingConfigs.namecfg 
  10.         } 
  11.     } 



Начнём с того, что обфусковывать сторонние библиотеки нет смысла - они есть в открытом доступе и получить их внутренности не проблема. (обфускацией же мы пытаемся добиться целостности и нечитабельности данных или не? ) - ну вот какбы не нужно это делать!

Пресловутая библиотека appcompat уже миллион раз добавлена в исключения самого прогварда (на сегодня проблема решена автоматоматом, её прогвард умеет корректно добавлять в апк), но если же есть желание написать руками это исключение, то правильно будет использовать вот такую запись:

-keep class android.support.v7.** {*;}

можно (а точнее НУЖНО) также исключить другие библиотеки (редактируем файл proguard-rules):

-dontwarn org.apache.http.**
-dontwarn android.net.http.AndroidHttpClient
-dontwarn com.google.android.gms.**
-dontwarn com.android.volley.toolbox.**

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

обратите также внимание, что строки тут комментируют знаком "#", так как это не JAVA:

Код: [ Загрузить ] [ Скрыть ]
  1. # Add any project specific keep options here... 


Интересный момент: никто не предупреждал, но Proguard ругается насчёт одинаковых имён классов, если в одной активити вы использовали класс Hallobaby, то в другой активити это имя юзать не следует. либо выносите его отдельно и используйте классические правила наследования, либо используйте уникальные имена внутри проекта. При упаковке Proguard будет всё сжимать и утрамбовывать и очень удивится когда обнаружит одинаковые имена классов. Это Вы знаете, где у Вас чего лежит, а для него это ошибка: что то типа "can't write resource (Duplicate zip entry [classes.jar:])"

Равно также нарвётесь на такую же ошибку и в самих ресурсах, даже если они лежат в разных папках:
Пример:

Есть файл dimens.xml в нём ресурс:
Код: [ Загрузить ] [ Скрыть ]
  1. <bool name="makaka">true</bool> 

А в файле strings.xml лежит:
Код: [ Загрузить ] [ Скрыть ]
  1. <string name="makaka">makaka</string> 


На момент дебага ошибки не возникает. В R.java это разные ресурсы. проблем нет так как, когда вы их выдёргиваете, то пишете явно тип нужного ресурса.
НО!!! Proguard попытается сжать эти ресурсы и произойдёт коллапс. имена то у них одинаковые.

Для дешифрации конечного продукта можно использовать соответствующую утилитку и сам файлик proguard-android.txt. без него дешифровать очень сложно.

Для редактирования и дебажирования проекта снимаем галку minify - можно прямо в билдере заменить "minifyEnabled true" на "minifyEnabled false".


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ 1 сообщение ] 

Часовой пояс: UTC + 3 часа


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB