Мы хотим выполнить проверку, что при обновлении версии приложения, пользовательские данные сохраняются. При этом старая версия у нас всегда одна и та же, а новые меняются и прибавляются к старым. Можно решить задачу следующим образом:

  1. Устанавливаем старую версию приложения.
  2. Выполняем сценарий для формирования пользовательских данных.
  3. Устанавливаем новую версию приложения.
  4. Выполняем сценарий проверки пользовательских данных.

Отличный, простой способ, если все это автоматизировать, но есть пункт 2, который может занимать много времени. Альтернативный подход - перенос данных старой версии из каталога /data/data/packagename/. Им мы и воспользуемся. Для этого необходимо устройство с root правами, неплохо подходит эмулятор. Идея состоит в том, чтобы заранее, руками сформировать пользовательские данные и подкладывать их на устройство. В таком случае мы получаем следующий порядок действий (у нас уже есть содержимое каталога /data/data/packagename/ с устройства, на котором были нужные нам для проверки данные, сохраняем его в каталог backup):

  1. Устанавливаем старую версию приложения.
  2. Запускаем приложение.
  3. Выгружаем приложение из памяти.
  4. Смотрим пользователя, для которого установилось приложение adb shell su -c ls -l /data/data/packagename/ (проблема в том, что каждое приложение получает права на файлы для уникального пользователя, что мешает нам просто подменить данные)
  5. Копируем backup на устройство adb push backup /data/local/tmp/backup/
  6. Копируем на устройство скрипт для рекурсивной смены прав (до Android версии 6.0 у команды chown нет флага -r) adb push chownr.sh /sdcard/ (листинг скрипта ниже).
  7. Меняем владельца для backup на такой же как у браузера из пункта 4 adb shell su -c sh /sdcard/chownr.sh u0_a61 u0_a61 /data/local/tmp/backup (u0_a61 - пример имени пользователя).
  8. Подменяем данные adb shell su -c cp -R /data/local/tmp/backup/* /data/data/packagename/.
  9. Устанавливаем новую версию приложения.
  10. Выполняем сценарий проверки пользовательских данных.

Шагов получилось больше, но при частых проверках, молниеносные шаги 3-8, сэкономят огромное количество времени, по сравнению с медленным шагом 2 из первого подхода.

chownr.sh

#!/system/bin/sh
recurse() {
 for i in "$3"/*;do
    if [ -d "$i" ];then
        case $i in
            *lib) echo "skip lib directory"
            ;;
            *) chown $1:$2 "$i"
               recurse $1 $2 "$i"
            ;;
        esac
    elif [ -f "$i" ]; then
        chown $1:$2 "$i"
    fi
 done
}
recurse $1 $2 $3