Giter Site home page Giter Site logo

keepsafe / dexcount-gradle-plugin Goto Github PK

View Code? Open in Web Editor NEW
3.1K 3.1K 247.0 4.39 MB

A Gradle plugin to report the number of method references in your APK on every build.

Home Page: https://keepsafe.github.io/dexcount-gradle-plugin/

License: Apache License 2.0

Groovy 31.49% Java 64.45% JavaScript 3.47% HTML 0.17% CSS 0.17% Thrift 0.25%
android gradle gradle-plugin

dexcount-gradle-plugin's Introduction

Dexcount Gradle Plugin

a chart showing sample methods counts by package

Build Status Android Weekly Android Arsenal

A Gradle plugin to report the number of method references in your APK, AAR, or java module.

This helps you keep tabs on the growth of your app, with an eye to staying under the 65,536 method-reference limit, and avoiding the headache of eliminating methods or enabling multidex.

For more information, please see the website.

Download

The plugin is available from the Gradle Plugin Portal under the ID com.getkeepsafe.dexcount, and from Maven Central under the coordinates com.getkeepsafe.dexcount:dexcount-gradle-plugin:4.0.0.

Snapshot builds are available from the Sonatype Snapshot Repository at https://oss.sonatype.org/content/repositories/snapshots.

Dexcount requires Java 11 or higher, Gradle 7.0 or higher, and Android Gradle Plugin 7.0.0 or higher. (Building the plugin requires Java 17 or higher.)

Credits

The Java code from the com.android.dexdeps package is sourced from the Android source tree. Inspired by Mihail Parparita's dex-method-counts project, to whom much credit is due.

Copyright 2015-2023 Keepsafe Software, Inc

dexcount-gradle-plugin's People

Contributors

ajalt avatar andrewreitz avatar bekuno avatar bendb-instacart avatar benjamin-bader avatar ckesc avatar danikula avatar fafhrd91 avatar fcduarte avatar fractalwrench avatar goooler avatar hoticecream avatar jaredsburrows avatar kenkyee avatar levibostian avatar neyguvj avatar oknesif avatar rharter avatar sarahsnow1 avatar saschpe avatar shtolik avatar taivokasper avatar vanniktech avatar vrallev avatar xiphirx avatar yangshenglu 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  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

dexcount-gradle-plugin's Issues

Add field-ref count

Dex also has a limit on fields defined (2^16); we should report that as well.

Add per-package method counts to the build output

For example:

13509   android
13509   android.support
3       android.support.annotation
8893    android.support.v4
53      android.support.v4.accessibilityservice
2090    android.support.v4.app
414     android.support.v4.content
2       android.support.v4.content.pm
13      android.support.v4.content.res
(etc)

This could take a couple forms:

  • we could write the tree to a file under the build outputs
  • we could optionally write the tree to stdout
  • we could unconditionally write the tree to stdout

I'm leaning towards the first option. A well-known (configurable) file is way better than munging Gradle's console output; probably will be a bit less discoverable though.

Result visualization

Is it possible to generate some html report with visualized result for example with pie chart or histogram ?

gradle countExternalDebugDexMethods fails

Parallel execution with configuration on demand is an incubating feature.
:app:countExternalDebugDexMethods
Total methods in app-external-debug-1.0.6.apk: 25001
Total fields in app-external-debug-1.0.6.apk: 16632
FAILURE: Build failed with an exception.

  • What went wrong:
    Could not add entry ':app:countExternalDebugDexMethods' to cache taskArtifacts.bin (/Users/user/tmp/project/.gradle/2.4/taskArtifacts/taskArtifacts.bin).
    Unable to store task input properties. Property 'apkOrDex' with value 'com.android.build.gradle.internal.api.ApkVariantOutputImpl_Decorated@5717906e' cannot be serialized.
  • Try:
    Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
    BUILD FAILED

Full stacktrace can be found here: http://pastebin.com/k2NXUjBJ

Add support for test modules

In our project we have module test-only module similar to the android-testing-template, but the plugin isn't working with following error message:

* What went wrong:
A problem occurred evaluating project ':tests'.
> Failed to apply plugin [id 'com.getkeepsafe.dexcount']
   > Dexcount plugin requires the Android plugin to be configured

show methods still available

Display the amount of methods that can still be added in addition to the amount of methods used.

The main value is to know how many methods can still be added. We find out self contently calculating that our self after reading the method count.

No such property: format

Hello,
thanks for great plugin.

I have faced an issue while configuring plugin.

I have included this block in build.gradle of my application module.

dexcount {
format = "tree"
}

But Gradle throws:

Error:(88, 0) No such property: format for class: com.getkeepsafe.dexcount.DexMethodCountExtension_Decorated

I am using
Gradle 2.10 via wrapper
Android gradle build plugin 1.5.0

README file lists incorrect configuration option

I tried configuring the dexcount plugin using the options described in the README file:

dexcount {
    includeClasses = false
    includeFieldCount = false
    includeTotalMethodCount = true
    printAsTree = false
    orderByMethodCount = true
    verbose = false
}

Unfortunately my build fails with this error:

* What went wrong:
A problem occurred evaluating project ':app'.
> No such property: includeMethodCount for class: com.getkeepsafe.dexcount.DexMethodCountExtension_Decorated

I tried changing includeTotalMethodCount to includeMethodCount and that didn't help either.

For now I've just commented out that configuration option so my build passes (obviously you can choose to not define the dexcount configuration block and use the defaults - that works fine too).

Release 0.3.1

Hi @philippb,

Would you mind shipping the latest bits to Maven Central? I've done everything up to, but I don't think I can push KeepSafe bits anymore. AJ knows what to do.

This will fix #33 as well.

Thanks!

Not support renamed output file

Build failed if I rename the output file like this:

    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            def file = output.outputFile
            def name = "xxx" + variant.name + "-v" + defaultConfig.versionName + ".apk";
            output.outputFile = new File(file.parent, name)
        }
    }

log:

Execution failed for task ':app:assembleDevelopDebug'.
> /workspace/project/park-here-android/app/build/outputs/apk/app-Develop-debug.apk (ๆฒกๆœ‰้‚ฃไธชๆ–‡ไปถๆˆ–็›ฎๅฝ•)

Build failed

Hello,
my build fails, and your plugin does not show the dex count:

UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536
at com.android.dx.merge.DexMerger$6.updateIndex(DexMerger.java:484)
at com.android.dx.merge.DexMerger$IdMerger.mergeSorted(DexMerger.java:261)
at com.android.dx.merge.DexMerger.mergeMethodIds(DexMerger.java:473)
at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:161)
at com.android.dx.merge.DexMerger.merge(DexMerger.java:188)
at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:504)
at com.android.dx.command.dexer.Main.runMonoDex(Main.java:334)
at com.android.dx.command.dexer.Main.run(Main.java:277)
at com.android.dx.command.dexer.Main.main(Main.java:245)
at com.android.dx.command.Main.main(Main.java:106)

Please advise,
Igor

Add integration test

#50 looked good but failed at runtime with a MethodNotFoundException (#51). This is not the first time a non-functional piece of code has landed; we should have an actual Android project built as part of the Travis build.

Not sure how much Travis will support this, but we can figure something out.

Ability to exclude packages from counting process

It's a little related to #10 , I'm using dexcount with sample project to count my library methods and fileds, but in sample project I'm using Android support library, which is not used in my own library.

If I would be able to exclude whole 'android.support' package from counting process that would give me better feeling how big my library is. This could be done via Gradle configuration and it would be partial solution for #10

"Cannot set readonly property: comparator for class: java.util.TreeMap" exception on assemble task

Here is a stacktrace:

Caused by: groovy.lang.ReadOnlyPropertyException: Cannot set readonly property: comparator for class: java.util.TreeMap
    at com.getkeepsafe.dexcount.PackageTree.addInternal(PackageTree.groovy:71)
    at com.getkeepsafe.dexcount.PackageTree.this$2$addInternal(PackageTree.groovy)
    at com.getkeepsafe.dexcount.PackageTree$this$2$addInternal$0.call(Unknown Source)
    at com.getkeepsafe.dexcount.PackageTree.addInternal(PackageTree.groovy:86)
    at com.getkeepsafe.dexcount.PackageTree.this$2$addInternal(PackageTree.groovy)
    at com.getkeepsafe.dexcount.PackageTree$this$2$addInternal$0.call(Unknown Source)
    at com.getkeepsafe.dexcount.PackageTree.addInternal(PackageTree.groovy:86)
    at com.getkeepsafe.dexcount.PackageTree.this$2$addInternal(PackageTree.groovy)
    at com.getkeepsafe.dexcount.PackageTree$this$2$addInternal$0.call(Unknown Source)
    at com.getkeepsafe.dexcount.PackageTree.addInternal(PackageTree.groovy:86)
    at com.getkeepsafe.dexcount.PackageTree.this$2$addInternal(PackageTree.groovy)
    at com.getkeepsafe.dexcount.PackageTree$this$2$addInternal$0.call(Unknown Source)
    at com.getkeepsafe.dexcount.PackageTree.addInternal(PackageTree.groovy:86)
    at com.getkeepsafe.dexcount.PackageTree.addMethodRef(PackageTree.groovy:59)
    at com.getkeepsafe.dexcount.PackageTree$addMethodRef.call(Unknown Source)
    at com.getkeepsafe.dexcount.DexMethodCountTask$_getPackageTree_closure3.doCall(DexMethodCountTask.groovy:112)
    at com.getkeepsafe.dexcount.DexMethodCountTask.getPackageTree(DexMethodCountTask.groovy:111)
    at com.getkeepsafe.dexcount.DexMethodCountTask_Decorated.getPackageTree(Unknown Source)
    at com.getkeepsafe.dexcount.DexMethodCountTask.countMethods(DexMethodCountTask.groovy:41)
    at com.getkeepsafe.dexcount.DexMethodCountTask$countMethods.call(Unknown Source)
    at com.getkeepsafe.dexcount.DexMethodCountPlugin$_applyAndroid_closure1_closure2_closure3.doCall(DexMethodCountPlugin.groovy:56)
    at org.gradle.api.internal.AbstractTask$ClosureTaskAction.execute(AbstractTask.java:548)
    at org.gradle.api.internal.AbstractTask$ClosureTaskAction.execute(AbstractTask.java:529)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:80)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:61)
    ... 54 more

------------------------------------------------------------
Gradle 2.2.1
------------------------------------------------------------

Build time:   2014-11-24 09:45:35 UTC
Build number: none
Revision:     6fcb59c06f43a4e6b1bcb401f7686a8601a1fb4a

Groovy:       2.3.6
Ant:          Apache Ant(TM) version 1.9.3 compiled on December 23 2013
JVM:          1.8.0_25 (Oracle Corporation 25.25-b02)
OS:           Mac OS X 10.11 x86_64

It can work work instant run

Enhancement: order by method counts

Hi,
is there any way you can modify your plugin to spit out the report which is ordered by method count? Otherwise I have to scroll through a very large file every time and look for packages haphazardly.

Thanks,
Igor

Add AAR support

It would be nice to be able to have the methods count for library projects. This means supporting the examination of the AAR output.

In contrast to APK archives, AAR archives contain a classes.jar file inside, instead of a classes.dex file.

To compile JAR files into DEX files, one would use the dx command line tool available in the Android SDK:

dx --dex --output=classes.dex classes.jar

It would be nice to do this from Java instead of calling an external command line tool to do this conversion. Looking at the source code of the dx tool, the method processOne looks like it would be useful for this.

Add Maximum Depth For "tree" Format

Hi! awesome library, I use it a lot but I only want to see the tree of dependencies with maximum depth of 4 and everytime I do a find and replace to remove the deeper levels so it can be more readable, like this:

com (24313 methods, 16883 fields)
  google (9577 methods, 4524 fields)
    android (8600 methods, 4141 fields)
      gms (8600 methods, 4141 fields)
    gson (964 methods, 377 fields)
      internal (561 methods, 232 fields)
      stream (90 methods, 74 fields)
      reflect (18 methods, 3 fields)
      annotations (6 methods, 0 fields)
    appengine (13 methods, 6 fields)
      api (13 methods, 6 fields)
  parse (3598 methods, 1598 fields)
    http (67 methods, 28 fields)
    interceptors (67 methods, 46 fields)
  rey (2980 methods, 3281 fields)
    material (2980 methods, 3281 fields)
      widget (1737 methods, 518 fields)
      app (606 methods, 246 fields)
      drawable (582 methods, 454 fields)
      util (35 methods, 5 fields)
      text (4 methods, 13 fields)

Caused by: java.io.EOFException

For some reason, this is happening on CI builds but not locally.

Command:

./gradlew clean assembleDebug testDebug

Error:

:assembleDebug FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':assembleDebug'.
> java.io.EOFException (no error message)

* Try:
Run with --info or --debug option to get more log output.

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':assembleDebug'.
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:69)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:46)
    at org.gradle.api.internal.tasks.execution.PostExecutionAnalysisTaskExecuter.execute(PostExecutionAnalysisTaskExecuter.java:35)
    at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:64)
    at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
    at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:52)
    at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52)
    at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:53)
    at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:203)
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:185)
    at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.java:66)
    at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.run(AbstractTaskPlanExecutor.java:50)
    at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.process(DefaultTaskPlanExecutor.java:25)
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter.execute(DefaultTaskGraphExecuter.java:110)
    at org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:37)
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:37)
    at org.gradle.execution.DefaultBuildExecuter.access$000(DefaultBuildExecuter.java:23)
    at org.gradle.execution.DefaultBuildExecuter$1.proceed(DefaultBuildExecuter.java:43)
    at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:32)
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:37)
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:30)
    at org.gradle.initialization.DefaultGradleLauncher$4.run(DefaultGradleLauncher.java:154)
    at org.gradle.internal.Factories$1.create(Factories.java:22)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:52)
    at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:151)
    at org.gradle.initialization.DefaultGradleLauncher.access$200(DefaultGradleLauncher.java:32)
    at org.gradle.initialization.DefaultGradleLauncher$1.create(DefaultGradleLauncher.java:99)
    at org.gradle.initialization.DefaultGradleLauncher$1.create(DefaultGradleLauncher.java:93)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:62)
    at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:93)
    at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:82)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter$DefaultBuildController.run(InProcessBuildActionExecuter.java:94)
    at org.gradle.tooling.internal.provider.ExecuteBuildActionRunner.run(ExecuteBuildActionRunner.java:28)
    at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:43)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:28)
    at org.gradle.launcher.exec.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:75)
    at org.gradle.launcher.exec.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:45)
    at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:52)
    at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:37)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:26)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:34)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:74)
    at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:72)
    at org.gradle.util.Swapper.swap(Swapper.java:38)
    at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:72)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.health.DaemonHealthTracker.execute(DaemonHealthTracker.java:40)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:66)
    at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:72)
    at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.health.HintGCAfterBuild.execute(HintGCAfterBuild.java:41)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
    at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:50)
    at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:246)
    at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:54)
    at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:40)
Caused by: java.io.EOFException
    at com.android.dexdeps.DexData.readBytes(DexData.java:479)
    at com.android.dexdeps.DexData.parseHeaderItem(DexData.java:86)
    at com.android.dexdeps.DexData.load(DexData.java:55)
    at com.android.dexdeps.DexData$load.call(Unknown Source)
    at com.getkeepsafe.dexcount.DexFile.<init>(DexFile.groovy:196)
    at com.getkeepsafe.dexcount.DexFile.<init>(DexFile.groovy)
    at com.getkeepsafe.dexcount.DexFile.extractDexFromAar(DexFile.groovy:115)
    at com.getkeepsafe.dexcount.DexFile.extractDexData(DexFile.groovy:58)
    at com.getkeepsafe.dexcount.DexFile$extractDexData.call(Unknown Source)
    at com.getkeepsafe.dexcount.DexMethodCountTask.generatePackageTree(DexMethodCountTask.groovy:234)
    at com.getkeepsafe.dexcount.DexMethodCountTask.countMethods(DexMethodCountTask.groovy:67)
    at com.getkeepsafe.dexcount.DexMethodCountTask$countMethods.call(Unknown Source)
    at com.getkeepsafe.dexcount.DexMethodCountPlugin$_applyAndroid_closure1_closure2_closure3.doCall(DexMethodCountPlugin.groovy:67)
    at org.gradle.api.internal.AbstractTask$ClosureTaskAction.execute(AbstractTask.java:554)
    at org.gradle.api.internal.AbstractTask$ClosureTaskAction.execute(AbstractTask.java:535)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:80)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:61)
    ... 68 more


BUILD FAILED

Total time: 27.37 secs

adding the dependencies trig a gradle error

I added the dependency in my main build.gradle file:

  repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.3.0'
        .....
        classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.4.3'
     }

When running ./gradlew clean ass
I get:

Cannot filter assets for multiple densities using SDK build tools 21 or later. Consider using apk splits instead.

Extract of my main module's build.gradle:

apply plugin: 'com.android.application'
// apply plugin: 'com.getkeepsafe.dexcount' // notice: this is commented
....
android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    dexOptions {
        jumboMode = true
    }

    defaultConfig {
        .....
        minSdkVersion 9
        targetSdkVersion 21
        compileOptions {
            sourceCompatibility JavaVersion.VERSION_1_7
            targetCompatibility JavaVersion.VERSION_1_7
        }


        // The following line makes sure resources for other screen densities will not be packaged.
        // This is specially useful to reduce APK size as some libraries may package a lot of
        // unnecessary resources otherwise. [!] BEWARE: you'll need to include any new screen
        // density you want to support here
        resConfigs "nodpi", "ldpi", "mdpi", "hdpi", "xhdpi", "xxhdpi", "xxxhdpi"
    } //END of defaultConfig
    ....
}

Observation:

  • my project compile fine without the dependency of dex-count

It's not working with aar libraries

I have a lot of components that i've made to use on multiple applications but every time that i build them i get 0 methods count. Is it possible to work with AAR files?

Dexcount plugin requires the Android plugin to be configured

Hello,
when I try and build my project after I add the library I get the following error:

Error:(18, 0) Dexcount plugin requires the Android plugin to be configured

this is my app build.gradle file

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.0.0-beta5'
classpath 'com.google.gms:google-services:2.0.0-alpha3'
classpath "net.rdrei.android.buildtimetracker:gradle-plugin:0.5.+"
classpath "com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.4.2"
}
}

apply plugin: "build-time-tracker"
apply plugin: "com.getkeepsafe.dexcount"

dexcount {
format = "list"
includeClasses = false
includeFieldCount = true
includeTotalMethodCount = true
orderByMethodCount = false
verbose = false
}

buildtimetracker {
reporters {
csv {
output "build/times.csv"
append true
header false
}

    summary {
        ordered true
        threshold 50
        barstyle "unicode"
    }

    csvSummary {
        csv "build/times.csv"
    }
}

}

allprojects {
repositories {
jcenter()
}
}

What do I need to configure?

Thank you

Wrong counts?

Getting these numbers with this plugin:

Total methods in app-debug.apk: 138351
Total fields in app-debug.apk: 50498
Methods remaining in app-debug.apk: -72816
Fields remaining in app-debug.apk: 15037

I definitely dont have 138351 methods as im not using multidex so if I did have that many methods I would of gotten an error.

Deploy version 0.3.0

@ajalt would you please make a release based off of master, if you have time? I'm no longer able to do this myself.

Gradle 2.0.0 Configuration

Hi, I read the documentation but I could not make it. I am using Android Studio 2.0 Stable version.

This is my project level build.gradle file :

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.0.0'
        classpath 'com.jakewharton.hugo:hugo-plugin:1.2.1'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

and this is app module level build.gradle

buildscript {
    repositories {
        mavenCentral() // or jcenter()
    }

    dependencies {
        classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.4.4'
    }
}

apply plugin: 'com.getkeepsafe.dexcount'
apply plugin: 'com.android.application'
apply plugin: 'com.jakewharton.hugo'

dexcount {
    format = "list"
    includeClasses = false
    includeFieldCount = true
    includeTotalMethodCount = false
    orderByMethodCount = false
    verbose = false
    maxTreeDepth = Integer.MAX_VALUE
    teamCityIntegration = false
}

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"

    defaultConfig {
        applicationId "my_package_name"
        minSdkVersion 11
        targetSdkVersion 23
        versionCode 1
        versionName "1.0.0"
    }
    buildTypes {
        debug {
            debuggable true
            minifyEnabled false
            useProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        release {
            debuggable false
            minifyEnabled false
            useProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    packagingOptions{
        exclude 'META-INF/maven/commons-io/commons-io/pom.xml'
        exclude 'META-INF/maven/commons-io/commons-io/pom.properties'
    }
}

ext {
    supportLibVersion = '23.3.0'
    googlePlayServicesVersion = '8.4.0'
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile "com.android.support:appcompat-v7:${supportLibVersion}"
    compile "com.android.support:design:${supportLibVersion}"
    compile "com.android.support:percent:${supportLibVersion}"
    compile "com.android.support:cardview-v7:${supportLibVersion}"

    compile 'com.jakewharton:butterknife:7.0.1'
    compile 'com.squareup.picasso:picasso:2.5.2'

    // eventbus
    compile 'org.greenrobot:eventbus:3.0.0'

    // rate me dialog
    compile 'com.github.hotchemi:android-rate:0.5.6'

    // apache commons-io
    compile group: 'commons-io', name: 'commons-io', version: '2.0.1'
}

this is giving error everytime :

Error:(11, 0) Dexcount plugin requires the Android plugin to be configured

Bad <init> method call from inside of a branch

Information:Gradle tasks [:app:assembleDebug]
:app:preBuild UP-TO-DATE
:app:preDebugBuild UP-TO-DATE
:app:checkDebugManifest
:app:preReleaseBuild UP-TO-DATE
:app:prepareComAndroidSupportAppcompatV72301Library UP-TO-DATE
:app:prepareComAndroidSupportRecyclerviewV72301Library UP-TO-DATE
:app:prepareComAndroidSupportSupportV132301Library UP-TO-DATE
:app:prepareComAndroidSupportSupportV42301Library UP-TO-DATE
:app:prepareComCrashlyticsSdkAndroidAnswers132Library UP-TO-DATE
:app:prepareComCrashlyticsSdkAndroidBeta113Library UP-TO-DATE
:app:prepareComCrashlyticsSdkAndroidCrashlytics252Library UP-TO-DATE
:app:prepareComCrashlyticsSdkAndroidCrashlyticsCore235Library UP-TO-DATE
:app:prepareComGithubChrisbanesPhotoviewLibrary124Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesBase780Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesLocation780Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesMaps780Library UP-TO-DATE
:app:prepareComMsSquareExpandableTextView014Library UP-TO-DATE
:app:prepareIoFabricSdkAndroidFabric136Library UP-TO-DATE
:app:prepareJpCoCyberagentAndroidGpuimageGpuimageLibrary123Library UP-TO-DATE
:app:prepareMeGrantlandAutofittextview021Library UP-TO-DATE
:app:prepareOrgApmemToolsLayouts19Library UP-TO-DATE
:app:prepareDebugDependencies
:app:compileDebugAidl UP-TO-DATE
:app:compileDebugRenderscript UP-TO-DATE
:app:generateDebugBuildConfig UP-TO-DATE
:app:generateDebugAssets UP-TO-DATE
:app:mergeDebugAssets UP-TO-DATE
:app:generateDebugResValues UP-TO-DATE
:app:generateDebugResources UP-TO-DATE
:app:mergeDebugResources UP-TO-DATE
:app:processDebugManifest UP-TO-DATE
:app:fabricGenerateResourcesDebug
:app:processDebugResources
:app:generateDebugSources
:app:processDebugJavaRes UP-TO-DATE
:app:compileDebugJavaWithJavac UP-TO-DATE
:app:compileDebugNdk UP-TO-DATE
:app:compileDebugSources UP-TO-DATE
:app:dexDebug UP-TO-DATE
:app:validateDebugSigning
:app:packageDebug
:app:zipalignDebug
:app:assembleDebug FAILED
Error:Execution failed for task ':app:assembleDebug'.
> Bad <init> method call from inside of a branch
Exception Details:
  Location:
    com/getkeepsafe/dexcount/PackageTree.<init>(Ljava/lang/String;)V @27: invokespecial
  Reason:
    Error exists in the bytecode
  Bytecode:
    0x0000000: b800 214d b800 359a 0006 a700 172a 2b2c
    0x0000010: 1236 3212 022b b900 3c03 00b7 002c a700
    0x0000020: 0f2a 2b2b b800 40b8 0029 b700 2cb1     
  Stackmap Table:
    append_frame(@13,Object[#67])
    same_frame(@33)
    full_frame(@45,{Object[#2],Object[#69],Object[#67]},{})
Information:BUILD FAILED
Information:Total time: 27.534 secs
Information:1 error
Information:0 warnings
Information:See complete output in console

Gradle 2.4

Build time: 2015-05-05 08:09:24 UTC
Build number: none
Revision: 5c9c3bc20ca1c281ac7972643f1e2d190f2c943c

Groovy: 2.3.10
Ant: Apache Ant(TM) version 1.9.4 compiled on April 29 2014
JVM: 1.7.0_79 (Oracle Corporation 24.79-b02)
OS: Windows 7 6.1 amd64

Can't use for some reason

I get this error:
Error:Could not find com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.5.0.
Searched in the following locations:
file:/C:/Program Files/Android/android-studio/gradle/m2repository/com/getkeepsafe/dexcount/dexcount-gradle-plugin/0.5.0/dexcount-gradle-plugin-0.5.0.pom
file:/C:/Program Files/Android/android-studio/gradle/m2repository/com/getkeepsafe/dexcount/dexcount-gradle-plugin/0.5.0/dexcount-gradle-plugin-0.5.0.jar
https://maven.fabric.io/public/com/getkeepsafe/dexcount/dexcount-gradle-plugin/0.5.0/dexcount-gradle-plugin-0.5.0.pom
https://maven.fabric.io/public/com/getkeepsafe/dexcount/dexcount-gradle-plugin/0.5.0/dexcount-gradle-plugin-0.5.0.jar

exportAsCSV issue

I am getting the following error when using any of the configurations below

dexcount{
includeFieldCount = true
exportAsCSV = true
}
or
dexcount{
exportAsCSV = true
}

Error:(98, 0) No such property: exportAsCSV for class: com.getkeepsafe.dexcount.DexMethodCountExtension_Decorated
Open File

I am using com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.2.1
and com.android.tools.build:gradle:1.4.0-beta3

Investigate plugin behavior with 'flavors'

As observed in issue #85, when a project uses build flavors, then dexcount possibly chooses an arbitrary flavor to count.

If so, this is not ideal - we count all variants being built, so it makes sense that we would also count all flavors.

Cannot write to file '/build/outputs/dexcount/debugChart' specified for property 'chartDir' as it is a directory.

Command:

./gradlew clean assembleDebug countDebugDexMethods

Error:

:assembleDebug
Total methods in -debug.aar: 2154 (3.29% used)
Total fields in -debug.aar:  1036 (1.58% used)
Methods remaining in -debug.aar: 63381
Fields remaining in -debug.aar:  64499
:countDebugDexMethods FAILED

FAILURE: Build failed with an exception.

* What went wrong:
A problem was found with the configuration of task ':countDebugDexMethods'.
> Cannot write to file '/build/outputs/dexcount/debugChart' specified for property 'chartDir' as it is a directory.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 9.439 secs

Think about Proguard support

If a mapping exists, we should use it to de-obfuscate package names for method counts.

If you are reading this, and are interested in having support for using Proguard mappings in dexcount output, please leave a +1. This is currently very low priority, but if enough people are interested we can make it happen sooner.

[Feature] Summary count tasks

Let's say I have one project with 2 flavors, hence I'll get those tasks:

count<Project><Flavor1>DebugDexMethods
count<Project><Flavor1>ReleaseDexMethods
count<Project><Flavor2>DebugDexMethods
count<Project><Flavor2>ReleaseDexMethods

Would not it be also cool to have:

count<Project><Flavor>DexMethodsAll which will execute:
count<Project><Flavor>DebugDexMethods and count<Project><Flavor>ReleaseDexMethods

And also:

count<Project>DexMethodsAll which will execute:
count<Project><Flavor1>DebugDexMethods, count<Project><Flavor1>ReleaseDexMethods, count<Project><Flavor2>DebugDexMethods and count<Project><Flavor2>ReleaseDexMethods

The problem that I have is that the build Task takes about 45 minutes to build all of my projects since there are quite a lot Therefore I have two Jenkins tasks. One that executes build and the other ones that executes check. In order to get the dexcount also in the check Jenkins Job I'd need to chain all of the count tasks.

Does this work after or before progaurd ?

Hi,
Thanks for this plugin it's really amazing!

I just wanted to know does this work before or after progaurd? I have way too many methods and can't tell if those methods are before or after shrinking

StringIndexOutOutBoundsException

Dependencies

com.android.tools.build:gradle:1.3.0-beta4
com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.2.0-SNAPSHOT
Gradle 2.5 (Occurs with 2.4 as well)

Stack Trace

org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':stylini
ty:assembleDevelopmentDebug'.
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.ex
ecuteActions(ExecuteActionsTaskExecuter.java:69)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.ex
ecute(ExecuteActionsTaskExecuter.java:46)
        at org.gradle.api.internal.tasks.execution.PostExecutionAnalysisTaskExec
uter.execute(PostExecutionAnalysisTaskExecuter.java:35)
        at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.exec
ute(SkipUpToDateTaskExecuter.java:64)
        at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execut
e(ValidatingTaskExecuter.java:58)
        at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecu
ter.execute(SkipEmptySourceFilesTaskExecuter.java:52)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter
.execute(SkipTaskWithNoActionsExecuter.java:52)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execut
e(SkipOnlyIfTaskExecuter.java:53)
        at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter
.execute(ExecuteAtMostOnceTaskExecuter.java:43)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTa
skWorker.execute(DefaultTaskGraphExecuter.java:208)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTa
skWorker.execute(DefaultTaskGraphExecuter.java:186)
        at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorW
orker.processTask(AbstractTaskPlanExecutor.java:62)
        at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorW
orker.run(AbstractTaskPlanExecutor.java:50)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.
onExecute(ExecutorPolicy.java:54)
        at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableE
xecutorImpl.java:40)
Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range:
 0
        at java_lang_CharSequence$charAt$0.call(Unknown Source)
        at com.getkeepsafe.dexcount.PackageTree.<init>(PackageTree.groovy:24)
        at com.getkeepsafe.dexcount.PackageTree.addInternal(PackageTree.groovy:3
6)
        at com.getkeepsafe.dexcount.PackageTree.this$2$addInternal(PackageTree.g
roovy)
        at com.getkeepsafe.dexcount.PackageTree$this$2$addInternal$0.call(Unknow
n Source)
        at com.getkeepsafe.dexcount.PackageTree.addInternal(PackageTree.groovy:4
3)
        at com.getkeepsafe.dexcount.PackageTree.this$2$addInternal(PackageTree.g
roovy)
        at com.getkeepsafe.dexcount.PackageTree$this$2$addInternal$0.call(Unknow
n Source)
        at com.getkeepsafe.dexcount.PackageTree.addInternal(PackageTree.groovy:4
3)
        at com.getkeepsafe.dexcount.PackageTree.this$2$addInternal(PackageTree.g
roovy)
        at com.getkeepsafe.dexcount.PackageTree$this$2$addInternal$0.call(Unknow
n Source)
        at com.getkeepsafe.dexcount.PackageTree.addInternal(PackageTree.groovy:4
3)
        at com.getkeepsafe.dexcount.PackageTree.this$2$addInternal(PackageTree.g
roovy)
        at com.getkeepsafe.dexcount.PackageTree$this$2$addInternal$0.call(Unknow
n Source)
        at com.getkeepsafe.dexcount.PackageTree.addInternal(PackageTree.groovy:4
3)
        at com.getkeepsafe.dexcount.PackageTree.add(PackageTree.groovy:28)
        at com.getkeepsafe.dexcount.PackageTree$add.call(Unknown Source)
        at com.getkeepsafe.dexcount.DexMethodCountTask$_getPackageTree_closure3.
doCall(DexMethodCountTask.groovy:112)
        at com.getkeepsafe.dexcount.DexMethodCountTask.getPackageTree(DexMethodC
ountTask.groovy:108)
        at com.getkeepsafe.dexcount.DexMethodCountTask_Decorated.getPackageTree(
Unknown Source)
        at com.getkeepsafe.dexcount.DexMethodCountTask.countMethods(DexMethodCou
ntTask.groovy:41)
        at com.getkeepsafe.dexcount.DexMethodCountTask$countMethods.call(Unknown
 Source)
        at com.getkeepsafe.dexcount.DexMethodCountPlugin$_applyAndroid_closure1_
closure2_closure3.doCall(DexMethodCountPlugin.groovy:54)
        at org.gradle.api.internal.AbstractTask$ClosureTaskAction.execute(Abstra
ctTask.java:554)
        at org.gradle.api.internal.AbstractTask$ClosureTaskAction.execute(Abstra
ctTask.java:535)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.ex
ecuteAction(ExecuteActionsTaskExecuter.java:80)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.ex
ecuteActions(ExecuteActionsTaskExecuter.java:61)
        ... 14 more

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.