Перемещение места установки на устройстве Android 5 Lollipop без рута

У меня есть Moto G (2-го поколения) с Android 5.02. Внутренняя SD-карта составляет около 8 ГБ, и у меня есть внешняя SD-карта с 16 ГБ свободного места.

Перемещение приложения на SDCARD из меню приложения перемещает его на sdcard0, которая является внутренней SD-картой.

Команда оболочки adb:

pm get-install-location

дает мне:

0[auto]

Я попытался установить место установки через:

pm set-install-location 2

Но я получаю эту ошибку:

Error: java.lang.SecurityException: Package android does not belong to 2000

То есть я считаю, что жалуются на права root.

И поскольку это производственная сборка, пытающаяся:

adb root

дает мне:

 adbd cannot run as root in production builds

Есть ли способ настроить приложения для установки их данных на внешнюю SD-карту?

PS: я не хочу устанавливать пользовательскую прошивку или устанавливать стороннее программное обеспечение для рутирования телефона.

Редактировать: я заметил, что данные приложений хранятся в папке /storage/sdcard0/Android, поэтому я подумал о перемещении этой папки /storage/sdcard1/и создании вместо этого символической ссылки:

ln -s /storage/sdcard1/Android /storage/sdcard0/Android

это сделает работу?

Спасибо.

Ответы (5)

В общем говоря: вы не можете. По крайней мере , без рута .
Основные причины, по которым Android не позволяет установить приложение на внешнюю SD-карту:

  1. Безопасность : это основная причина этого ограничения. Базовые файловые системы, такие как NTFS или FAT (любая их версия), не позволяют управлять разрешениями в стиле Unix.
    Это означает: любое приложение сможет записывать в любой файл в этом хранилище.
    Думая о вредоносных приложениях, они могли бы заменить правильные приложения поддельными / зараженными, заблокировав ваш телефон и сделав его непригодным для использования.

  2. Энергонезависимое хранилище . Внешнюю SD-карту небезопасно постоянно вставлять в устройство. Вы можете извлечь его в любое время, что делает вашу SD-карту не очень хорошим кандидатом на постоянное хранение. Представьте, что приложения работают с вашей SD-карты, и вы извлекаете ее. Эти приложения просто вылетают, и все другие приложения, сохраненные на вашей SD-карте, также исчезают. Вы не можете использовать их в это время, и на данные этих приложений также влияет причина № 1.

У меня есть фон Linux, поэтому я рассмотрел этот подход: я заметил, что пункт меню приложения «Переместить на SDCARD» создал папку с именем Android на sdcard0 (внутренняя) с данными приложений на ней; будет ли работать символическая ссылка (в sdcard0) с именем Android на папку с именем Android в sdcard1?
Проблема в том, что Android хранит только данные приложения и obb в формате /sdcard/sdcard0/Android. Приложения хранятся в скрытой папке под названием , .android_secureкуда даже rootдоступа нет (проверил на своем устройстве, нельзя даже cdв ту папку).
Собственно, это именно то, что мне нужно! Основная проблема, которая заставила меня задуматься об этом, - это данные , особенно в тяжелых играх. Основные приложения не такие большие по сравнению с данными, которые они добавляют позже. Так ты думаешь, это может сработать?
Если это только данные или обб то конечно работает. По крайней мере, в версиях Android, которые не позволяют sdcard_rwпринадлежать к rootгруппе или вообще не отображают пользователя sdcard_rw. Но с небольшими изменениями разрешений вы сможете разобраться с этим.
Бег ls -l /storage/sdcard0дал мне это, lrwxrwxrwx root root 2015-04-20 15:59 sdcard0 -> /storage/emulated/legacyи бег ls -l /storage/sdcard0/дал мне это drwxrwx--x root sdcard_r 2014-12-20 18:16 Android... Это хорошая или плохая новость? Поскольку я не root, я считаю, что не могу устанавливать разрешения.
Первый результат был предсказуем, ваша внутренняя SD-карта на самом деле находится в точке /data/media, где storage/emulated/legacyуказывает на . Другим результатом является «легкое исправление»: сначала вам нужно переместить исходную Androidпапку в другое место или переименовать ее, чтобы освободить место для символической ссылки. Затем дайте ссылку /storage/sdcard1/Androidи /storage/sdcard0/Androidназовите ссылку Android. Наконец исправьте все разрешения (777). Это просто теоретически, но я думаю, что это должно работать так.
Я тестирую это прямо сейчас. cp -R /storage/sdcard0/Android /storage/sdcard1/(слишком шаткий по поводу mvлол) то rm -r /storage/sdcard0/Androidтогда ln -s /storage/sdcard1/Android /storage/sdcard0/Android. Если это сработает, вы получите кредит, поэтому вы можете обновить свой ответ. Я дам Вам знать! ;-)
Не удаляйте Androidего, это приведет к поломке всех запущенных приложений (или, по крайней мере, большинства из них). Это просто теоретический подход, вылетевший из головы; нечего точно следовать. Если вы достаточно быстры, вы сможете восстановить приложения после сбоя, но имейте в виду, что все действия отменяются после следующей перезагрузки.
Ага! Все разошлись! лол, я не смог создать символическую ссылку: это выдало мне ошибку ln: /storage/sdcard0/Android: Operation not permitted. Итак, следующий вопрос: как создать символическую ссылку? (Я отменил свои изменения, и все в порядке.. или так я думаю на данный момент! LOL)
Основная проблема заключается в следующем: Android отслеживает доступ к файлам и, если одна из Androidпапок отсутствует, через мгновение создает их заново. по этой же причине такие приложения, как Link2SD, связывают папки отдельных приложений, а не всю Androidпапку. Вы можете попробовать это, но я не могу обещать успеха.
Это довольно интересно, потому что у меня проблема только с папкой данных игры (которая занимает 2 ГБ). Я попробую и отчитаюсь. Спасибо. PS: Link2SD ничего не сделал в моем случае.
Именно так работал Link2SD в прошлый раз, когда я его использовал. Мне это больше не нужно, потому что места для хранения достаточно :)
Мне не удалось создать ни одной символической ссылки. ( Operation not permitted). Я считаю, что это просто потому, что мой sdcard1отформатирован в fat32. Во что мне его форматировать (имею в виду его основной раздел)?
Вы можете создать символическую ссылку в любом месте, пункт назначения не имеет значения (даже если fuseвы не сможете создать символическую ссылку на вашу внешнюю SD-карту). Если вы можете, попробуйте отформатировать SD-карту, ext4чтобы разрешения можно было применять без использования fuseв качестве промежуточного менеджера разрешений, который блокирует большинство попыток чтения и записи без надлежащего разрешения пакета.
Я не смог использовать ext4, так как мой телефон не распознал его и сохранил w95 fat32 LBA (проблема с ядром?!).. Я тоже не смог создать символические ссылки по многим причинам: отсутствие root (?!), проблема с fat32.. Теперь Думаю, я выберу вариант Б.. ^^
Только rootможет создавать симлинки. Запомни.

В принципе можно! ;)

  • Во- первых, рутируйте свой телефон!
  • Во-вторых, создайте дополнительный раздел на SD-карте (Ext.4) >= 2 ГБ и установите его в качестве основного.
  • В-третьих, загрузите и установите приложение Link2sd из игрового магазина. Откройте приложение, и я попрошу вас создать точку монтирования для вашего второго раздела. Выберите Да. Перезагрузить.

После перезагрузки КАЖДОЕ приложение, которое вы устанавливаете, автоматически перейдет на SD-карту.

Если не знаете как создать раздел ищите гайд в гугле их полно

Собственно, этого я и пытаюсь избежать: установки стороннего программного обеспечения. :-)

Это было настоящее путешествие в поисках ответа, не связанного с рутированием, но в итоге я:

  1. Разблокировка моего загрузчика

  2. Загрузка в TWRP без его установки:

    fastboot boot recovery.img
    
  3. Установка SuperSU от Chainfire через TWRP.

  4. Из эмулятора терминала или оболочки adb :

    su
    pm set-install-location 2
    
  5. Из меню приложения Settings > Applicationsпростым нажатием Move to SDCARDперемещает его* - его данные и obb - на внешнюю SDCARD.

  6. Удаление SuperSU....

Полный рут

Нет... Я этого не делал! 3 :)

Перейдите по этому адресу http://developer.android.com/tools/help/shell.html#shellcommands.

Android 5 и выше не поддерживает этоpm get-install-location

Попробуйте сделать резервную копию вашего apk и выполните следующие действия.

adb shell pm install -r -s <path of your apk>

Пример

adb shell pm install -r -s /storage/sdcard1/base.apk

-r означает переустановить apk с существующими данными, а -s означает SD-карту

« Android 5 и более поздние версии не поддерживают это место установки pm get-install » — откуда вы знаете? Попробуйте это: android.googlesource.com/platform/frameworks/base/+/… . Это для Android 5.1.1. У меня есть поддержка этого аргумента в моем Android 5.0.2, 5.1.1 и 6.0.1!

Сначала установите Adbd insecure ( скачать apk с xda-developers ).

После установки на ваше устройство откройте его и установите флажок: «Включить небезопасный adbd».

Теперь вы можете изменить место установки приложений.