2016-06-06 2 views
0

Некоторые приложения, особенно те, которые больше не поддерживаются, серьезно ошибаются, когда устройство Android с Marshmallow переходит в режим доз. Приложения, разработанные в качестве заметок будильника или планировщиков для выполнения определенных задач в будущем, не работают надежно, полностью побеждая их цель.Как исправить приложения, которые пропускают сигналы тревоги в режиме доз?

Обходные пути хорошо известны разработчикам или когда уязвимые приложения являются open-source, например. ответил here и задокументирован here.

Но как фиксировать приложения с закрытым исходным кодом, авторы которых не поддерживают их?

Обратите внимание, что отключение оптимизации батареи для приложения не поможет в режиме доз в соответствии с ответом here.

ответ

3

Этот ответ относится к приложениям, которые страдают от поздних пробуждений из-за использования методов AlarmManagerset и setExact. Эти методы устанавливают аварийные сигналы, которые доставляются только во время обслуживания «обслуживания» или когда устройство просыпается из-за вмешательства пользователя или других обстоятельств.

Решение должно использовать методы setAndAllowWhileIdle и setExactAndAllowWhileIdle соответственно; но возможность модифицировать и перекомпилировать apks - это трюк.

  1. Получить apktool: нажмите на кнопку «Current Release» ссылку, чтобы загрузить банку, apktool_2.1.1.jar с этого письма.
  2. Получите apk приложения, которое вы хотите исправить. Я использовал apk20.com, чтобы найти downlaodable apk приложения, которое я пытался исправить, но есть также способы для get the apk of an app installed on the phone.
  3. Если Java исполняемых файлов на вашем пути, и apktool банка и APK находятся в текущем каталоге, разбирайте APK с apktool:

    $ java -jar apktool_2.1.1.jar d com.example.android-app.apk 
    

    разобранные файлы (формат smali) будет находиться под com.example.android-app/ в текущий реж.

  4. Заменить все вхождения AlarmManager;->set/setExact с AlarmManager;->setExactAndAllowWhileIdle во все разобранные файлы smali. Вы можете сделать это вручную, либо автоматизировать с find и sed:

    $ find com.example.android-app -name *.smali -exec \ 
        sed -i -e 's/AlarmManager;->set\(Exact\)\?(/AlarmManager;->setExactAndAllowWhileIdle(/g' {} + 
    

    Это заменит как set и setExact с setExactAndAllowWhileIdle.

  5. Перестроить APK:

    $ java -jar apktool_2.1.1.jar b com.example.android-app 
    

    Обратите внимание на b для сборки, и отсутствие .apk ссылаться на каталог, в котором измененные файлы. Полученный apk создается как com.example.android-app/dist/com.example.android-app.apk

  6. Подпишите apk.Это раздражает часть, если вы никогда не подписывали баночка файла перед:

    • Сначала создать хранилище ключей и ключ подписи в одном шаге (official documentation):

      $ keytool -genkeypair -validity 36500 
      Enter keystore password: android 
      Re-enter new password: android 
      What is your first and last name? 
          [Unknown]: 
      What is the name of your organizational unit? 
          [Unknown]: 
      What is the name of your organization? 
          [Unknown]: 
      What is the name of your City or Locality? 
          [Unknown]: 
      What is the name of your State or Province? 
          [Unknown]: 
      What is the two-letter country code for this unit? 
          [Unknown]: 
      Is CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown correct? 
          [no]: yes 
      
      Enter key password for <mykey> 
           (RETURN if same as keystore password): 
      

      Это создает хранилище ключей с паролем android в месте по умолчанию и ключ подписи с именем mykey, также с паролем android.

    • Теперь подписать перестроен APK (official documentation):

      $ jarsigner -tsa http://timestamp.digicert.com com.example.android-app/dist/com.example.android-app.apk mykey 
      Enter Passphrase for keystore: android 
      jar signed. 
      

      Эта процедура подписания имеет важное значение, так как ваш телефон будет отклонять ваш APK, если он не подписан с зашифрованным сообщением, как:

      Ошибка анализа

      Не удалось разобрать пакет.

  7. Удалите оригинальное приложение с телефона. Это важно, так как новый ключ подписи отличается от ключа подписи оригинального автора, и андроид откажется обновлять приложение при изменении ключа подписи. При попытке обновить пак, встроенный менеджер пакетов будет просто сказать вам:

    приложение не установлено

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

  8. Enable installation from unknown sources
  9. Получить перестроен APK на свой телефон и установить его. Есть различные способы сделать это, но эти два являются самым простым:

    • enable USB debugging, а затем запустить:

      $ adb install com.example.android-app/dist/com.example.android-app.apk 
      
    • скопировать APK в память телефона через USB, откройте file:///sdcard/ в браузере телефона и клик на apk, чтобы загрузить его, затем откройте его от загрузчика, чтобы установить его.

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