Скрытая установка .apk программно

OK,

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

У меня есть кастомная прошивка с root-правами (без play store). Это компьютер с Android-флешкой (поэтому у меня нет системного ключа для подписи моего приложения, если только я не пропустил что-то в документации по ядру). Я хочу, чтобы мое приложение каждую ночь проверяло наличие обновлений с моего сервера. Если есть новая версия, я хочу, чтобы она загружалась и устанавливалась без взаимодействия с пользователем.

Я знаю, что могу вызвать экран обновления с помощью

Intent intent = new Intent(Intent.ACTION_VIEW);
Uri uri = Uri.fromFile(new File(pathToApk));
intent.setDataAndType(uri, "application/vnd.android.package-archive");
startActivity(intent);

Но, как я уже сказал, это не то, что я хочу. SU и busybox стоят на устройстве. Кто-нибудь знает способ сделать это?


person Pyromanci    schedule 09.04.2014    source источник
comment
у вас должен быть системный ключ, если вы скомпилировали свой собственный ром. Кроме того, вам нужно использовать PackageManager для установки приложений, если я правильно помню. Вам нужно будет разработать частный API для установки ваших приложений, так как это на самом деле не поддерживается из коробки.   -  person njzk2    schedule 09.04.2014
comment
Это не полностью настраиваемый компилятор. Поскольку мне приходится переводить много прочитанных мной и других файлов документов (поскольку я, похоже, что-то упускаю, поскольку он не будет полностью компилироваться), я просто взял исходные образы системы и изменил их (загрузочные анимации, build.props и т. д. ).   -  person Pyromanci    schedule 09.04.2014


Ответы (1)


Вы можете получить доступ к PackageManager из командной строки, используя pm. Если su присутствует, вам нужно запустить

su pm install pathToApk.apk

Чтобы запустить его из приложения Java, используйте ProcessBuilder.

person njzk2    schedule 09.04.2014
comment
Я устал от этого, но он не устанавливался и не выводился. Вот код, который я выполнил. pastebin.com/Bz1EiXQc - person Pyromanci; 09.04.2014
comment
вам, вероятно, также нужно прочитать stderr, чтобы выяснить причину ошибки (позвоните redirectErrorStream(true) на свой pb) - person njzk2; 09.04.2014
comment
Кроме того, поскольку это команда оболочки, вы также можете попробовать запустить ее из оболочки adb, чтобы проверить ее. - person njzk2; 09.04.2014
comment
Я заставил его работать из оболочки adb, но все еще не мог заставить его работать через код. Вот мой процесс, который сработал. pastebin.com/8LXJ15is - person Pyromanci; 10.04.2014
comment
несколько ответов на ту же тему: stackoverflow.com/questions/14398543/ - person njzk2; 10.04.2014
comment
Я изменил его, чтобы просто запустить su, а затем записать команду pm в поток вывода процесса, и это сработало. - person Pyromanci; 10.04.2014
comment
@Pyromanci, не могли бы вы опубликовать код, который сработал. Я борюсь с той же проблемой в эту самую минуту. - person Ben; 01.05.2014
comment
Извините, у меня больше нет этого кода (этот вопрос был более года назад). Если вы посмотрите на последний комментарий njzk2. Второй раздел кода в вопросе был в основном тем, что я делал в то время. Хотя я больше не делаю этого таким образом, поскольку приложение, с которым я это делал, стало системным приложением в пользовательском ПЗУ, над которым я работал, и теперь обновляется через обновления OTA. - person Pyromanci; 08.05.2015