当带有 Marshmallow 的 android 设备进入打盹模式时,某些应用程序,尤其是那些不再维护的应用程序,会出现严重的异常行为。设计为闹钟替代品或调度程序以在未来执行某些任务的应用程序不再可靠地工作,完全违背了它们的目的。
解决方法对于开发人员来说是众所周知的,或者当受影响的应用程序是开源的时,例如在此处回答并在此处记录。
但是,作者不再维护它们的闭源应用程序如何修复呢?
请注意,禁用应用程序的电池优化将无助于打盹模式,如此处回答。
AlarmManager
此答案适用于由于使用'sset
和setExact
方法而遭受延迟唤醒的应用程序。这些方法设置仅在打盹“维护”窗口期间或由于用户干预或其他情况唤醒设备时发送的警报。
解决方法是分别使用setAndAllowWhileIdle
和setExactAndAllowWhileIdle
方法;但是能够修改和重新编译apks是诀窍。
apktool_2.1.1.jar
:在撰写本文时,单击“当前版本”链接下载 jar 。假设 java 二进制文件在您的路径中,并且 apktool jar 和 apk 在当前目录中,请使用以下命令反汇编 apk apktool
:
$ java -jar apktool_2.1.1.jar d com.example.android-app.apk
反汇编的文件(smali
格式)将com.example.android-app/
在当前目录下。
在所有反汇编文件中替换所有出现AlarmManager;->set/setExact
的。您可以手动执行此操作,也可以使用and自动执行此操作: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
重建apk:
$ java -jar apktool_2.1.1.jar b com.example.android-app
请注意b
for build,以及缺少.apk
to 引用修改文件所在的目录。生成的 apk 创建为com.example.android-app/dist/com.example.android-app.apk
签署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:
解析错误
解析包时出现问题。
从手机中卸载原始应用程序。这是必不可少的,因为新的签名密钥与原作者的签名密钥不同,并且当签名密钥更改时,android 将拒绝更新应用程序。如果您尝试更新 pak,内置包管理器会简单地告诉您:
未安装应用
如有必要,您可能希望备份或保存应用程序的配置。
将重建的 apk 下载到您的手机并安装它。有多种方法可以做到这一点,但这两种是最简单的:
启用 USB 调试,然后运行:
$ adb install com.example.android-app/dist/com.example.android-app.apk
file:///sdcard/
在手机浏览器中打开并单击 apk 进行下载,然后从下载器中打开它进行安装。该应用程序现在应该可以在打盹模式下正常工作,而您的打盹模式在节省电池方面的效果可能比以前稍差,具体取决于固定应用程序导致的唤醒量。