11

Android 6.0.0 および 6.0.1 を搭載した Samsung Galaxy S6

私のアプリは正常に動作し、コード分析ではメモリ リークは見られません。SmartManager は、アプリが最大 40MB のメモリを使用していることを示しています。アプリを強制終了します (「現在実行中のアプリ」の概要を使用します--- 英語でそれがどのように呼ばれているかわかりません。申し訳ありません。携帯電話の左下にあるキーで、実行中のすべてのアプリのミニチュアのリストが表示されます...) 、再度開始します。

現在、SmartManager は、アプリに対して最大 40MB のメモリを表示しなくなりましたが、... さらに詳しく 50. 100. 400. 変動しますが、毎回大きくなります。しばらくすると、アプリが実際にクラッシュしてOutOfMemoryException. 「OutOfMemoryExceptionをスローしようとしているときにメモリ不足」になることもあります...

メモリ消費量をリセットするには、アプリをアンインストールして再インストールする必要があります。同じ APK は、私がテストした他のすべての電話 (Android 5.0 の S5 など) で正しく動作します。何が原因なのかわかりません。何原因なのかわからない!ヘルプ/ヒント/提案...?

編集: Android 6.0.1 の S5 では同じ動作ですが、Android 5.0 の S5では動作しません!

Edit2:貢献してくれた皆さん、ありがとう。私はまだ満足のいく答えを持っていませんが、私が検討するいくつかのアイデアが言及されました. ほとんどの人は MemLeak の問題に焦点を当てていました。それは合理的に聞こえますが、Android 4 または 5 ではリークが発生していないことを強調したいと思います。(私はまだ 7 をテストしていません。)また、リークは発生するだけです。アプリを強制的に強制終了したとき(適切なシャットダウンと再起動の動作をテストするために時々行う必要があります)、デバッガーが接続されていない場合のみ(これにより、この動作のテスト/デバッグが裏側で苦痛になります)。

アプリは、バインドされたサービスとして 1 つのサービスを開始します。アプリケーションコンテキストにバインドされています---ドキュメントによると、アプリが停止したときにそれ自体をクリーンアップする必要があります。残念ながら、この賞金の期限が迫っています。これまでのところ、上記のサービスが私の問題の原因である可能性が最も高いようです。そのため、コメントと彼の回答の両方でこれに言及したのは彼が最初だったので、私はカマールに賞金を授与します. 残りの皆さん、大きな感謝と賛成票を投じてください。

4

4 に答える 4

2

自分自身が間違っている場合は、コードと画像を分析してください。ドローアブルの非常に大きな画像のように。リサイクラーまたはリスト ビューを正しく実装していることを確認してください。次のリンクが役立つ場合があります。

  • leakcanaryライブラリを使用して、リークがないことを検出して確認します

  • ユーザーが最近のアプリからアプリを強制終了したことを検出する

  • メモリ モニタから gc を呼び出すには、メモリ使用量の正しい値のために Android Studio が付属しているため、gc が頻繁に実行されません。

  • 大きなヒープ サイズを使用します。 <application android:largeHeap="true"マニフェストで

  • アプリ コンテキストを使用してサービスを開始する
    startService(new Intent(getApplicationContext(),MyService.class));

于 2016-12-01T10:31:01.250 に答える
1

Android ではタスク キラーが重要だと考える人もいます。バックグラウンドで実行されているアプリを閉じることで、パフォーマンスとバッテリー寿命が向上します。とにかく、それがアイデアです. 実際には、タスク キラーはパフォーマンスを低下させる可能性があります。Android は Windows ではなく、Windows のようにプロセスを管理しません。アプリケーションを閉じる明確な方法がある Windows とは異なり、Android アプリケーションを「閉じる」明確な方法はありません。これは仕様によるものであり、問​​題ではありません。Android アプリを終了したり、ホーム画面に戻ったり、別のアプリに切り替えたりすると、アプリはバックグラウンドで「実行中」のままになります。ほとんどの場合、アプリはバックグラウンドで一時停止され、CPU やネットワーク リソースを消費しません。もちろん、一部のアプリは引き続きバックグラウンドで CPU とネットワーク リソースを使用します。たとえば、音楽プレーヤー、ファイル ダウンロード プログラム、またはバックグラウンドで同期するアプリ。最近使用していたアプリに戻ると、Android はそのアプリを「一時停止」し、中断したところから再開します。これは、アプリがまだ RAM に保存されており、再び使用する準備ができているため、高速であり、それ以上のリソースを消費しません。

スマート マネージャーのようなタスク キラーは、自分が Android よりも優れていると考えています。それらはバックグラウンドで実行され、アプリを自動的に終了し、Android のメモリから削除します。また、自分でアプリを強制終了できる場合もありますが、通常はこれを行う必要はありません。タスク キラーが RAM からアプリを削除し、そのアプリを再度開くと、アプリの読み込みが遅くなります。 Android はデバイスのストレージからそれをロードするように強制されます。さらに s6 には Smart Manager があり、バッテリーとストレージの設定へのウィジェットまたはショートカットとして使用できますが、Clean All 最適化機能の使用は避ける必要があります。この機能は、Clean Master アプリが目指しているように、デバイスのパフォーマンスを向上させると言われていますが、実際の影響は疑問です.

つまり、アプリを強制終了することもありますが、ヒープにトレースが残る可能性があるため、次回起動すると、使用されているストレージの量がさまざまに表示され、デフォルトの概念に失敗しmaxMemory()、アプリが最終的にクラッシュする可能性があります。さらにそのようなリーク最初のインスタンスで強制終了したアプリに直接関連付けられていないため、追跡が困難です。ただし、アプリを強制終了した後でも、取得したリソースなどの特定の機能が、アプリでさえ認識されずにバックグラウンドで実行され続ける場合があります。つまり、目立たないリークです。したがって、使用したい場合があります maxMemory()

次のように呼び出すことができます (たとえば、メイン アクティビティのonCreate()メソッドで)。

Runtime rt = Runtime.getRuntime();
long maxMemory = rt.maxMemory();
Log.v("onCreate", "maxMemory:" + Long.toString(maxMemory));

このメソッドは、アプリが使用できるヒープの合計バイト数を示します。 最適な動作: アプリは、プロセスが携帯電話のリソースを消費することなく、バックグラウンドで「実行」し続けることができます。Android はアプリをメモリに保持するため、起動が速くなり、以前の状態に戻ります。スマートフォンのメモリが不足すると、Android は、しばらく使用していないタスクから自動的にタスクを強制終了し始めます。 代わりにすべきこと

とはいえ、すべてのアプリが同じように作られているわけではありません。あなたの多くは過去にタスクキラーを使用したことがあり、実際にメモリを解放した後、電話の動作が少し良くなったことがわかりました. これは、コーディングが不十分な悪いアプリを強制終了したことが原因である可能性が高く、(たとえば) 接続すべきではない場合でもインターネットに接続しようとし続けます。パフォーマンスの向上は、メモリの負荷を解放したためではなく、適切なアプリを強制終了したためである可能性が高くなります (または、多くの場合、それは単なるプラセボです)。これらすべてのアプリを強制終了するのではなく、実際に問題の原因となっているアプリを見つけてください。タスク キラーを使用して動作の悪いアプリに対処することは、ショットガンを使用してハエを殺すようなものです。問題を解決できるかもしれませんが、多くの問題を引き起こしています。 S6 には 3 GB の RAM が搭載されているため、問題は発生しないはずです。ただし、スマート マネージャーの実装は、一部のアプリで問題を引き起こす可能性があり、必ずしも Android のバージョンに依存するとは限りません。この状況でタスク キラーを使用する代わりに、問題のあるアプリを特定してアンインストールするか、デバッグして、適切に動作するアプリに置き換える必要があります。不正な動作をしているアプリを突き止めるには、適切に動作するアプリに置き換えます。不正な動作をしているアプリを突き止めるには、適切に動作するアプリに置き換えます。不正な動作をしているアプリを突き止めるには、

ウォッチドッグ タスク マネージャー アプリ

– バックグラウンドで実際に CPU を使用しているアプリが表示されますが、無害にメモリに保存されているアプリは表示されません。

魅惑的な事実:

人気のあるコミュニティ開発の Android ROM である CyanogenMod は、タスク キラーを使用しているユーザーからのバグ レポートを受け入れません。

考えられる問題の原因

すぐにフォローできる場合は、まず設定>サウンドと通知>アプリの通知>スマートマネージャーを選択し、ロック画面でコンテンツを非表示を選択します

次に再び設定に戻り、ロック画面とセキュリティ > デバイス セキュリティ > KNOX アクティブ保護を無効にし、KNOX アクティブ保護の下のマルウェア対策オプションを無効にします

ロック画面とセキュリティで、他のセキュリティ設定に移動>セキュリティレポートの送信を無効にし、使用データアクセスに移動>スマートマネージャーを無効にしてから、デバイスを再起動します。アプリが機能するかどうかを確認します.s6のパフォーマンスの問題も参照してください

于 2016-12-01T17:02:44.610 に答える