Skip to content

Instantly share code, notes, and snippets.

@VladSumtsov
Last active May 5, 2016 08:17
Show Gist options
  • Save VladSumtsov/63e684a4524489b8eb5b5240a1cf2c86 to your computer and use it in GitHub Desktop.
Save VladSumtsov/63e684a4524489b8eb5b5240a1cf2c86 to your computer and use it in GitHub Desktop.
Android. Gradle. Change the package of the classes. Manifest, customviews, custom prefereces - all these xmls will be changed too. Only thing you have todo, enable your proguard and add "-applymapping ./build/mapping.txt" to your proguard. Also change "somepackage" and "targetpackage" to yours
android.applicationVariants.all { variant ->
File mappingFile = file("${buildDir}/mapping.txt")
if (variant.getBuildType().isMinifyEnabled()) {
variant.mergeResources.doLast {
if (!mappingFile.exists()) mappingFile.createNewFile()
println "minify replacePackageInResources"
replaceResources(variant, "com.somepackage", "com.targetpackage")
replaceResources(variant, "com.somepackage2", "com.targetpackage2")
}
variant.assemble.doLast {
if (!mappingFile.exists()) mappingFile.createNewFile()
println "minify printMappingFile"
String text = mappingFile.getText('UTF-8')
boolean rebuild = text.trim().isEmpty()
replacePackage(variant, "com.somepackage", "com.targetpackage")
replacePackage(variant, "com.somepackage2", "com.targetpackage2")
if (rebuild || !text.equals(mappingFile.getText('UTF-8'))) {
File[] files = file("${buildDir}").listFiles()
for (File file : files) {
if (file.name.contains("mapping")) continue;
GFileUtils.deleteDirectory(file)
}
throw new GradleException('Rebuild project')
}
}
variant.outputs.each { output ->
output.processManifest.doLast {
if (!mappingFile.exists()) mappingFile.createNewFile()
println "minify replacePackagesInManifest"
replaceManifest(output, "com.somepackage", "com.targetpackage")
replaceManifest(output, "com.somepackage2", "com.targetpackage2")
}
}
}
}
def replacePackage(variant, String currentPackage, String targetPackage) {
//Copy classes by generating proguard mapping file.
File mappingFile = file("${buildDir}/mapping.txt")
File generatedMappingFile = file("${buildDir}/outputs/mapping/${variant.dirName}/mapping.txt")
if (!generatedMappingFile.exists()) return;
String generatedMap = generatedMappingFile.getText('UTF-8')
Pattern pattern = Pattern.compile("(" + currentPackage + ".*?) -> .*?:")
Matcher m = pattern.matcher(generatedMap)
StringBuilder b = new StringBuilder(mappingFile.getText('UTF-8'));
while (m.find()) {
def pack = m.group(1)
def targetPack = pack.replaceAll(currentPackage, targetPackage)
if (b.contains(pack)) continue;
b.append(pack).append(" -> ").append(targetPack).append(":\n")
}
mappingFile.write(b.toString(), 'UTF-8')
}
def replaceResources(variant, String currentPackage, String targetPackage) {
//Rename packages in layouts
replaceRes(variant, currentPackage, targetPackage, "layout")
replaceRes(variant, currentPackage, targetPackage, "menu")
replaceRes(variant, currentPackage, targetPackage, "xml")
}
def replaceRes(variant, String currentPackage, String targetPackage, String fileName) {
File valuesFile = file("${buildDir}/intermediates/res/merged/${variant.dirName}/${fileName}")
for (File file : valuesFile.listFiles()) {
String content = file.getText('UTF-8')
content = content.replaceAll(currentPackage, targetPackage)
file.write(content, 'UTF-8')
}
}
def replaceManifest(variant, String currentPackage, String targetPackage) {
println "replaceManifest"
//Rename packages in manifest
File valuesFile = file("${buildDir}/intermediates/manifests/full/${variant.dirName}/AndroidManifest.xml")
String content = valuesFile.getText('UTF-8')
Pattern pattern = Pattern.compile("<application.*?</application>", Pattern.DOTALL | Pattern.MULTILINE)
Matcher matcher = pattern.matcher(content)
if (matcher.find()) {
String application = matcher.group()
application = application.replaceAll(currentPackage, targetPackage)
content = pattern.matcher(content).replaceAll(application);
valuesFile.write(content, 'UTF-8')
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment