My app using some jar libs with too many methods, but in fact used only 2-3 methods from this libs. Total size of this libs more than 2Mb. I don't need all of it and i want to shrink my apk with ProGuard.
I need to enable ProGuard and configure it only for remove unused code and shrink apk size. but I don't know how. I don't want to obfuscate my app and etc. only shrink final size.
I try to enable proguard by
minifyEnabled true
but it got only errors and nothing.
To only shrink your application you should do the following:
release {
proguardFile getDefaultProguardFile('proguard-android.txt')
proguardFile 'proguard-shrink-only.txt'
proguardFile 'proguard-project.txt'
}
The proguard-shrink-only.txt should contain the following options:
-dontobfuscate
-dontoptimize
The proguard-project.txt should contain your project specific keep rules that might be needed for classes that are used via reflection.
Related
I have an empty project (no classes whatsoever, no activities), only a dependency to com.google.android.material:material:1.3.0 for the code to compile (there is a style defined which uses this).
I enabled shrinking option, yet, after generating the signes APK, there is a classes.dex file in the apk with a shitload of code, even though the app has no code. Why and how to I get rid of those, to make sure the apk contains only what is needed, no extra bloatware? Thank you.
This is the expanded apk:
For code shrinking please turn on Proguard and you have the option to customized Proguard rules as you need.
buildTypes {
release {
shrinkResources true
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
}
}
TRY 1
Open .jar file (appodeal.jar) and remove all .dex files.
TRY 2
Use the built-in inspection Java | Declaration redundancy | Unused declaration.
To run it on whole project go to Analyze -> Run inspection by name..., type Unused declaration and select desired scope. Then carefully check output and mark some classes as entry points if needed.
Select Unused declaration node in list and perform Safe delete action on all unused declarations at once.
I want to optimize my app size.For that,I want to analyze my app with android studio analyze apk tool.But it only show the file size not details report.
Please see https://medium.com/#arungiri.10/managing-application-size-50810d03b16c for detailed info.
Use below lines to enable app shrinking using R8.
buildTypes {
...
release {
...
useProguard false
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
...
}
}
where proguard-rules.pro must be written by you based on your app. Generally this file contains lines of code to not obfuscate data / model classes.
Once you do this, a APK will be generated in the output/release directory. Use that APK in APK analyzer tool.
As we can see the data present inside a APK below.
If you click on classes.dex, it would show the classes present inside this dex file.
As you can see, the code is proguarded, you will also get option to add respective mapping.txt file which would help in reverse engineering and see the APK package data.
mapping.txt file is auto-generated and is present under outputs/mapping/release/. Use this to reverse engineer and see the actual class names.
Also, to add proguard rules for data classes, it's easy. Just select the class or package you want to keep from proguarding, right click on it and select "Generate Proguard Keep rule" as shown below.
Proguard rules will be auto generated, copy this and put it in above proguard-rules.pro file.
Hope this answer helps.
in the build.gradle file i set the minifyEnabled to be true as shown in the code below. my question is how can i see the effect of this statement? or in other words, as i am trying to minify the code and obfuscating it,
where can i see the code minified and obfuscated where is the result of this statement.
build.gradle:
buildTypes {
debug {
debuggable true
}
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
The probably easiest way to verify that shrinking and obfuscation has been applied to your project is to check for the existence of the mapping file.
When ProGuard is executed during the android build using gradle, the following files are generated automatically (located in build/outputs/mapping/<buildtype>/):
mapping.txt: contains the mapping from original class / class member names to obfuscated ones
seeds.txt: contains the seeds that were used during shrinking, i.e. the classes / class members specified in -keep rules
usage.txt: contains the removed classes during shrinking
With the presence and contents of these files you can verify that ProGuard was executed correctly.
You can check it in simple way, just extract your apk, decompile .dex files and look at decompile sources.
Obfuscated code should have changed classes, functions, variables names.
Here is insightful post about how to do it.
I am using Android Studio version v2.1.2 and Proguard doesn't work when I try to sign the release build, the build fails dramatically.
According to this link from developer docs Jack does obfuscation automatically.
Handles shrinking, obfuscation, repackaging and multidex Using a
separate package such as ProGuard is no longer necessary.
I had to disable minifyEnabled flag and remove the line where we load proguard file; to get it working, after doing this; I inspected the apk file generated by doing the above and I cannot tell whether Jack really obfuscated and reduced redundant code as the release apk size is same as the debug apk size.
I need to understand how to make obfuscation work with the newer compiler as the documentation doesn't really help.
I am looking forward to understand the following questions.
Does Jack work without Proguard file?
Is there a way to specify Proguard file?
The Jack compiler has its own Shrinker and Obfuscator that re-uses existing Proguard rules (see supported directives).
The configuration should be the same as before, so you need to add the following to your buildType configuration:
minifyEnabled true
proguardFile getDefaultProguardFile('proguard-android.txt')
proguardFile 'your-proguard-file.txt'
ProGuard is not doing a very complete job of obfuscating my Android project. When I decompile my apk at decompileandroid.com I see that it is only changing the name of local temporary variables and nothing else. It is not changing class names, variable names, method names, or anything else.
After reading the manual all of the optional commands seem to be telling it NOT to do something so I am left to think it should obfuscate everything by default.
my build.gradle has the following...
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
Neither of those two files exist is the project. The project is as it was converted from Eclipse by Android Studio.
What am I missing. Do I need to create those two files and put some proguard parameters in them - if so what. I want maximum obfuscation.
Thanks,
Dean
Set minifyEnabled true in order to turn on code shrinking, and
then shrinkResources true to turn on resource shrinking.
Reference for the quote