如何修复在打盹模式下错过警报的应用程序?

时间:2016-06-06 13:03:16

标签: android reverse-engineering apktool android-doze

有些应用程序,特别是那些不再维护的应用程序,当具有Marshmallow的Android设备进入打盹模式时严重行为不端。设计为闹钟替换的应用程序或将来执行某些任务的调度程序不再可靠地工作,完全无法实现其目的。

变通方法众所周知,或者受影响的应用程序是开源的,例如已回答here并记录了here

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

请注意,对应用程序禁用电池优化对于打瞌睡模式无效,因为已解答here

1 个答案:

答案 0 :(得分:3)

此答案适用于因使用AlarmManager的{​​{1}}和set方法而遭受延迟唤醒的应用。这些方法设置仅在打盹“维护”窗口期间或由于用户干预或其他情况而唤醒设备时发出的警报。

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

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

    apktool

    反汇编的文件(smali格式)将位于当前目录中的$ java -jar apktool_2.1.1.jar d com.example.android-app.apk 下。

  4. 在所有反汇编的com.example.android-app/文件中,将AlarmManager;->set/setExact的所有出现替换为AlarmManager;->setExactAndAllowWhileIdle。您可以手动执行此操作,也可以使用smalifind自动执行此操作:

    sed

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

  5. 重建apk:

    setExactAndAllowWhileIdle

    请注意构建的$ java -jar apktool_2.1.1.jar b com.example.android-app ,以及缺少b来引用修改后的文件所在的目录。生成的apk创建为.apk

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

    • 首先在一步(official documentation)中创建密钥库和签名密钥:

      com.example.android-app/dist/com.example.android-app.apk

      这将在默认位置创建一个密码为$ 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

    • 现在签署重建的apk(official documentation):

      android

      这个签名程序是必不可少的,因为你的Android手机会拒绝你的apk,如果它没有签名,有一个神秘的消息,如:

        

      解析错误

           

      解析包时出现问题。

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

      

    未安装应用

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

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

    • enable USB debugging然后运行:

      $ jarsigner -tsa http://timestamp.digicert.com com.example.android-app/dist/com.example.android-app.apk mykey
      Enter Passphrase for keystore: android
      jar signed.
      
    • 通过USB将apk复制到手机存储空间,在手机浏览器中打开$ adb install com.example.android-app/dist/com.example.android-app.apk ,然后登录apk下载,然后从下载程序打开它进行安装。
  10. 该应用程序现在应该可以在打盹模式下正常工作,而您的打盹模式在节省电池方面的效果可能比以前稍差,具体取决于固定应用程序造成的唤醒量。