gpt4 book ai didi

android - 如何修复在打瞌睡模式下错过警报的应用程序?

转载 作者:行者123 更新时间:2023-11-29 17:18:34 25 4
gpt4 key购买 nike

某些应用程序,尤其是那些不再维护的应用程序,在装有 Marshmallow 的安卓设备进入休眠模式时会出现严重的错误行为。设计为闹钟替代品或计划程序以在未来执行某些任务的应用程序不再可靠地工作,完全违背了它们的目的。

变通办法为开发人员所熟知,或者受影响的应用程序是开源的,例如回答here并记录在案 here .

但作者不再维护它们的闭源应用程序如何修复?

请注意,如回答here,禁用应用程序的电池优化对打瞌睡模式没有帮助。 .

最佳答案

此答案适用于由于使用 AlarmManagersetsetExact 方法而导致延迟唤醒的应用。这些方法设置仅在休眠“维护”窗口期间或设备因用户干预或其他情况而唤醒时发出的警报。

解决方法是分别使用setAndAllowWhileIdlesetExactAndAllowWhileIdle方法;但能够修改和重新编译 apks 是诀窍。

  1. 获取apktool :单击“当前版本”链接下载 jar,apktool_2.1.1.jar 截至撰写本文时。
  2. 获取您要修复的应用程序的 apk。我用过apk20.com找到我试图修复的应用程序的可下载 apk,但也有方法来 get the apk of an app installed on the phone .
  3. 假设 java 二进制文件在您的路径中,并且 apktool jar 和 apk 在当前目录中,使用 apktool 反汇编 apk:

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

    反汇编文件(smali 格式)将在当前目录的 com.example.android-app/ 下。

  4. AlarmManager;->setExactAndAllowWhileIdle 替换所有反汇编的 smali 文件中的所有 AlarmManager;->set/setExact .您可以手动执行此操作,也可以使用 findsed 自动执行此操作:

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

    这会将 setsetExact 替换为 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。如果您以前从未签署过 jar 文件,那么这是令人讨厌的部分:

    • 首先一步创建一个 keystore 和一个签名 key (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 的 keystore 和一个名为 mykey 的签名 key ,密码也为 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 未签名并带有如下神秘消息,你的 Android 手机将拒绝你的 apk:

      Parse error

      There was a problem parsing the package.

  7. 从您的手机中卸载原始应用程序。这是必不可少的,因为新的签名 key 与原作者的签名 key 不同,当签名 key 发生变化时,android 将拒绝更新应用程序。如果您尝试更新 pak,内置包管理器将简单地告诉您:

    App not installed

    如有必要,您可能希望备份或保存应用的配置。

  8. Enable installation from unknown sources
  9. 将重建的 apk 获取到您的手机并安装它。有多种方法可以做到这一点,但这两种是最简单的:

    • enable USB debugging然后运行:

      $ adb install com.example.android-app/dist/com.example.android-app.apk
    • 将apk通过U盘复制到手机内存中,在手机浏览器中打开file:///sdcard/点击apk下载,然后从下载器中打开安装.

应用程序现在应该可以在休眠模式下正常工作,而休眠模式在节省电量方面可能会比以前略有下降,具体取决于固定应用程序引起的唤醒次数。

关于android - 如何修复在打瞌睡模式下错过警报的应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37658246/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com