1

当带有 Marshmallow 的 android 设备进入打盹模式时,某些应用程序,尤其是那些不再维护的应用程序,会出现严重的异常行为。设计为闹钟替代品或调度程序以在未来执行某些任务的应用程序不再可靠地工作,完全违背了它们的目的。

解决方法对于开发人员来说是众所周知的,或者当受影响的应用程序是开源的时,例如在此处回答并此处记录。

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

请注意,禁用应用程序的电池优化将无助于打盹模式,如此回答。

4

1 回答 1

3

AlarmManager此答案适用于由于使用'ssetsetExact方法而遭受延迟唤醒的应用程序。这些方法设置仅在打盹“维护”窗口期间或由于用户干预或其他情况唤醒设备时发送的警报。

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

  1. 获取apktoolapktool_2.1.1.jar :在撰写本文时,单击“当前版本”链接下载 jar 。
  2. 获取您要修复的应用程序的 apk。我已经使用apk20.com找到了我试图修复的应用程序的可下载 apk,但也有一些方法可以获取安装在手机上的应用程序的 apk
  3. 假设 java 二进制文件在您的路径中,并且 apktool jar 和 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的。您可以手动执行此操作,也可以使用and自动执行此操作:AlarmManager;->setExactAndAllowWhileIdlesmalifindsed

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

    这将同时替换set和。setExactsetExactAndAllowWhileIdle

  5. 重建apk:

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

    请注意bfor build,以及缺少.apkto 引用修改文件所在的目录。生成的 apk 创建为com.example.android-app/dist/com.example.android-app.apk

  6. 签署apk。如果您以前从未签署过 jar 文件,这是令人讨厌的部分:

    • 首先一步创建密钥库和签名密钥(官方文档):

      $ 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(官方文档):

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

      这个签名过程是必不可少的,因为如果你的 android 手机未使用类似以下的神秘消息签名,它将拒绝你的 apk:

      解析错误

      解析包时出现问题。

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

    未安装应用

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

  8. 启用从未知来源安装
  9. 将重建的 apk 下载到您的手机并安装它。有多种方法可以做到这一点,但这两种是最简单的:

    • 启用 USB 调试,然后运行:

      $ adb install com.example.android-app/dist/com.example.android-app.apk
      
    • 通过 USB 将 apk 复制到手机存储中,file:///sdcard/在手机浏览器中打开并单击 apk 进行下载,然后从下载器中打开它进行安装。

该应用程序现在应该可以在打盹模式下正常工作,而您的打盹模式在节省电池方面的效果可能比以前稍差,具体取决于固定应用程序导致的唤醒量。

于 2016-06-06T13:03:15.677 回答