Hacker News new | ask | show | jobs
by superb_dev 908 days ago
Is minifying a concern in the Java world?
4 comments

Yup! It's a major step in building any Java application. Things like stripping symbol names, removing unused APIs, and processing non-java assets like images. For Android applications Gradle handles this by invoking some Android specific utilities alongside the java ones, but there's tons of build tools out there for Java that handle doing these things for everything from Blu-Rays to web apps.
Not any Java application, only on Android and embedded.

I never ever saw anyone doing it for desktop or server applications.

Unfortunately you can't treeshake a language that supports reflections. So it's not like a C++ program where unused parts get dropped.

You can manually remove dependencies or.. I think in the Android world you specify what classes can be reflected on and then strip unused code with Proguard (though I could never get it working with Clojure)

Would love to be corrected if I got any of it wrong

You surely can, it is a thing since Smalltalk and Common Lisp images.

On Java's case, all AOT toolchains and embedded deployment workflows have supported similar capabilities.

> Unfortunately you can't treeshake a language that supports reflections.

I’m pretty sure that’s exactly what the Google Closure Compiler does: https://developers.google.com/closure/compiler/docs/limitati...

Though it has a ton of restrictions on how you write code and how you can use reflection.

>Unfortunately you can't treeshake a language that supports reflections.

Like JavaScript?

Yes, you can't treeshake Javascript. You can treeshake a subset of Javascript.

If you are limiting tooling to subsets, you can also compile subsets of Python or Javascript to machine code.

I'm afraid you did get it wrong - it's very standard to do that on all Android apps. The part that you missed is that reflection is rarely used in production apps (partially because for a long time, reflection was VERY expensive on Dalvik/ART runtimes) and can be easily handled by configuration for minifier/optimizer to explicitly keep code.

Even C++ you mention does that - you have explicit __attribute__ calls to avoid linker from dropping code you want to keep for reflection purposes.

Yup! Most used to rely on Proguard but nowadays, Android ships an alternative called R8: https://developer.android.com/build/shrink-code
Yes, it's enabled by default even in tutorial Android apps - Proguard was the tool used in olden days and has now been replaced by Google developed R8 optimizer/minifier.