Giter Site home page Giter Site logo

androiddevmetrics's Introduction

AndroidDevMetrics

(formerly dagger2metrics)

Performance metrics library for Android development.

Android Arsenal

The problem with performance is that it often decreases slowly so in day-by-day development it's hard to notice that our app (or Activity or any other view) launches 50ms longer. And another 150ms longer, and another 100ms...

With AndroidDevMetrics you will be able to see how performant are the most common operations like object initialization (in Dagger 2 graph), or Activity lifecycle methods (onCreate(), onStart(), onResume()).

It won't show you exact reason of performance issues or bottlenecks (yet!) but it can point out where you should start looking first.

AndroidDevMetrics currently includes:

  • Activity lifecycle metrics - metrics for lifecycle methods execution (onCreate(), onStart(), onResume())
  • Activity lifecycle methods tracing without app recompiling
  • Frame rate drops - metrics for fps drops for each of screens (activity)
  • Dagger 2 metrics - metrics for objects initialization in Dagger 2

screenshot1.png

screenshot.png

Getting started

Script below shows how to enable all available metrics.

In your build.gradle:

 buildscript {
  repositories {
    jcenter()
  }

  dependencies {
    classpath 'com.frogermcs.androiddevmetrics:androiddevmetrics-plugin:0.7'
  }
}

apply plugin: 'com.android.application'
apply plugin: 'com.frogermcs.androiddevmetrics'

In your Application class:

public class ExampleApplication extends Application {

 @Override
 public void onCreate() {
     super.onCreate();
     //Use it only in debug builds
     if (BuildConfig.DEBUG) {
         AndroidDevMetrics.initWith(this);
     }
  }
 }

How does it work?

Detailed description how it works under the hood can be found on wiki pages:

I found performance issue, what should I do next?

There is no silver bullet for performance issues but here are a couple steps which can help you with potential bugs hunting.

If measured time of object initialization or method execution looks suspicious you should definitely give a try to TraceView. This tool logs method execution over time and shows execution data, per-thread timelines, and call stacks. Practical example of TraceView usage can be found in this blog post: Measuring Dagger 2 graph creation performance.


If it seems that layout or view can be a reason of performance issue you should start with those links from official Android documentation:


Finally, if you want to understand where most of performance issues come from, here is a collection of videos focused entirely on helping developers write faster, more performant Android Applications.

Example app

You can check GithubClient - example Android app which shows how to use Dagger 2. Most recent version uses AndroidDevMetrics for measuring performance.

Building AndroidDevMetrics

Build AndroidDevMetrics plugin with [./gradlew clean build]. The tests can be run with ./gradlew clean test. To install the plugin in your local maven repository (usually located at ~/.m2/repository) use ./gradlew clean install. You can change VERSION_NAME value in gradle.properties to easily recognise your version.

License

Copyright 2016 Miroslaw Stanek

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

androiddevmetrics's People

Contributors

amulyakhare avatar ashok-varma avatar egor-n avatar frogermcs avatar skrzyneckik avatar tilizar avatar williamwebb avatar zsavely avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

androiddevmetrics's Issues

Attempt to read from field in androiddevmetrics on a null object reference

I am trying to implement frogermcs/AndroidDevMetrics library in my project
This is the link: https://github.com/frogermcs/AndroidDevMetrics
I followed these steps to integrate AndroidDevMetrics into my project.
Added these in build.gradle

buildscript {
  repositories {
    jcenter()
  }

  dependencies {
    classpath 'com.frogermcs.androiddevmetrics:androiddevmetrics-plugin:0.7'
  }
}

apply plugin: 'com.android.application'
apply plugin: 'com.frogermcs.androiddevmetrics

Then in your Activity class:

@Override
public void onCreate() {
	super.onCreate();
	//Use it only in debug builds
	if (BuildConfig.DEBUG) {
		AndroidDevMetrics.initWith(this);
	}
}

For this when i run my project and came to that activity where init code is. The app crash with the statement:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mycompany.project/com.mycompany.project.activities.LoginActivity}: java.lang.NullPointerException: Attempt to read from field 'int com.frogermcs.androiddevmetrics.internal.metrics.ActivityLifecycleMetrics$ActivityLifecycleMetric.state' on a null object reference

And here are some other logs from middle of logs

Caused by: java.lang.NullPointerException: Attempt to read from field 'int com.frogermcs.androiddevmetrics.internal.metrics.ActivityLifecycleMetrics$ActivityLifecycleMetric.state' on a null object reference at com.frogermcs.androiddevmetrics.internal.metrics.ActivityLifecycleMetrics.logPostOnStart(ActivityLifecycleMetrics.java:88) at com.frogermcs.androiddevmetrics.internal.metrics.ActivityLaunchMetrics.onActivityStarted(ActivityLaunchMetrics.java:43)

Please guide me where i am wrong. or how to solve this issue to getting AndroidDevMetrics into work. Thanks
Gradle Version: 5.0
Android Plugin Version: 3.3.0
AndroidDevMetrics Library Version: 0.7

Metrics did not show unless I added activity to manifest

Not sure why our application was different, but clicking on the notification did nothing in our application unless I added activity to the manifest as in:

<activity android:name="com.frogermcs.androiddevmetrics.internal.ui.MetricsActivity"/>

Wonder if it is because we use an application Id suffix:

buildTypes {
    debug {
        applicationIdSuffix '.debug'

Library crashed app, Theme.AppCompat.

Hi! I want to let you know that library crashed my app with following stack-trace:

Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
       at android.support.v7.app.AppCompatDelegateImplV7.createSubDecor(AppCompatDelegateImplV7.java:340)
       at android.support.v7.app.AppCompatDelegateImplV7.ensureSubDecor(AppCompatDelegateImplV7.java:309)
       at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:273)
       at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:139)
       at pl.polskikraft.android.android.activity.HomeActivity_.setContentView(HomeActivity_.java:102)
       at pl.polskikraft.android.android.activity.HomeActivity_.onCreate_aroundBody0(HomeActivity_.java:78)
       at pl.polskikraft.android.android.activity.HomeActivity_$AjcClosure1.run(HomeActivity_.java:1)
       at org.aspectj.runtime.reflect.JoinPointImpl.proceed(JoinPointImpl.java:149)
       at com.frogermcs.androiddevmetrics.aspect.ActivityLifecycleAnalyzer.logAndExecute(ActivityLifecycleAnalyzer.java:62)
       at pl.polskikraft.android.android.activity.HomeActivity_.onCreate(HomeActivity_.java:74)

Compile error when compileSdkVersion < 23

Current version will cause compile error when compileSdkVersion is lower than 23

Below is the error message
/Users/Fate/xxx/app/build/intermediates/res/merged/sysarc/values-v23/values-v23.xml
Error:(3) Error retrieving parent for item: No resource found that matches the given name 'android:TextAppearance.Material.Widget.Button.Inverse'.
Error:(24) Error retrieving parent for item: No resource found that matches the given name 'android:Widget.Material.Button.Colored'.

Don't override non-singleton values

Repeated dependency creation overrides values for previous metrics (and subdependencies are lost). Spotted in: #1

It means that value:
AnalyticsManager (not a singleton)
|__Crashlytics
|__GoogleAnalytics
|__OtherAnalyticsClass

will be replaced with:

AnalyticsManager
|__no args

When graph will be asked again for AnalyticsManager

Verify error after updating distribution url https\://services.gradle.org/distributions/gradle-4.4-all.zip in multi-module project.

java.lang.VerifyError: Verifier rejected class com.frogermcs.androiddevmetrics.aspect.Dagger2GraphAnalyzer: boolean com.frogermcs.androiddevmetrics.aspect.Dagger2GraphAnalyzer.ajc$inlineAccessMethod$com_frogermcs_androiddevmetrics_aspect_Dagger2GraphAnalyzer$com_frogermcs_androiddevmetrics_aspect_Dagger2GraphAnalyzer$isMethodWithReturnType(com.frogermcs.androiddevmetrics.aspect.Dagger2GraphAnalyzer, org.aspectj.lang.reflect.CodeSignature) failed to verify: boolean com.frogermcs.androiddevmetrics.aspect.Dagger2GraphAnalyzer.ajc$inlineAccessMethod$com_frogermcs_androiddevmetrics_aspect_Dagger2GraphAnalyzer$com_frogermcs_androiddevmetrics_aspect_Dagger2GraphAnalyzer$isMethodWithReturnType(com.frogermcs.androiddevmetrics.aspect.Dagger2GraphAnalyzer, org.aspectj.lang.reflect.CodeSignature): [0x0] invoke-super/virtual can't be used on private method boolean com.frogermcs.androiddevmetrics.aspect.Dagger2GraphAnalyzer.isMethodWithReturnType(org.aspectj.lang.reflect.CodeSignature) (declaration of 'com.frogermcs.androiddevmetrics.aspect.Dagger2GraphAnalyzer' appears in /data/app/com.aranoah.healthkart.plus.staging.debug-1/base.apk:classes31.dex)
at com.frogermcs.androiddevmetrics.aspect.Dagger2GraphAnalyzer.setEnabled(Dagger2GraphAnalyzer.java:20)
at com.frogermcs.androiddevmetrics.AndroidDevMetrics.setupMetrics(AndroidDevMetrics.java:97)
at com.frogermcs.androiddevmetrics.AndroidDevMetrics.setAndroidDevMetrics(AndroidDevMetrics.java:69)
at com.frogermcs.androiddevmetrics.AndroidDevMetrics.initWith(AndroidDevMetrics.java:59)
at com.frogermcs.androiddevmetrics.AndroidDevMetrics.initWith(AndroidDevMetrics.java:52)
at com.frogermcs.androiddevmetrics.AndroidDevMetrics.initWith(AndroidDevMetrics.java:48)
at com.aranoah.healthkart.plus.BaseApplication.initDevMetrics(BaseApplication.java:66)
at com.aranoah.healthkart.plus.BaseApplication.onCreate(BaseApplication.java:59)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1032)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5970)
at android.app.ActivityThread.-wrap3(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1710)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6776)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1518)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1408)

Update Android dependencies

There were no major updates to this library for quite some time, so I would like to propose to update its Android dependencies to the newest version - build tools (27.0.3) and support libraries (27.0.2). It would be a good first step towards supporting Android API 26+ (#38). The first tiny step has been already taken in #41

when i run on non marshmallow it always crashes.

When i subclass Application and do this configuration in gradle :

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        applicationId "com.example.uen229.mydagger2application"
        minSdkVersion 16
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.google.dagger:dagger:2.0'
    apt 'com.google.dagger:dagger-compiler:2.0'
    provided 'org.glassfish:javax.annotation:10.0-b28'
}

dagger2metrics make the app crash with :

FATAL EXCEPTION: main
java.lang.VerifyError: com/example/uen229/mydagger2application/butters/ButterModule$AjcClosure1
at com.example.uen229.mydagger2application.butters.ButterModule.ProvideCashewButter(ButterModule.java:23)
at com.example.uen229.mydagger2application.butters.ButterModule_ProvideCashewButterFactory.get(ButterModule_ProvideCashewButterFactory.java:17)
at com.example.uen229.mydagger2application.butters.ButterModule_ProvideCashewButterFactory.get(ButterModule_ProvideCashewButterFactory.java:6)
at com.example.uen229.mydagger2application.component.DaggerButterComponent.ProvideCashewButter(DaggerButterComponent.java:32)
at com.example.uen229.mydagger2application.component.DaggerSandwichComponent$1.get(DaggerSandwichComponent.java:37)
at com.example.uen229.mydagger2application.component.DaggerSandwichComponent$1.get(DaggerSandwichComponent.java:35)
at com.example.uen229.mydagger2application.Sandwitches.SandwichModule_ProvidesCashewSandwitchFactory.get(SandwichModule_ProvidesCashewSandwitchFactory.java:22)
at com.example.uen229.mydagger2application.Sandwitches.SandwichModule_ProvidesCashewSandwitchFactory.get(SandwichModule_ProvidesCashewSandwitchFactory.java:8)
at dagger.internal.ScopedProvider.get(ScopedProvider.java:46)
at com.example.uen229.mydagger2application.MainActivity_MembersInjector.injectMembers(MainActivity_MembersInjector.java:31)
at com.example.uen229.mydagger2application.MainActivity_MembersInjector.injectMembers(MainActivity_MembersInjector.java:10)
at com.example.uen229.mydagger2application.component.DaggerSandwichComponent.inject(DaggerSandwichComponent.java:56)
at com.example.uen229.mydagger2application.MainActivity.onCreate(MainActivity.java:52)
at android.app.Activity.performCreate(Activity.java:5008)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
at android.app.ActivityThread.access$600(ActivityThread.java:130)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
at android.os.Handler.dispatchMessage(Handler.java:99)

My trivial project is here: https://github.com/j2emanue/dagger2_scope_demo.git

if you just download it and run as is it works, but when i add dagger2metrics it fails.

Cannot resolve symbol AndroidDevMetrics

Even though I'm able to sync dependencies without errors, android studio still can't find the AndroidDevMetrics.class
I tried a clean build and even invalidated my cache and restarted AS, no luck. Here's how I set up AndroidDevMetrics:

build.gradle (module)

apply plugin: 'com.android.application'
apply plugin: 'com.neenbedankt.android-apt'
apply plugin: 'realm-android'
apply plugin: 'com.frogermcs.androiddevmetrics'

android {
    compileSdkVersion 24
    buildToolsVersion "24.0.2"

    defaultConfig {

build.gradle (project)

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.2'
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
        classpath "io.realm:realm-gradle-plugin:1.2.0"
        classpath 'com.google.gms:google-services:3.0.0'
        classpath 'com.frogermcs.androiddevmetrics:androiddevmetrics-plugin:0.4'

Any clue what might be going on?

RuntimeException when launch my app

Hi,
my app crashes with this stack trace.

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.nicopasso.android.debug/com.nicopasso.android.ui.start.StartingActivity}: java.lang.RuntimeException: MethodsTracingManager must be initialized by init(..)
                                                                                at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
                                                                                at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
                                                                                at android.app.ActivityThread.-wrap11(ActivityThread.java)
                                                                                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
                                                                                at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                at android.os.Looper.loop(Looper.java:148)
                                                                                at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                                                at java.lang.reflect.Method.invoke(Native Method)
                                                                                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
                                                                             Caused by: java.lang.RuntimeException: MethodsTracingManager must be initialized by init(..)
                                                                                at com.frogermcs.androiddevmetrics.internal.MethodsTracingManager.checkInitialized(MethodsTracingManager.java:90)
                                                                                at com.frogermcs.androiddevmetrics.internal.MethodsTracingManager.shouldTraceMethod(MethodsTracingManager.java:84)
                                                                                at com.frogermcs.androiddevmetrics.aspect.ActivityLifecycleAnalyzer.executeWithTracingIfEnabled(ActivityLifecycleAnalyzer.java:77)
                                                                                at com.frogermcs.androiddevmetrics.aspect.ActivityLifecycleAnalyzer.ajc$inlineAccessMethod$com_frogermcs_androiddevmetrics_aspect_ActivityLifecycleAnalyzer$com_frogermcs_androiddevmetrics_aspect_ActivityLifecycleAnalyzer$executeWithTracingIfEnabled(ActivityLifecycleAnalyzer.java:1)
                                                                                at com.frogermcs.androiddevmetrics.aspect.ActivityLifecycleAnalyzer.logAndExecute(ActivityLifecycleAnalyzer.java:66)
                                                                                at com.nicopasso.android.ui.start.StartingActivity.onCreate(StartingActivity.java:43)
                                                                                at android.app.Activity.performCreate(Activity.java:6251)
                                                                                at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
                                                                                at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
                                                                                at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476at android.app.ActivityThread.-wrap11(ActivityThread.javaat android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344at android.os.Handler.dispatchMessage(Handler.java:102at android.os.Looper.loop(Looper.java:148at android.app.ActivityThread.main(ActivityThread.java:5417at java.lang.reflect.Method.invoke(Native Methodat com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616

I've already tried to implement

MethodsTracingManager.getInstance().init(this);

in my StartingActivity as the stack trace says but still I have the same issue.

How can I solve this problem?
Thanks

NoClassDefFoundError

After integrating ADM, my app crashed with the exception below, even after a clean build.

Probably unrelated, but the part of my app where the exception occurred was on a databinding variable.

java.lang.NoClassDefFoundError: Failed resolution of: Landroid/support/v7/internal/widget/TintManager;
    at android.support.design.widget.TabLayout$TabView.<init>(TabLayout.java:1179)
    at android.support.design.widget.TabLayout.createTabView(TabLayout.java:655)
    at android.support.design.widget.TabLayout.addTabView(TabLayout.java:690)
    at android.support.design.widget.TabLayout.addTab(TabLayout.java:385)
    at android.support.design.widget.TabLayout.addTab(TabLayout.java:360)
    at android.support.design.widget.TabLayout.setTabsFromPagerAdapter(TabLayout.java:644)
    at android.support.design.widget.TabLayout.setupWithViewPager(TabLayout.java:615)
    at <..>.MyFragment.onCreateView(MyFragment.java:31)
    at android.support.v4.app.Fragment.performCreateView(Fragment.java:1962)
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248)
    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738)
    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1613)
    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:517)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:135)
    at android.app.ActivityThread.main(ActivityThread.java:5254)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Caused by: java.lang.ClassNotFoundException: Didn't find class "android.support.v7.internal.widget.TintManager" on path: DexPathList[[zip file "/data/app/<...>.debug-1/base.apk"],nativeLibraryDirectories=[/data/app/<...>.debug-1/lib/x86, /vendor/lib, /system/lib]]
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
    ... 23 more
Suppressed: java.lang.ClassNotFoundException: android.support.v7.internal.widget.TintManager
    at java.lang.Class.classForName(Native Method)
    at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
    at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
    ... 24 more
Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available

NullPointerException

Crashed with NullPointerException:

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Class java.lang.Object.getClass()' on a null object reference
at com.frogermcs.dagger2metrics.aspect.GraphAnalyzer.logAndExecute(GraphAnalyzer.java:53)

when logging dependency provided with @provides @nullable annotations

Usage with custom buildTypes

When using custom build types, I have to manually add the build dependencies. I use something like following:

buildTypes {
    debug {
        ...
    }
    release {
        ...
    }
    debug_pro {
        ...
    }
    release_pro {
        ...
    }
}

I'm not sure which one I have to add of following:

 debugCompile 'com.frogermcs.androiddevmetrics:androiddevmetrics-plugin:0.4'
 debugCompile 'com.frogermcs.androiddevmetrics:androiddevmetrics-runtime:0.4'
 debug_proCompile 'com.frogermcs.androiddevmetrics:androiddevmetrics-plugin:0.4'
 debug_proCompile 'com.frogermcs.androiddevmetrics:androiddevmetrics-runtime:0.4'

Do I have to add plugin and runtime or runtime only?

Additionally, it would not be bad to add the information to the readme for all people that do use custom build types...

gradle assembleRelease fails.

assembleDebug is working fine when dagger2metrics is added but assembleRelease fails with the following error. Is there a way we can keep the code and make sure release build works fine.

error: package com.frogermcs.dagger2metrics does not exist
import com.frogermcs.dagger2metrics.Dagger2Metrics;
^
1 error
:app:compileReleaseJavaWithJavac FAILED

Convert `AndroidDevMetricsPlugin` Groovy to Java/Kotlin

AndroidDevMetrics plugin is mainly used by Android/Java developer. I would like to convert existing Groovy to language known by plugin's users and potential developers.

I think it isn't about understanding what e.g AndroidDevMetricsPlugin.groovy does, but to make it easier to modify existing code.

@frogermcs what do you think?

Not forced to apply the plugin

Hi,

It could be interesting to say that the plugin is mostly here to apply aspects. Can we add to the readme that if user is already using an aspectj plugin, he only has to add to its dependencies :

releaseCompile 'com.frogermcs.androiddevmetrics:androiddevmetrics-runtime-noop:0.4'
debugCompile 'com.frogermcs.androiddevmetrics:androiddevmetrics-runtime:0.4'

However the aspectj task from the plugin could conflict with other aspectj task.
What do you think ?

Proguard rules

Are there any proguard rules. I don't seem to be able to build it successfully with minification enabled.

This is the error that i'm getting during the gradle build process
error: package com.frogermcs.androiddevmetrics does not exist

Add option to disable plugin for certain flavors

There should be an option to disable plugin for certain product flavors, for example I use a specialized flavor for instrumented testing, where I need all debug tools to be off, since their notifications and actions might interfere with Espresso tests. Right now, if the plugin is not initialized in Application for every debug product flavor, the app will throw a runtime exception:

java.lang.RuntimeException: MethodsTracingManager must be initialized by init(..)

It means that something like this:

if("debug".equals(BuildConfig.BUILD_TYPE) && !"mock".equals(BuildConfig.FLAVOR)) {
    AndroidDevMetrics.initWith(this);
}

is not possible, as the mockDebug build variant will throw the aforementioned exception.

Duplicate zip entry aspectjrt

I getting Duplicate zip entry [aspectjrt-1.8.8.jar:org/aspectj/lang/reflect/NoSuchAdviceException.class] when i am trying to integrate.
I am using aspectjrt in other class path too and their is no transitive = true in dependencies classpath, how it can be configure?

OutOfMemoryError

I'm seeing this OOM after ~6 hours of running an application

Clamp target GC heap from 96.827MB to 96.000MB
GC_BEFORE_OOM freed 73K, 8% free 90855K/98304K, paused 566ms, total 566ms
Out of memory on a 2097168-byte allocation.
"MyInteractorThread" prio=5 tid=17 RUNNABLE
  | group="main" sCount=0 dsCount=0 obj=0x42273ad8 self=0x556c8008
  | sysTid=12621 nice=0 sched=0/0 cgrp=apps/bg_non_interactive handle=1431377544
  | state=R schedstat=( 0 0 0 ) utm=113074 stm=11704 core=1
  at java.util.HashMap.makeTable(HashMap.java:~569)
  at java.util.HashMap.doubleCapacity(HashMap.java:589)
  at java.util.HashMap.put(HashMap.java:419)
  at com.frogermcs.androiddevmetrics.internal.metrics.InitManager.putInitMetric(InitManager.java:60)
  at com.frogermcs.androiddevmetrics.internal.metrics.InitManager.addInitMetric(InitManager.java:55)
  at com.frogermcs.androiddevmetrics.aspect.Dagger2GraphAnalyzer.logAndExecute(Dagger2GraphAnalyzer.java:71)
  at com.mycompany.dagger.PreferencesModule.provideMyPrefsProvider(PreferencesModule.java:29)
  at com.mycompany.dagger.PreferencesModule_ProvideMyPrefsProviderFactory.get(PreferencesModule_ProvideMyPrefsProviderFactory.java:24)
  at com.mycompany.dagger.PreferencesModule_ProvideMyPrefsProviderFactory.get(PreferencesModule_ProvideMyPrefsProviderFactory.java:8)
  at com.mycompany.dagger.DaggerAppComponent.myPrefsPreferences(DaggerAppComponent.java:370)
  at com.mycompany.bluetooth.response_processing.DataBlockMediator.processDataBlock(DataBlockMediator.java:93)
  at com.mycompany.bluetooth.response_processing.DataBlockMediator.onNewDataBlock(DataBlockMediator.java:53)
  at com.mycompany.bluetooth.ResponseMediator.onNewDataBlock(ResponseMediator.java:162)
  at com.mycompany.bluetooth.response_processing.processor.shared.SharedDataProcessor.propagateDataBlock(SharedDataProcessor.java:66)
  at com.mycompany.bluetooth.response_processing.processor.shared.SharedDataProcessor.process(SharedDataProcessor.java:57)
  at com.mycompany.bluetooth.ResponseMediator.onNewParsedMessage(ResponseMediator.java:98)
  at com.mycompany.bluetooth.ResponseMediator$$Lambda$1.accept((null):-1)
  at io.reactivex.internal.operators.flowable.FlowableDoOnEach$DoOnEachSubscriber.onNext(FlowableDoOnEach.java:85)
  at io.reactivex.processors.UnicastProcessor.drainRegular(UnicastProcessor.java:213)
  at io.reactivex.processors.UnicastProcessor.drain(UnicastProcessor.java:289)
  at io.reactivex.processors.UnicastProcessor.onNext(UnicastProcessor.java:352)
  at com.mycompany.bluetooth.response_processing.parser.ResponseParser.onFinalState(ResponseParser.java:139)
  at com.mycompany.bluetooth.response_processing.parser.ResponseParser.parseByte(ResponseParser.java:127)
  at com.mycompany.bluetooth.response_processing.parser.ResponseParser$$Lambda$1.accept((null):-1)
  at io.reactivex.internal.operators.flowable.FlowableDoOnEach$DoOnEachSubscriber.onNext(FlowableDoOnEach.java:85)
  at io.reactivex.processors.PublishProcessor$PublishSubscription.onNext(PublishProcessor.java:316)
  at io.reactivex.processors.PublishProcessor.onNext(PublishProcessor.java:198)
  at com.mycompany.bluetooth.response_processing.parser.ResponseParser.lambda$parse$0(ResponseParser.java:108)
  at com.mycompany.bluetooth.response_processing.parser.ResponseParser$$Lambda$2.accept((null):-1)
  at io.reactivex.internal.operators.observable.ObservableDoOnEach$DoOnEachObserver.onNext(ObservableDoOnEach.java:95)
  at io.reactivex.internal.operators.observable.ObservableRange$RangeDisposable.run(ObservableRange.java:64)
  at io.reactivex.internal.operators.observable.ObservableRange.subscribeActual(ObservableRange.java:35)
  at io.reactivex.Observable.subscribe(Observable.java:10841)
  at io.reactivex.internal.operators.observable.ObservableDoOnEach.subscribeActual(ObservableDoOnEach.java:42)
  at io.reactivex.Observable.subscribe(Observable.java:10841)
  at io.reactivex.Observable.subscribe(Observable.java:10827)
  at io.reactivex.Observable.subscribe(Observable.java:10705)
  at com.mycompany.bluetooth.response_processing.parser.ResponseParser.parse(ResponseParser.java:109)
  at com.mycompany.bluetooth.ResponseMediator.processResponse(ResponseMediator.java:71)
  at com.mycompany.bluetooth.MyFacadeImpl$BTHandler.handleMessage(MyFacadeImpl.java:529)
  at android.os.Handler.dispatchMessage(Handler.java:102)
  at android.os.Looper.loop(Looper.java:136)
  at android.os.HandlerThread.run(HandlerThread.java:61)

We provide preferences through Dagger2 and we were not using @singleton, so I'm guessing that androiddevmetrics annotated that initialization, and since we receive information every 250ms and update several preferences, it quickly exhausted the heap.

In any case, I'd say that shouldn't be happening. While for other apps it may not cause an OOM, it definitely is using memory.

how to init version0.5

if I use the classpath 'com.frogermcs.androiddevmetrics:androiddevmetrics-plugin:0.5'

how should i init it?

Import doesn't work with beta build type

I have beta build type defined in build.gradle file with the same settings as debug build type. When I want to build this beta build (./gradlew assembleBeta) I get the error message with missing import com.frogermcs.androiddevmetrics.AndroidDevMetrics. Debug and release build types work properly.

Doesn't work on API 26

AndroidDevMetrics doesn't show popup window on API 26. It's all right when I revert to 25 API version.
My gradle file is

compileSdkVersion 25
buildToolsVersion "25.0.0"
    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 25
...

With this config all right.

compileSdkVersion 26
buildToolsVersion "26.0.1"
    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 26
...

With this configuration, notification popup doesn't show.

Visual issues

As you can see something is wrong with styles. Also I'm not sure but measuring doesn't seem to work good either.

Tested on Android 4.4.2 and 5.0.1. Result is the same on both devices.

screenshot_2016-02-01-13-00-07

Layout can have negative time

Sometimes, the layout step takes less than 0 ms. It should be impossible.

captura de pantalla 2017-07-07 13 41 12

Just for the information: I tested it on emulatior API19 and API23.

Thanks for your work!

Metrics for lifecycle methods are showing as 0ms for Library projects

Metrics are only showing for the activities in the App module, if we launch activities from a library component then metrics are showing as 0ms

Reproduction:

  1. Create a sample Android application
  2. Create sample library project with few activities(make proper dependency to the above sample app.).
  3. Navigate to the activity in the sample library project from App module.
  4. Check the metrics, 0ms is showing for the activities(of sample library).

Crashes when `enableActivityMetrics` is false

AndroidDevMetrics crashes when running with the following configuration:

AndroidDevMetrics.Builder builder = new AndroidDevMetrics.Builder(this)
            .enableActivityMetrics(false)
            .enableDagger2Metrics(true)
            .showNotification(false);
AndroidDevMetrics.initWith(builder);`

The stack trace is as follow:

Caused by: java.lang.RuntimeException: MethodsTracingManager must be initialized by init(..)
at com.frogermcs.androiddevmetrics.internal.MethodsTracingManager.checkInitialized(MethodsTracingManager.java:90)
at com.frogermcs.androiddevmetrics.internal.MethodsTracingManager.shouldTraceMethod(MethodsTracingManager.java:84)
at com.frogermcs.androiddevmetrics.aspect.ActivityLifecycleAnalyzer.executeWithTracingIfEnabled(ActivityLifecycleAnalyzer.java:77)
at com.frogermcs.androiddevmetrics.aspect.ActivityLifecycleAnalyzer.ajc$inlineAccessMethod$com_frogermcs_androiddevmetrics_aspect_ActivityLifecycleAnalyzer$com_frogermcs_androiddevmetrics_aspect_ActivityLifecycleAnalyzer$executeWithTracingIfEnabled(ActivityLifecycleAnalyzer.java:1)
at com.frogermcs.androiddevmetrics.aspect.ActivityLifecycleAnalyzer.logAndExecute(ActivityLifecycleAnalyzer.java:66)

Fragment-Specific Metrics?

We have a part of our app that uses a single activity and rotates Fragments in and out. Is there a way to leverage ADM's functionality for Fragments instead of the Activity in this scenario?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.