Last active
May 5, 2016 08:17
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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