Копирование файлов в оболочке АБР с помощью run-as

Есть ли способ написать сценарий, который будет копировать файлы из оболочки ADB, используя run-as?

Единственный способ, который я знаю для копирования в оболочке adb, – использовать cat source > dest (изменить: современные версии Android имеют команду cp , что делает этот вопрос ненужным), но я могу только процитировать знак большего, чем один уровень Глубоко – поэтому мой скрипт может передать его в оболочку adb, но не для adb shell run-as.

Например, это работает:

adb shell "cat source > dest"

Но это не так:

adb shell run-as "cat source > dest"

И это:

adb shell "run-as cat source \> dest"

Я даже попытался создать небольшой скрипт и загрузить его на устройство, но я не могу запустить сценарий из оболочки adb – он говорит мне «разрешено отклонение». Я тоже не могу chmod скрипт.

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

Вариант использования в этом сценарии – это копирование файла в защищенное место на устройстве, а не извлечение его; Для извлечения в этом вопросе уже есть хорошие ответы.

OP попытался объединить следующие 3 команды (которые он не имел проблем, выполняющих один за другим в сеансе интерактивной оболочки) в одну неинтерактивную команду:

 adb shell run-as com.example.app cat /sdcard/temp_prefs.xml > shared_prefs/com.example.app_preferences.xml 

Для простоты начнем с интерактивного сеанса adb shell . Если мы просто попытаемся объединить последние две команды в одну строку:

 run-as com.example.app cat /sdcard/temp_prefs.xml > shared_prefs/com.example.app_preferences.xml 

Это не сработает из-за того, что перенаправление оболочки работает – только часть cat /sdcard/temp_prefs.xml команды будет запущена с помощью com.example.app UID

Многие люди «знают», чтобы включить часть команды в перенаправление в кавычки:

 run-as com.example.app "cat /sdcard/temp_prefs.xml > shared_prefs/com.example.app_preferences.xml" 

Это не работает, потому что команда run-as не достаточно умна, чтобы анализировать всю команду. Он ожидает, что исполняемый файл станет следующим параметром. Правильный способ сделать это: вместо этого использовать sh :

 run-as com.example.app sh -c "cat /sdcard/temp_prefs.xml > shared_prefs/com.example.app_preferences.xml" 

Итак, можем ли мы просто добавить команду adb shell к команде и сделать с ней? Не обязательно. Запустив команду со своего компьютера, вы также добавите еще одну локальную оболочку и ее синтаксический анализатор. Специфические требования к побегу будут зависеть от вашей ОС. В Linux или OSX (если ваша команда еще не содержит каких ' либо), легко оцифровывать всю команду так:

 adb shell 'run-as com.example.app sh -c "cat /sdcard/temp_prefs.xml > shared_prefs/com.example.app_preferences.xml"' 

Но иногда проще использовать альтернативные решения с (-out или less) кавычками:

 adb shell run-as com.example.app cp /sdcard/temp_prefs.xml shared_prefs/com.example.app_preferences.xml 

Или если ваше устройство не имеет команды cp :

 adb shell run-as com.example.app dd if=/sdcard/temp_prefs.xml of=shared_prefs/com.example.app_preferences.xml 

Также обратите внимание, как я использовал shared_prefs/com.example.app_preferences.xml вместо полного /data/data/com.example.app/shared_prefs/com.example.app_preferences.xml – обычно внутри команды run-as ваш текущий каталог является HOME dir вашего пакета.

Следуя совету Криса Стреттона, способ, которым я в конечном итоге получил это, был следующим (для копирования общих настроек на устройство):

 adb push shared_prefs.xml /sdcard/temp_prefs.xml cat <<EOF | adb shell run-as com.example.app cat /sdcard/temp_prefs.xml > /data/data/com.example.app/shared_prefs/com.example.app_preferences.xml exit exit EOF 

Трубопровод непосредственно для adb shell run-as не работал, и я не знаю, почему, но соединение с adb shell происходит. Трюк заключается в том, чтобы затем вызвать run-as из интерактивной оболочки и продолжать принимать входные данные из канала.

Документ «ЗДЕСЬ» позволяет мне легко вставлять новые строки для разделения команд и, в общем, просто делает его доступным для чтения; Мне не повезло с точкой с запятой, но это могло быть из-за того, как я делал что-то. Я считаю, что он может работать с другими методами соединения нескольких команд / новых строк; Я прекратил эксперимент, как только я, наконец, получил его на работу.

Два выхода необходимы, чтобы предотвратить зависание оболочки (killable с CTRL-C); Один для run-as , а другой для самой adb shell . Кажется, что оболочка Adb не реагирует на конец файла очень красиво.

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

 PACKAGE='com.mypackage.cool' SHAREDPREF_FILE="${PACKAGE}_preferences.xml" adb shell "run-as $PACKAGE cat /data/data/$PACKAGE/shared_prefs/$SHAREDPREF_FILE">$SHAREDPREF_FILE 

Теперь у нас есть данные файла sharedpreference, хранящегося в одноименном файле.