有些应用程序,特别是那些不再维护的应用程序,当具有Marshmallow的Android设备进入打盹模式时严重行为不端。设计为闹钟替换的应用程序或将来执行某些任务的调度程序不再可靠地工作,完全无法实现其目的。
变通方法众所周知,或者受影响的应用程序是开源的,例如已回答here并记录了here。
但是,如何修复其作者不再维护它们的闭源应用程序?
请注意,对应用程序禁用电池优化对于打瞌睡模式无效,因为已解答here。
答案 0 :(得分:3)
此答案适用于因使用AlarmManager
的{{1}}和set
方法而遭受延迟唤醒的应用。这些方法设置仅在打盹“维护”窗口期间或由于用户干预或其他情况而唤醒设备时发出的警报。
解决方案是分别使用setExact
和setAndAllowWhileIdle
方法;但是能够修改和重新编译apks就是诀窍。
setExactAndAllowWhileIdle
。假设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
下。
在所有反汇编的com.example.android-app/
文件中,将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
。
重建apk:
setExactAndAllowWhileIdle
请注意构建的$ java -jar apktool_2.1.1.jar b com.example.android-app
,以及缺少b
来引用修改后的文件所在的目录。生成的apk创建为.apk
签署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,如果它没有签名,有一个神秘的消息,如:
解析错误
解析包时出现问题。
从手机中卸载原始应用。这是必不可少的,因为新签名密钥与原作者的签名密钥不同,并且当签名密钥更改时,android将拒绝更新应用程序。如果您尝试更新pak,内置包管理器会告诉您:
未安装应用
如有必要,您可能希望进行备份或保存应用程序的配置。
将重建的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.
$ adb install com.example.android-app/dist/com.example.android-app.apk
,然后登录apk下载,然后从下载程序打开它进行安装。该应用程序现在应该可以在打盹模式下正常工作,而您的打盹模式在节省电池方面的效果可能比以前稍差,具体取决于固定应用程序造成的唤醒量。