【问题标题】:Manual install in Leak Canary 2?在 Leak Canary 2 中手动安装?
【发布时间】:2020-07-10 02:58:00
【问题描述】:

我一直是使用 Leak Canary 2 的用户之一。 多亏了这些东西,我可以修复我的应用程序中的内存泄漏错误。 我最近注意到(我可能迟到了)有更新 Leak Canary 2.2,所以我通过在 Manifest 中添加以下行来将更新版本应用于我的应用程序

debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.2'

  • 出现问题

在实现泄漏金丝雀之前,我想让它仅在我通过设置在我的应用程序中打开开发人员模式时才开始检测内存泄漏(也安装“泄漏”应用程序)。我将我的应用程序作为 apk 文件共享,以使用户能够轻松测试和发现错误。如果用户安装我的应用程序时突然安装了“泄漏”应用程序,即使他们没有打开开发者模式,他们可能也不知道这个应用程序是什么,实际上,它只对我有用,因为其他用户不会理解这个应用程序在说。但是根据this site,我不需要放任何代码来安装泄漏金丝雀;它将被自动安装。我无法阻止它安装到用户的设备上。

class MainActivity : AppCompatActivity() {

    companion object {
        var installed = false
        @JvmField
        var watcher: RefWatcher? = null
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        ....

        val shared = getSharedPreferences(StaticStore.CONFIG, Context.MODE_PRIVATE)

        if (!installed && shared.getBoolean("DEV_MODE", false)) {
            watcher = LeakCanary.install(application)
            installed = true
        }

        ....
    }
}

上面的代码是我在 Leak Canary 2.2 之前执行手动安装的方式。引用自this answer。当应用程序检查来自共享首选项的布尔值 (DEV_MODE) 为真时,它允许安装,并使 watcher 检查其他活动或线程。如果我不调用 LeakCanary.install(application),则不会安装“Leaks”应用程序,因此用户可以使用我的应用程序而不会看到这个额外的应用程序。当然,如果他们打开开发者模式,他们可以使用内存泄漏检测功能。

但是现在没有像 LeakCanaray.install() (也有 RefWatcher )这样的方法,所以我不能像这样执行手动安装之前...

有没有办法在 Leak Canary 2.2 中执行手动安装?

我是否必须放弃让它不自动安装并通知用户“泄漏”应用程序将被安装?

【问题讨论】:

    标签: android kotlin leakcanary


    【解决方案1】:

    请参阅代码配方中的“禁用 LeakCanary”:https://square.github.io/leakcanary/recipes/#disabling-leakcanary

    您需要定义一个布尔型 xml 资源 leak_canary_add_launcher_icon 并将其设置为 false(=> 没有启动器图标)

    您可以通过以下方式关闭实例监视:

    AppWatcher.config = AppWatcher.config.copy(enabled = false)
    

    【讨论】:

    • 感谢提供的链接,我可以解决问题!我应该更仔细地阅读泄漏金丝雀......
    • 上面的泄漏金丝雀在 android tv 中不起作用。任何人知道为什么吗?
    【解决方案2】:

    随着最近的 v2.6 更新,LeakCanary 的手动安装发生了变化。

    现在您需要添加以下布尔资源:

    <bool name="leak_canary_watcher_auto_install">false</bool>
    

    并在您准备好使用默认观察程序(Activity、Fragment、RootView、Service)进行手动安装时运行以下 API:

    JAVA:

    AppWatcher.INSTANCE.manualInstall(app, WATCH_DURATION_MILLISECONDS);
    

    科特林:

    AppWatcher.manualInstall(app, WATCH_DURATION_MILLISECONDS);
    

    更多详情请阅读official documentation here.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-30
      • 1970-01-01
      • 2010-10-01
      • 2013-08-22
      • 2019-03-13
      • 2021-07-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多