Preventing Android App Cloning — статья о том, как предотвратить установку двух экземпляров приложения на устройство.
Другие полезные статьи на тему Kotlin:
- Как сделать код на Kotlin более понятным
- Шпаргалка по коллекциям Kotlin
- Хорошие и плохие приемы программирования на Kotlin
- Основы функционального программирования на Kotlin
Некоторые производители встраивают в свои прошивки функцию клонирования приложения (например, Parallel Apps в OnePlus, Dual Apps в Xiaomi), которая позволяет установить на смартфон копию какого-либо приложения. Прошивка создает дополнительного Android-пользователя с идентификатором 999 и устанавливает копию приложений от его имени.
Такую же функциональность предлагают некоторые приложения из маркета (Dual Space, Clone App, Multi Parallel). Они работают по-другому: создают изолированную среду для приложения и устанавливают его в собственный приватный каталог.
И тот и другой способ могут сломать нормальное функционирование приложения, если не совпадают разрешения на доступ к той или иной функциональности или файлам. Например, приложение не сможет получить доступ к стандартному каталогу загрузок. Поэтому в некоторых случаях такое клонирование стоит запретить.
Сделать это можно с помощью анализа пути к приватному каталогу приложения. К примеру, приложение с именем пакета com.example.app при нормальной установке будет иметь приватный каталог по следующему пути:
1 |
/data/user/0/com.example.app/files |
При создании клона с помощью одного из приложений из маркета путь будет уже таким:
1 |
/data/data/com.ludashi.dualspace/virtual/data/user/0/com.example.app/files |
А при создании клона с помощью встроенных в прошивку инструментов — таким:
1 |
/data/user/999/com.example.app/files |
Автор статьи предлагает анализировать этот путь и проверять его либо на количество точек, либо на наличие цифры 999. Я переписал его громоздкий Java-код на Kotlin:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
private const val DUAL_APP_ID_999 = "999" fun checkAppCloning(context: Context): Boolean { val path: String = context.filesDir.path val packageName = context.packageName val pathDotCount = path.split(".").size-1 val packageDotCount = packageName.split(".").size-1 if (path.contains(DUAL_APP_ID_999) || pathDotCount > packageDotCount) { return false } return true } |
На этом все. Теперь вы знаете, предотвратить клонирование приложения на Android.