Перейти к содержанию
Fire Monkey от А до Я
  • 0

Приложение закрывается после автозапуска


Rusland

Вопрос

Добрый день.

Делаю запуск приложения после рестарта системы согласно этой статье

Выключаю телефон, включаю - вижу что программа стартует, но тут же закрывается.

Если просто запустить программу, то стартует нормально и не закрывается.

Почему это происходит?

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Похоже закрывается в момент когда запрашивается пинкод на одной симкарте. Вроде памяти достаточно (особенно в момент старта системы... программа пока вообще пустая). 

 

Хотя нет, убрал симку где запрашивается pin-код: в первый раз программа не закрылась после перезагрузки телефона, а второй раз закрылась. 

 

Почему система закрывает прогу?  :)

Изменено пользователем Rusland
Ссылка на комментарий
  • 0
  • Модераторы

Да, проверил у себя. Такая же фигня, только я даже не вижу программу, мне просто выскакивает сообщение, что приложение завершилось. Пока несколько предположений, либо я где-то что-то забыл, либо ОС выгружает приложение из-за потребляемой памяти, либо что-то ещё... Нужно попробовать тоже самое с сервисом.

Ссылка на комментарий
  • 0
  • Модераторы

Ярослав, я вообще не по статье писал ресейвер))) Но про эти особенности знаю и конечно же перепроверил их. Единственное, попробовал сейчас задать явное имя проекта, но и это не помогло...

 

Сейчас, ради интереса попробую запустить проект из статьи...

 

 

АП. Проверил, такая же фигня.

Ссылка на комментарий
  • 0
  • Модераторы

Пока пытался отловить через monitor.bat, но он у меня не успевает найти устройство после перезагрузки. Где ещё лучше посмотреть? Сегодня уже точно не смогу, а завтра попытаюсь хоть какие-то логи выудить.

 

 

ап. 23.01.16. Подключение по USB происходит только после отрабатывания ресейвера...

ап.2. Попробовал с автозапуском сервиса, тоже самое, ошибка и всё... Не пойму, то ли я где-то в склейках что-то упускаю, то ли это ошибка в FMX.

Ссылка на комментарий
  • 0
  • Модераторы

Это крендец...

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

В проекте из статьи:

1) сбросил Deployment на дефолтные настройки, там было много лишнего... после чего добавил пересобранный classes.dex.

2) в Project Manager удалил файл AndroidManifest.template.xml, не знаю, за чем его туда добавил автор...

всё, компилим проект на устройстве и всё работает как надо...

 

Мой проект:

Не содержал в себе кучи мусора + код я перепроверял раз 100 + пересобирал classes.dex раз 20 точно. В своём проекте ничего не изменял, просто в очередной раз всё пересобрал и попробовал запустить...

 

Ярослав, не знаю в чём проблема... только вы там сможете разобраться...

 

Сейчас, ещё раз соберу проект из статьи, вообще ничего не трогая и посмотрю, запустится или нет...

И заодно проверю автозапуск для сервиса

 

 

АПДЕЙТ - 24.01.16 1:20 МСК

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

1:24 - Обнаружил, что среда подключила второй classes.dex, ок сейчас проверим...

1:30 - Проект отлично заработал...

 

В общем, моего ума не хватает, чтобы понять, в чём было дело... Могу только сказать, что все особенности, типа второго classes.dex я перепроверял раз 100. Более того, я свой проект писал вообще не по статье и он ведь тоже почему-то не работал... Какие-то чудеса...

 

 

С сервисом не прокатывает автозапуск, также вываливается с ошибкой...

ап.24.01.16 15:25 - Сервис пока так и не удаётся запустить

Ссылка на комментарий
  • 0

С сервисом не прокатывает автозапуск, также вываливается с ошибкой...

ап.24.01.16 15:25 - Сервис пока так и не удаётся запустить

Аналогично добавил сервис к проекту и при перезапуске устройства программа говорит "В программе произошла ошибка" и закрывается.

Теперь и при простом запуске также говорит... глюк на глюки, черт побери )

Изменено пользователем Rusland
Ссылка на комментарий
  • 0
  • Модераторы

Ну обычный автозапуск приложения у меня (тьфу-тьфу-тьфу) работает пока, а вот сделать такой автозапуск для сервиса мне пока не удалось, где-то косячу видимо, сегодня собирался ещё посмотреть эту тему, если время будет...

 

Пока с автозапуском сервиса у меня такие дела (это просто эксперименты):

Попытка №1:

Сервис - подсовываем Манифест + клеим classes
Приложение - стандартный Манивест + стандартный classes

Результат: Не ловит событие перезагрузки устройства, само приложение работает как надо.
 

Попытка №2:

Сервис - стандартный Манивест + клеим classes
Приложение - подсовываем Манифест + стандартный classes

Результат: Ошибка "Приложение завершилось", т.е. событие ловит, но сервис/приложение завершается ошибкой

 

Попытка №3:
Сервис - стандартный Манивест + стандартный classes
Приложение - подсовываем Манифест + клеим classes

Результат: Сервис вообще не запускается, даже просто из приложения, валится ошибкой.

 

 

p.s. баги или ещё что... только опубликовал статью про создание простейшего сервиса, как объявился первый человек, у которого сервис не запускается...

Ссылка на комментарий
  • 0

О, а это идея!

Я действовал только по третьему сценарию как у вас:

"Сервис - стандартный Манифест + стандартный classes

Приложение - подсовываем Манифест + клеим classes"

 

Надо тоже попробовать к самому сервису клеить classes (как в первом варианте).

 

Andrey Efimov, а не пробовали ли вы вместо замены classes.dex добавлять в Deployment созданный bat-ником файл *.dex до склейки.

Где-то видел на stackoverflow такое предложение... я попробовал, но у меня не получилось.

 

Почитал вашу статью, возникли вопросы:

1.) Почему проект сервиса обязательно должен быть в отдельной папке? Из-за того что все компилируется в одну папку Android/Debug, да?

2.) Что будет если переименовать сервис в «Service»? )

3.) Можно подробнее как смотреть логи через monitor.bat? )

 

Не могли бы вы расширить свою статью и рассказать в ней что можно использовать в сервисе, а что нет (например что нельзя использовать визуальные компоненты - это понятно, но хотелось бы знать что можно... можно ли в сервисе получать координаты местоположения с сенсора?) :)

 

PS. А какой classes.dex вы подсовывали в Попытках 1 и 2 в Сервис? Ведь при Build-е проекта Сервиса classes.dex не создается (кстати в Deployment сервиса по умолчанию classes подключается, но он выделен серым шрифтам что говорит о том что подключать то нечего)   :huh:

 

В общем на текущий момент по третьему Способу №3 просто программа запускается, но после рестарта системы программа стартует и закрывается ошибкой (значит событие рестарта ловится).

Сервис - стандартный Манифест + стандартный classes.dex

Приложение - редактированный Манифест + деплойдим склеенный Classes.dex

Отличие лишь в том что в bat-файле я заменил путь к исходному classes.dex на тот, который компилируется в Android\Debug

set EMBO_DEX="C:\Program Files (x86)\Embarcadero\Studio\17.0\lib\android\debug\classes.dex"  

заменил на свой

set EMBO_DEX="C:\Test\Proj\Android\Debug\classes.dex"  

Коллективный разум, помогай :) Изменено пользователем Rusland
Ссылка на комментарий
  • 0
  • Модераторы

Итак, я добился автозапуска сервиса! Всё оказалось очень даже банально...

Как сделать (вкратце):

1) Создаём сервис, собираем его

2) Создаём приложение, добавляем туда сервис, собираем приложение

3) Далее генерим "classes.dex" НЕ на основе файла по умолчанию, а на основе файла "classes.dex" из приложения (второй пункт)

4) Полученный файл будет меньше по размеру (пока не понял почему так происходит), его добавляем в приложение, через Deployment Manager и снимаем галочку с файла "classes.dex", который установлен по умолчанию

 

Т.е. мы склеим наш BroadcastReceiver с файлом, в котором уже упомянут Сервис. До этого, как я понимаю, склеивание происходило с файлом, в котором не был упомянут сервис или как-то так.

 

5) Профит. (Проверено!)

 

В ближайшие дни (постараюсь), я опубликую две новые статьи про автозапуск приложения и сервиса.

 

По поводу вопросов:

1) Правила про отдельную папку и имя сервиса указаны в документации

1.1) Про папку, да все файлы перемешаются и ошибок не избежать, да и не правильно это (в общем случае, плохой тон), городить всё в одну папку, потом сами запутаетесь

1.2) Имя, не знаю, что будет, но не зря это имя зарезервировано. Проверять не хочу))

2) Про monitor.bat полно информации в интернете, воспользуйтесь поиском.

 

По поводу расширения статьи.

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

 

 

АП (13:40). Только сейчас заметил, что вы идёте по такому же пути :D Но у меня служба стартанула вообще без проблем

Ссылка на комментарий
  • 0

Пока пытался отловить через monitor.bat, но он у меня не успевает найти устройство после перезагрузки. Где ещё лучше посмотреть? Сегодня уже точно не смогу, а завтра попытаюсь хоть какие-то логи выудить.

 

ап. 23.01.16. Подключение по USB происходит только после отрабатывания ресейвера...

У меня Android Device Monitor успевает найти устройство до загрузки и я вижу логи, вижу как проскакивает ошибка, но как только я жму кнопку Сохранения в файл, получаю файл 0 размера. Да и кроме того в логе видимо какое-то ограничение на количество записей - за считанные секунды моя ошибка пропадает и не успеваю ее посмотреть. Как расширить количество записей в логе?

Оказывается прежде чем сохранять выделять надо через Ctrl+A

Изменено пользователем Rusland
Ссылка на комментарий
  • 0
  • Модераторы

Вот ещё особенность Андроида, из-за неё может вываливаться ошибка:

Необходимо запустить приложение/сервис один раз вручную или через код. Т.е. устанавливаете приложение, запускаете его или сервис из него. Перезагружаетесь и должен сработать автозапуск.

Ссылка на комментарий
  • 0

Andrey Efimov, у меня сервис стартует автоматом OnCreate



  private
    { Private declarations }
    FService: TLocalServiceConnection;
...
procedure TForm1.FormCreate(Sender: TObject);
begin
  FService := TLocalServiceConnection.Create;
  FService.StartService('MyService');
end;

Сейчас попробую сначала проект создать.

 

Еще вот на что обратил внимание, в предыдущем проекте я забыл в сервисе прописать

function TAndroidServiceDM.AndroidServiceStartCommand(const Sender: TObject;
  const Intent: JIntent; Flags, StartId: Integer): Integer;
begin
  Result := TJService.JavaClass.START_STICKY;
end; 

НО при закрытии приложения, процесс все равно восстанавливался!

Спрашивается, а нужна ли вообще эта строчка?

Изменено пользователем Rusland
Ссылка на комментарий
  • 0

Создал новый проект, повторил все действия, добавив лишь Androidapi.JNI.App в юнит сервиса и System.Android.Service в юнит программы (согласно статье :)). Также вижу как приложение крошится при старте. При обычном запуске все нормально.

 

Успел сохранить вот такой кусок лога в Android Device Monitor (фильтровал по названию проекта myproject)

01-27 15:24:39.514: D/PackageManager(493): scan package: /data/app/com.mycompany.myproject-2.apk , start at: 21264ms.
01-27 15:24:40.123: I/PackageManager(493): Perform pre-dex opt for package: com.mycompany.myproject
01-27 15:24:40.132: D/PackageManager(493): scan package: /data/app/com.mycompany.myproject-2.apk , end at: 21881ms. elapsed time = 617ms.

01-27 15:25:02.167: I/ActivityManager(493): Start proc com.mycompany.myproject for broadcast com.mycompany.myproject/com.mycompany.myproject: pid=1132 uid=10119 gids={50119, 3003, 1028}
01-27 15:25:02.225: V/ActivityManager(493): Binding process pid 1132 to record ProcessRecord{425f9c00 1132:com.mycompany.myproject/u0a10119}
01-27 15:25:02.228: V/ActivityManager(493): New app record ProcessRecord{425f9c00 1132:com.mycompany.myproject/u0a10119} thread=android.os.BinderProxy@427c5b18 pid=1132
01-27 15:25:02.278: E/AndroidRuntime(1132): java.lang.RuntimeException: Unable to instantiate receiver com.mycompany.myproject: java.lang.ClassNotFoundException: Didn't find class "com.mycompany.myproject" on path: DexPathList[[zip file "/data/app/com.mycompany.myproject-2.apk"],nativeLibraryDirectories=[/data/app-lib/com.mycompany.myproject-2, /vendor/lib, /system/lib]]
01-27 15:25:02.278: E/AndroidRuntime(1132): Caused by: java.lang.ClassNotFoundException: Didn't find class "com.mycompany.myproject" on path: DexPathList[[zip file "/data/app/com.mycompany.myproject-2.apk"],nativeLibraryDirectories=[/data/app-lib/com.mycompany.myproject-2, /vendor/lib, /system/lib]]
01-27 15:25:02.434: V/WindowManager(493): Changing focus from Window{427992b8 u0 com.android.launcher/com.android.launcher2.Launcher} to Window{425f6970 u0 Application Error: com.mycompany.myproject}
01-27 15:25:02.436: I/WindowManager(493): Gaining focus: Window{425f6970 u0 Application Error: com.mycompany.myproject}
01-27 15:25:02.462: I/BufferQueue(133): [Application Error: com.mycompany.myproject](this:0x4198d920,api:0) setConsumerName: Application Error: com.mycompany.myproject
01-27 15:25:02.486: I/BufferQueue(133): [Application Error: com.mycompany.myproject](this:0x4198d920,api:0) setDefaultBufferSize: w=480, h=190
01-27 15:25:02.504: I/BufferQueue(133): [Application Error: com.mycompany.myproject](this:0x4198d920,api:0) connect: api=2
01-27 15:25:02.504: I/BufferQueue(133): [Application Error: com.mycompany.myproject](this:0x4198d920,api:2) setSynchronousMode: enabled=1
01-27 15:25:02.504: I/BufferQueue(133): [Application Error: com.mycompany.myproject](this:0x4198d920,api:2) new GraphicBuffer needed
01-27 15:25:02.520: I/SurfaceTexture(133): [Application Error: com.mycompany.myproject](this:0x4198e908,api:2) [void* android::SurfaceTexture::createImage(EGLDisplay, const android::sp<android::GraphicBuffer>&)]
01-27 15:25:02.624: D/Launcher(738): IconCache, CacheLocked get title from cache: title = MyProject
01-27 15:25:02.646: D/Launcher(738): AllAppsList, Add application in app list: app = ComponentInfo{com.mycompany.myproject/com.embarcadero.firemonkey.FMXNativeActivity}, title = MyProject
01-27 15:25:02.955: D/AES(493):     process : com.mycompany.myproject
01-27 15:25:02.955: D/AES(493):      module : com.mycompany.myproject v1 (1.0.0)
01-27 15:25:02.956: D/AEE/LIBAEE(493): shell: raise_exp(2, 1132, -1361051648, com.mycompany.myproject, 0x0x56549008, 0x0x0)
Изменено пользователем Rusland
Ссылка на комментарий
  • 0
  • Модераторы

Я сходу уже вижу ошибки... в Манифесте, в java классе.

Похоже, всё-таки нужна статья на русском языке...

 

Вот эта ошибка из логов, как раз подтвердила мои догадки:

E/AndroidRuntime(1132): java.lang.RuntimeException: Unable to instantiate receiver com.mycompany.myproject

Ссылка на комментарий
  • 0
  • Модераторы

Java класс:

Вы же хотите запустить сервис, а запускаете Активити приложения...

Правильная строка:

launchintent.setClassName(context, "com.embarcadero.services.MyService");

Также некоторые модули совсем необязательны там.

 

И вообще, вы хотите запустить службу, но весь код, запускает у вас активити...

 

т.е. для службы надо так:

public class BootCompletedReceiver extends BroadcastReceiver {

    public void onReceive(Context context, Intent intent) {

        if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
            Intent TestLauncher = new Intent();
            TestLauncher.setClassName(context, "com.embarcadero.services.TestService");
            context.startService(TestLauncher);
        }

    }
 
}

Манифест:

Строка:

<receiver android:name="com.mycompany.myproject"

имя указано неверно, у вас же Ресейвер имеет имя "com.mycompany.BootReceiver", откуда взялось "com.mycompany.myproject"?!

 

Правильно писать:

<receiver android:name="com.mycompany.BootReceiver"

и т.д.

 

 

Это батник из статьи? у меня другой :), в своей статье выложу

 

Ну вот, всё работает как часы :)

 

Держите исправленный проект:

ASARservRepair.zip

 

p.s. Забыл вычистить проект от classes.dex, поэтому весит 900 кб.

 

p.s.2 Постараюсь, поскорее написать статью, чтобы все подобные ошибки не возникали у людей :)

Ссылка на комментарий
  • 0

Andrey Efimov, большое спасибо. Понял свои ошибки.

Теперь все работает как надо!  :D

 

Статья будет очень полезна для всех! Также хотелось бы видеть продолжение статьи про Сервисы, в которой бы освещались возможности... что можно делать, а что нельзя... а то приходится методом тыка изучать :)

Изменено пользователем Rusland
Ссылка на комментарий

Присоединяйтесь к обсуждению

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

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...