curl https://raw.githubusercontent.com/jewelshkjony/Enhancer/2.0.0/install.sh -fsSL | sh
To run Enhancer write chmod +x Enhancer.sh on terminal.
Quick start
Now, that you've installed Enhancer, let's try this tool.
Open the terminal and write Enhancer.
This will show you some prompts.
Enter apk path: Set the path of the apk or drag the apk file here.
Enter keystore path: Set the keystore path or drag the keystore file here. Enhancer tool will use this keystore file to sign your apk.
Want to change SDK version? Y/N: Write Y if you want to change targetSdkVersion. If you've entered Y then it'll ask for enter compileSdkVersion & compileSdkVersionCodeName.
Want to inject assets? Y/N : If you want to inject assets file so write Y now it'll ask for the directory path of asstes files.
Want to inject native libraries? Y/N : If you want to inject (.so) native libraries so write Y now it'll ask for the directory path of native libraries.
Want to inject dex files? Y/N : If you want to inject .dex files so write Y now it'll ask for the path of dex file. If you want to inject multiple files, separate the paths with commas.
Want to inject extra resources? Y/N : If you want to inject any additional resources so write Y now it'll ask for resources directory path. It'll follow the name of directory to inject. If you want to inject multiple directory, separate the directory paths with commas.
Want to inject manifest.xml? Y/N : If you want to inject AndroidManifest.xml write Y and set the path of Manifest.xml.
If you only want to sign the apk and don't want to inject anything so write N on every prompts. So the tool will skip the injecting process. When you're only signing the apk so the output apk will override the origianl apk. And if you're injecting assets or native (.so) libraries so the tool will provide a new apk (originalApk-enhanced.apk).
That's it, now you can install the generated apk.
GitHub Repository
Stay updated with this repository for updates.
Support Me
If you like my work you can support me here. Your support will motivate me to do better.
Are there any major differences/advantages to my approach here in which the Manifest (targetSdkVersion, compileSdkVersion and minSdkVersion) can of course be adjusted and the app can be re-signed?
I got following error while injecting so libraries
Enter apk path: C:\Users\Admin\Desktop\op.apk
Enter keystore path: C:\Users\Admin\Desktop\android.keystore
Want to change SDK version? Y/N N
Want to inject assets? Y/N N
Want to inject native libraries? Y/N Y
Enter native directory path: C:\Users\Admin\Desktop\lib
Want to inject dex files? Y/N N
Want to inject extra resources? Y/N N
Want to inject manifest.xml? Y/N N
Parsing the apk: op.apk
Injecting native libraries ...
Repackaging the apk: op-enhanced.apk
Signing the apk: op-enhanced.apk
source:
C:\Users\Admin\Desktop
binary-lib/windows-33_0_2/libwinpthread-1.dll
C:\Users\Admin\AppData\Local\Temp\uapksigner-8726360327245833613
zipalign location: BUILT_IN
C:\Users\Admin\AppData\Local\Temp\uapksigner-8726360327245833613\win-zipalign_33_0_2.exe545304544827708006.tmp
keystore:
[0] 87511fc6 C:\Users\Admin\Desktop\android.keystore (RELEASE_CUSTOM)
Failed to load signer "signer #1"
java.io.IOException: Invalid keystore format
at sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:663)
at sun.security.provider.JavaKeyStore$JKS.engineLoad(JavaKeyStore.java:56)
at sun.security.provider.KeyStoreDelegator.engineLoad(KeyStoreDelegator.java:224)
at sun.security.provider.JavaKeyStore$DualFormatJKS.engineLoad(JavaKeyStore.java:70)
at java.security.KeyStore.load(KeyStore.java:1445)
at com.android.apksigner.SignerParams.loadKeyStoreFromFile(Unknown Source)
at com.android.apksigner.SignerParams.loadPrivateKeyAndCertsFromKeyStore(Unknown Source)
at com.android.apksigner.SignerParams.loadPrivateKeyAndCerts(Unknown Source)
at com.android.apksigner.ApkSignerTool.getSignerConfig(Unknown Source)
at com.android.apksigner.ApkSignerTool.sign(Unknown Source)
at com.android.apksigner.ApkSignerTool.main(Unknown Source)
at at.favre.tools.apksigner.SignTool.sign(Unknown Source)
at at.favre.tools.apksigner.SignTool.execute(Unknown Source)
at at.favre.tools.apksigner.SignTool.mainExecute(Unknown Source)
at at.favre.tools.apksigner.SignTool.main(Unknown Source)
at com.jewel.enhancer.Signer.sign(Unknown Source)
at com.jewel.enhancer.Enhancer.backgroundTask(Unknown Source)
at com.jewel.enhancer.Enhancer.lambda$main$0(Unknown Source)
at java.lang.Thread.run(Thread.java:748)