1

一部のアプリ、特にメンテナンスされなくなったアプリは、マシュマロを搭載した Android デバイスが居眠りモードに入ると、重大な誤動作を引き起こします。将来的に特定のタスクを実行する目覚まし時計の代替またはスケジューラとして設計されたアプリは、もはや確実に機能しなくなり、その目的を完全に無効にします。

開発者にとって、または影響を受けるアプリがオープンソースである場合の回避策はよく知られてます

しかし、作成者がもはや保守していないクローズドソースのアプリをどのように修正できるのでしょうか?

ここで回答されているように、アプリのバッテリー最適化を無効にしても居眠りモードには役立たないことに注意してください。

4

1 に答える 1

3

この回答は、およびメソッドを使用AlarmManagerするためにウェイクアップが遅くなるアプリに適用されます。これらのメソッドは、居眠り「メンテナンス」期間中、またはユーザーの介入やその他の状況によってデバイスが起動したときにのみ配信されるアラームを設定します。setsetExact

解決策は、setAndAllowWhileIdlesetExactAndAllowWhileIdleメソッドをそれぞれ使用することです。しかし、apk を変更して再コンパイルできることが秘訣です。

  1. apktoolを取得しますapktool_2.1.1.jar。この記事の執筆時点では、「Current Release」リンクをクリックして 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これにより、との両方が に置き換えsetExactられsetExactAndAllowWhileIdleます。

  5. apk を再構築します。

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

    bfor build と.apk、変更されたファイルがあるディレクトリを参照するための がないことに注意してください。結果のapkは次のように作成されますcom.example.android-app/dist/com.example.android-app.apk

  6. apk に署名します。以前に jar ファイルに署名したことがない場合、これは厄介な部分です。

    • 最初にキーストアと署名キーを 1 ステップで作成します (公式ドキュメント):

      $ 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、デフォルトの場所に password を持つキーストアと、 password という名前の署名鍵が作成さ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 を携帯電話に取得してインストールします。これにはさまざまな方法がありますが、次の 2 つが最も簡単です。

    • USB デバッグを有効にしてから実行します。

      $ adb install com.example.android-app/dist/com.example.android-app.apk
      
    • apk を USB 経由で携帯電話のストレージにコピーし、file:///sdcard/携帯電話のブラウザで開き、apk をクリックしてダウンロードし、ダウンローダーから開いてインストールします。

アプリは居眠りモードで適切に動作するようになりましたが、修正されたアプリが引き起こすウェイクアップの量によっては、居眠りモードは以前よりもバッテリーを節約する効果がわずかに低下する場合があります。

于 2016-06-06T13:03:15.677 に答える