Whether you develop for iOS or Android, are working at a large company or hustling as a freelancer, chances are you’re hacking on many apps at the same time. Working on all these apps leads to the pain of managing all their notifications, which we know can sometimes be overwhelming.

We love supporting you in your development efforts and we heard you loud and clear when you told us that you wanted more control and simplification when managing your settings. Thanks to all your feedback, we set out to make managing your settings a top-notch experience, so you can get back to the fun stuff: writing code and building the next big app for millions of users!

Seamless, Intuitive Navigation

We started off by revamping our UI, moving away from modals, and utilizing a full canvas, providing ample space to display all your settings details. Previously settings dashboards were organized at the app level, which required you to switch between each app in order to access the app’s settings. To make this process easier, we added high level lists with views allowing you to instantly access the settings of all apps under your account.

 

For those of you who manage many apps, belong to many organizations, or have large teams, we’ve added searchable fields for each category. Our new search offers a seamless, real-time filtering based on your query term, so you can quickly and easily find what you’re looking for with very little effort.

 

Powerful, Streamlined Notifications

With our new notifications we want to put the control in your hands for whether or not you receive alerts for your apps. Previously our notifications were very granular and required more management, especially when adding a new app. We’ve tailored this experience so that you only have to set your preferences once! By choosing “watch”, you automatically assign the preferences you’ve selected to all your apps, or you can stop watching to not receive any notifications for a particular app.

With multiple apps in your account, it can be overwhelming to adjust their settings individually. Our new dashboard offers a completely streamlined process for you to select how you want to get notified. As you view your list of apps, you can easily toggle between watching or not watching. We’ve also added the ability to set a default category for new apps that are added to “watched” or not.

 

Intelligent, Flexible Email Routing

One of the most widely requested functionalities that we included in this revamp is the ability to assign a confirmed email address to each org when receiving notifications. For developers with multiple orgs, we understood the need to customize where you receive your notifications. You can now assign a confirmed email address for each of your orgs to receive your notifications!

Lightweight, Premium Performance

With this new functionality also comes significant performance improvements. While we’ve added significantly more data requests and provided more information for each request, we’ve increased page speed by over 4200%. Moving away from modals to URL driven displays allows you to quickly access the information you need and jump right back into whatever it is you were working on! With these speed improvements transitions to and from settings are faster allowing you to get in and out of settings quickly dive back into your dashboard without disrupting your workflow.

Optimized Collaboration Experience

It’s now easier to invite multiple members of your team to join your org, all at once! We want to help you get your team up and running as quickly as possible, so we’ve simplified the process of adding team members.

We are very excited and proud to show you our new Settings dashboard. We hope that this will give you the best experience in managing your app settings and help you achieve top performance for all your apps. Log in to your new settings dashboard or sign up for Crashlytics and give us your feedback!


View More

 

In the 2+ years since we launched Crashlytics to solve mobile crash reporting, we’ve heard you loud and clear about another problem in mobile development: the beta distribution process. Testing new apps with real beta testers can be a cumbersome and unnecessarily complex process.

At Crashlytics, our mission is to deliver the easiest and most powerful tools for mobile developers. Through Crashlytics Labs, we’re always pushing the boundaries and tinkering with new ideas. I’m excited to share that we’ve been hard at work in our Labs building a beta distribution tool for both iOS and Android.

By focusing on multi-platform support, our beta distribution tool streamlines the process and shreds the complexity of managing different toolsets. We’ve been privately testing this tool with some of the best app developers out there. Now, we’re ready to open this up to more of you.

If you want to apply to test our new tool for beta distribution and other secret projects we’re working on, sign up to become a Crashlytics Lab Rat.

Cheers,

Wayne Chang


View More

 

While sheer performance and deep insights are essential in a crash reporting solution, we’re passionate about also delivering an unparalleled user experience. After launching our optimized stack traces just a few weeks ago, we were heads down again meticulously refining our user interface and reporting features. With the latest Crashlytics real-time interface, you can now keep tabs on your most prevalent crashes with prominent, intelligently organized crash notifications — inside an optimized, redesigned navigation experience.

Additionally, for the very first time, we’re offering an effortless, one-click sign in using your Twitter account!

Dynamic, Real-Time Notifications

You just never know when a critical issue might occur and require your immediate attention. While we’ve always offered real-time functionalities in our web dashboard, we wanted to take the experience even further. Our new notifications system keeps the interface even more pristine, with real-time alerts appearing on the lower righthand corner.

As subsequent crashes come in, the alert box automatically updates itself in real-time, grouping crashes by type so they don’t pile up! Additionally, each alert displays the filename and line number prominently for easy identification. Now you can know exactly how many new crashes there are and scan through all of them with minimal effort — without any incoming crashes disrupting your flow.

From our friends at Blackboard:

Our dashboard is composed of hundreds of apps with thousands of app versions. Refinements to the navigation and the incorporation of real-time notifications on the dashboard have made it incredibly simple to zero in on a problem and trace it to a solution. Crashlytics is by far the best solution to monitor, track, and resolve crashes at scale.

Bryan Musial,

Intuitive, Responsive Navigation

Tackling complex bugs can be a frustrating process for many developers — let alone having to manage the process across multiple apps and organizations. For those of you with multiple apps, our new context control now automatically orders your list of apps based on recent interactions. Coupled with a seamless search functionality, the apps you’re most actively managing are always at your fingertips.  Each app is also labeled with its corresponding organization, so you know precisely where it belongs.

Since the birth of Crashlytics, we’ve continually upgraded the navigation experience with highly visible tabs and efficient menu structures. To take the experience to the next level, we made our new navigation sidebar ultra-thin which maximizes the horizontal space for displaying all the critical crash data. We also replaced the tabs with slick, eye-catching buttons.

In our newly redesigned menu structure, each button has a drop down menu that gives you seamless access to all of the following options:

  • Add a new app, organization or account
  • Manage settings across your apps, organization and account
  • Access the Crashlytics Knowledge Base, TOS and blog
  • Download plugins

As your app scales and acquires more users, the issues list can get quite long, requiring you to scroll down. Our new navigation bar now rests in a fixed position on the left side, so you’ll always have access to the app selector as well as all the menu items as you scroll up or down. Given all the different screen sizes in today’s world, we’ve also made our navigation bar vertically responsive which automatically adjusts to the height of the browser window.

Seamless, One-Click Twitter Sign In

Ever since we joined forces with Twitter, we’ve been accelerating our build-out and remain dedicated to delivering the key app performance insights that every developer needs. With Twitter’s infrastructure, we hoped to deliver new features faster than ever before. Today, we officially announce that you can sign into Crashlytics with our one-click, OAuth integration with Twitter.

For existing Crashlytics users, you will be able to link your Crashlytics account to your Twitter account during sign in. Once you’ve synced up the two accounts, it’s just one simple click the next time you sign into Crashlytics!

As we continue on our mission to improve the debugging experience for developers all around the world, we couldn’t wait to get these upgrades into your hands. Sign in or request an invite to experience the new Crashlytics interface — we’re always eager to hear your feedback!

Already have an account? Sign in here.

 


View More

 

ProGuard, a code optimization and obfuscation tool provided as part of the Android SDK, can be a double edge sword — it presents bootstrapping challenges but when applied correctly, provides tremendous benefits! At Crashlytics we’ve spent a lot of time leveraging the power of ProGuard to develop lightweight libraries to help app developers ship awesome products — in particular, we use these four features in our day-to-day development.

Shrinking

As your codebase grows and becomes more full featured, it’s important to keep a small binary in mind. Reducing the size of the APK can be extremely advantageous, since large binaries are much less likely to be installed in poor network conditions or on older less powerful devices.

It’s been well publicized among the developer community that the Dalvik Virtual Machine is memory limited to 64k methods. With this restriction, ProGuard can help provide a buffer as you consider which measures to take to reduce your code size. Removing unused code, which likely exists in a 64k method project, enables your development team to work on features unimpeded by technical limitations, while refactoring or external class loading is considered.

Even though shrinking is advantageous, simply identifying unused code to remove is a good practice. By using the printusage flag in Proguard.cfg, your configuration file, ProGuard will list the unused code to allow for proper code maintenance and cleanup.

 1 # This is a configuration file for ProGuard.
 2 # http://proguard.sourceforge.net/index.html#manual/usage.html
 3
 4 -dontusemixedcaseclassnames
 5 -dontskipnonpubliclibraryclasses
 6 -verbose
 7
 8 -printseeds seeds.txt
 9 -printusage unused.txt
10 -printmapping mapping.txt

Obfuscating

With tools available to extract the contents of APK’s, deodex, and read the class files, it’s important to obfuscate to protect the proprietary aspects of your codebase. ProGuard generates a mapping file that allows you to map the stack traces of obfuscated code to actual methods.

Original code:

 1 package com.example.app;
 2
 3 public class Data
 4 {
 5    public final static int RESULT_ERROR = -1;
 6    public final static int RESULT_UNKNOWN = 0;
 7    public final static int RESULT_SUCCESS = 1;
 8
 9    private final int mId;
10    private final int mResult;
11    private final String mMessage;
12
13    public Data(int id, int result, String message) {
14       mId = id;
15       mResult = result;
16       mMessage = message;
17    }
18
19    public int getId() {
20       return mId;
21    }
22
23    public int getResult() {
24       return mResult;
25    }
26
27    public String getMessage() {
28       return mMessage;
29    }
30 }

Code obfuscated by ProGuard:

 1 package com.example.app;
 2
 3 public class a
 4 {
 5    private final int a;
 6    private final int b;
 7    private final String c;
 8
 9    public a(int paramInt1, int paramInt2, String paramString)
10    {
11       this.a = paramInt1;
12       this.b = paramInt2;
13       this.c = paramString;
14    }
15
16    public int a()
17    {
18       return this.a;
19    }
20
21    public int b()
22    {
23       return this.b;
24    }
25
26    public String c()
27    {
28       return this.c;
29    }
30 }

By automatically collecting the mapping files on build, Crashlytics streamlines the deobfuscation process of your code and intelligently prioritize stack traces to make your debugging process effortless.

Repackaging

Repackaging allows ProGuard to take externals jars and class files and move them to a single container with a common java package location:

 1 # com.example.networking contains the networking level
 2 # com.example.database contains the persistence level
 3 # repackage low level services into common package for simplicity
 4 -repackageclasses "com.example.internal"
 5
 6 # com.example.public contains public interfaces
 7 # ignore these in repacking
 8 -keep public class com.example.public.* {
 9    public *;
10 }

For those of you building libraries, repackaging is extremely helpful if you choose to show a simple interface to third party developers while keeping a maintainable and well structured project hierarchy in the source repository. This can also be useful in organizing lower level packages while exposing well defined interfaces!

Optimizing

Optimizing works on compiled classes to implement many small optimizations based on the java version. By default the proguard-android.txt that ships with the Android tools has optimizations turned off, but the proguard-android-optimize.txt has the presets if needed.

 1 # Optimizations: If you don't want to optimize, use the
 2 # proguard-android.txt configuration file instead of this one, which
 3 # turns off the optimization flags.  Adding optimization introduces
 4 # certain risks, since for example not all optimizations performed by
 5 # ProGuard works on all versions of Dalvik.  The following flags turn
 6 # off various optimizations known to have issues, but the list may not
 7 # be complete or up to date. (The "arithmetic" optimization can be
 8 # used if you are only targeting Android 2.0 or later.)  Make sure you
 9 # test thoroughly if you go this route.
10
11 -optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*
12 -optimizationpasses 5
13 -allowaccessmodification
14 -dontpreverify

Optimizations provide performance improvements for language operations. However, there are known incompatibility issues with various Dalvik versions, so we encourage a thorough review of the code base and device target demographic before enabling.

Beyond leveraging these four core features of ProGuard, we crafted several strategies for those of you looking to build lightweight apps/libraries and optimize your interaction with ProGuard.

Improving Build Times

Adding ProGuard to the build process can slow down build time, so it’s important to minimize the amount of code ProGuard needs to examine. This is vital when considering third party libraries, like Crashlytics, that have already been processed by ProGuard — it’s just a waste of CPU to reprocess with ProGuard again, and it’s much slower!

We thought it would be valuable to estimate the improvement in build times when preprocessed, third party libraries are ignored in ProGuard. Using the Crashlytics library as an example, we conducted numerous runs with internal test apps across various sizes. We found that build times improved by up to 5% when the Crashlytics package is ignored. But that’s just one library that is already ultra-lightweight. Imagine the build time improvements for apps leveraging additional libraries — it can be tremendous.

To avoid processing a library that may have been preprocessed, simply add the following to Proguard.cfg:

1 -libraryjars libs
2 -keep class com.crashlytics.** { *; }

As obfuscation is usually done for security, if using an open source library, there may be no reason to obfuscate it. By following a similar pattern as listed above, processing can be further reduced ultimately improving build time. The Android support library is a great example:

1 -libraryjars libs
2 -keep class android.support.v4.app.** { *; }
3 -keep interface android.support.v4.app.** { *; }

Reflection

Using reflection in Android is highly discouraged for many well known reasons, including performance and instability in changing APIs, however, it can be quite useful for Unit Testing. Common use includes changing the scope of methods to set test data or mock objects. If you’re using ProGuard during development build to obfuscate, it’s important to understand that when a method or class name is changed, string representations of them are not. When designing testable interfaces, if tests are run on a device using a build that has been processed by ProGuard, this will cause method not found exceptions.

Library development

Additional complexity is introduced when developing libraries that are processed with ProGuard, both when they are distributed and when the app developer runs the process. When the code is obfuscated twice, it is much more challenging to track down bugs as two mapping.txt files would be required to de-obfuscate the stack trace. To avoid processing these libraries with ProGuard a second time, be sure to follow our steps in section above on improving build times!

For those of you building libraries, you may have encountered more challenges with ProGuard because in any sufficiently complex project, the possibility for custom ProGuard rules exists. We recommend not requiring custom ProGuard rules because the library can break if a different set of rules is applied after a custom set. If custom rules are required, be sure that those using your library include any custom ProGuard rules in their own config file. This will ensure compatibility between your library and the app!

1  # Custom Rules
2 -keep class com.example.mylibrary.** { *; }

Ever since Crashlytics was born, we’ve made it our mission to make developers’ lives easy. We hope that these strategies will help you build the next groundbreaking Android app/library and perhaps in the process, make a dent in the universe ;)

External Resources


View More

 

If you’re anything like the rest of the world you’ve probably already proclaimed that your new diet didn’t apply to Super Bowl Sunday, or Awards Season, or the Polar Vortex, or winter. Which is fine! Life’s too short not to eat nachos. But if your resolution had anything to do with improving your apps’ stability to delight even more users, no worries — we’ve got good news for you!

We love supporting you to help minimize crashes and improve user experience, which is why last month we were heads down upgrading our stack traces and UI performance. Now you can tackle those hard to catch bugs with our high-performance dashboard, even easier-to-digest crash reports for both iOS and Android, and a slew of usability upgrades.

Faster, Better, Stronger
Isn’t it awesome when your apps and dashboards render at lightning speed? Our crash reporting dashboard is already returning tons of useful information in under a few seconds, but we wanted more. By more efficiently parsing protobuf and stopping the browser from freezing on render, our new UI now renders stackframes up to 181x faster with nearly 55% reduction in memory!

Here’s a performance comparison between our original and newly optimized UI across the major browsers:

Powerful, Shareable Stack Traces

To make stack traces even more useful, we now allow easy copying & pasting of your raw stack traces, so you can share them seamlessly with your team even outside of our shareable crash reports feature. We also upgraded our iOS SDK to record Objective-C selectors, when possible. By including the selector being dispatched during crashes in objc_msgSend, developers can track down certain classes of crashes and gain additional context in certain cases that can be otherwise inscrutable.

From our friends at Evernote:

Every developer should be using Crashlytics. Except my competitors. It provides more crash information than any similar tool.

John Knox,

With the rapid growth of developers using Crashlytics for Android, we knew we needed to support this growing community and provide Android stack traces in their most familiar context. We now present these stack traces in a way that’s in line with the traditional Java counterpart.

Comprehensive & Interactive

Sometimes it can be overwhelming to scan through long lists of threads in your crash reports — almost as overwhelming as grocery shopping for that juice cleanse you had planned for the start of the New Year! With these new upgrades, we took this chance to enhance the UI controls for maximum readability. We added a breakpoint-like indicator to highlight the most important frame so it is identifiable at a glance.

We also added new controls that make it even easier to understand which frames have been hidden and how to expand the collapsed threads.

We couldn’t be happier to get the new stack traces and UI upgrades into your hands and help you to continue to build awesome apps. We hope these enhancements will help you stick with at least one of your resolutions this year. Log in or sign up for Crashlytics and send us your feedback; we’re always listening!

Already have an account? Log in here.


View More

 

Crashlytics Look Back at 2013

2013 was a year filled with excitement, innovation and disruption. Apple introduced the iPhone 5S, Google announced an IDE built just for Android developers, and the world rolled their eyes as words like selfie, twerk and jorts were added to dictionary!

It was exactly a year ago today that we joined forces with Twitter. Since the acquisition, not only did we enhance features, functionality and improve your experience with Crashlytics, we also had some pretty exciting personal achievements — our first kegerator, 4 Crashlytics babies, and 24 new employees (p.s. – we’re hiring)!

Here’s a look back at how things shook out for us in 2013.

Crashlytics Look Back at 2013 Infographic

 


View More