昨日の問題について言えば、メモリリークがされていることに注意するポイント最後に、そこに来るLeakCanaryメモリリークを検出。実際に、私はほとんどの人々もこのライブラリを使用し知っていると信じています。
一般に〜私たちは優れたリソースを見つけた場合、このシリーズは、直接傍受の一部を引き継ぐことを選択しますので、記事の下部にある参照リンクは、あなたがヨーヨーに直接行くことができ、一般的に非常に優れています
基本的なワークフローLeakCanaryは似ているのですか?
使用のLeakCanaryはすぐ内側build.gradleに直接依存を書き、その中にApplicationクラスに登録しない、非常に簡単です。
もちろん、必要性は、実際にLeakCanaryは現在、バージョン2.x、侵襲性の低いコード、および純粋Kotlinの書き込みにアップグレードされ、唯一のバージョン1.xでこのような操作は、ほとんどの人が連絡アプリケーションに登録します。Kotlin Kotlinを使用して、メインデモKotlinの多様からのプッシュGoogleとすべての主要なライブラリが書かれているが、実際のAndroidの開発において、ますます重要な視点を見て、あなたは波を学ぶために小さなパートナーを使用する必要はありませんでした、そして今、私はまた、開発純粋KotlinをしていますA。
作品のために、多かれ少なかれ、私たちはまた、単に直接借りて、非常に良好なフロー図、他の彼の理解LeakCanaryも非常に良い金利で書かれたソースコードの観点から、この記事がある一定の理解を持っていなければならないと考えています直接記事の下部にあるリンクをクリックしてください。
なぜ、何の最初の使用LeakCanary入口アイコンはありません
私たちはしばしばLeakCanaryは、このような問題があります使用している場合:LeakCanaryが発生しなかった最初のランチャーアイコンを、しかし、メモリリークは通常の状況下で、デスクトップ、アイコン、より上の警告システムは、非常に興味があるとき。
ソースからの1.xを識別することができます。manifast leakcanary-アンドロイドでは、我々は、関連する構成を見ることができます:
<!--leakcanary-sample/src/main/AndroidManifest.xml-->
<service
android:name=".internal.HeapAnalyzerService"
android:process=":leakcanary"
android:enabled="false"
/>
<service
android:name=".DisplayLeakService"
android:process=":leakcanary"
android:enabled="false"
/>
<activity
android:theme="@style/leak_canary_LeakCanary.Base"
android:name=".internal.DisplayLeakActivity"
android:process=":leakcanary"
android:enabled="false"
android:label="@string/leak_canary_display_activity_label"
android:icon="@mipmap/leak_canary_icon"
android:taskAffinity="com.squareup.leakcanary.${applicationId}"
>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
私たちは、それが見ることができるDisplayLeakActivity
ランチャーに設定され、対応するアイコンに設定されているので、我々はLeakCanaryは、デスクトップのアイコンのエントリを生成します。ただし、falseに、プロパティのデフォルト値は、そのデスクトップポータルに表示されません。そして、メモリリークが発生した場合に、LeakCanaryはにイニシアチブを取るtrueにプロパティセット。DisplayLeakActivity
enable
enable
LeakCanary 2が行っています
LeakCanary最近バージョン2.xにアップグレードし、これは環境に加えて、1.xのリリースで引用されたエアバッグleakcanary-アンドロイド-NO-OPへの完全な復興、です。そして、最大99.8%のKotlinの言語をカバー、また、もはや内部のアプリケーションに次のコードのような何かをする必要がありません。
//com.example.leakcanary.ExampleApplication
@Override
public void onCreate() {
super.onCreate();
if (LeakCanary.isInAnalyzerProcess(this)) {
// This process is dedicated to LeakCanary for heap analysis.
// You should not init your app in this process.
return;
}
LeakCanary.install(this);
}
ちょうどそれに依存しているこのコードを追加します。
dependencies {
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.0-alpha-2'
}
このような操作を確認するために初めて、あなたはそれが実際にサンパウロの操作を使用していることを見つけるために戻って、ソースコードを読んで、非常に不思議な感じになります:ContentProvider
。
ではleakcanary-leaksentry
、モジュールAndroidManifest.xml
ファイル見ることができます。
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.squareup.leakcanary.leaksentry"
>
<application>
<provider
android:name="leakcanary.internal.LeakSentryInstaller"
android:authorities="${applicationId}.leak-sentry-installer"
android:exported="false"/>
</application>
</manifest>
そして、鑑賞後にLeakSentryInstaller
見ることができます。
package leakcanary.internal
import android.app.Application
import android.content.ContentProvider
import android.content.ContentValues
import android.database.Cursor
import android.net.Uri
import leakcanary.CanaryLog
/**
* Content providers are loaded before the application class is created. [LeakSentryInstaller] is
* used to install [leaksentry.LeakSentry] on application start.
*/
internal class LeakSentryInstaller : ContentProvider() {
override fun onCreate(): Boolean {
CanaryLog.logger = DefaultCanaryLog()
val application = context!!.applicationContext as Application
InternalLeakSentry.install(application)
return true
}
override fun query(
uri: Uri,
strings: Array<String>?,
s: String?,
strings1: Array<String>?,
s1: String?
): Cursor? {
return null
}
override fun getType(uri: Uri): String? {
return null
}
override fun insert(
uri: Uri,
contentValues: ContentValues?
): Uri? {
return null
}
override fun delete(
uri: Uri,
s: String?,
strings: Array<String>?
): Int {
return 0
}
override fun update(
uri: Uri,
contentValues: ContentValues?,
s: String?,
strings: Array<String>?
): Int {
return 0
}
}
確かに真の、しかし感触を味わうサンは本当に非常に賢いです。
ます。https://www.jianshu.com/p/817b52d05a12で再現