io.github.bunnyblue.droidfix.classcomputer.proguard.MappingMapper.java Source code

Java tutorial

Introduction

Here is the source code for io.github.bunnyblue.droidfix.classcomputer.proguard.MappingMapper.java

Source

/*
 * DroidFix Project
 * file MappingMapper.java  is  part of DroidFix
 * The MIT License (MIT)  Copyright (c) 2015 Bunny Blue.
 *
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 *
 *
 */

package io.github.bunnyblue.droidfix.classcomputer.proguard;

/**
 * Created by BunnyBlue on 11/11/15.
 */
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;

import java.util.List;

import io.github.bunnyblue.droidfix.classcomputer.cache.Configure;
import io.github.bunnyblue.droidfix.classcomputer.cache.HashUtil;
import io.github.bunnyblue.droidfix.classcomputer.classes.ClassObject;
import org.apache.commons.io.FileUtils;

public class MappingMapper {

    HashMap<String, String> hashtable = new HashMap<>();

    //   HashMap<K, V>
    public void produce(String path) {
        try {
            Collection<String> lines = FileUtils.readLines(new File(path));
            for (String string : lines) {//android.support.design.internal.NavigationMenuPresenter -> android.support.design.internal.b:
                if (string.contains(" -> ") && string.endsWith(":")) {
                    String originClass = string.substring(0, string.indexOf(" ")).replaceAll(" ", "");
                    String proguardClass = string.substring(string.lastIndexOf(" "), string.length() - 1)
                            .replaceAll(" ", "");
                    hashtable.put(proguardClass, originClass);
                }
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    public ArrayList<ClassObject> processRawClasses() {
        ArrayList<ClassObject> cacheClasses = new ArrayList<ClassObject>();
        produce(Configure.getInstance().getPatchMapping());
        File pathRoot = new File(Configure.getInstance().getTransformedClassDir());

        Collection<File> clses = FileUtils.listFiles(pathRoot, new String[] { "class" }, true);
        for (File file : clses) {
            String path = file.getAbsolutePath();
            String md5 = HashUtil.getClassMd5(path);

            String tmp = "classes" + File.separator + "debug";
            path = path.replaceAll(pathRoot.getAbsolutePath(), "");
            path = path.substring(1, path.indexOf(".class"));
            String classname = path.replaceAll(File.separator, ".");
            ClassObject classObject = new ClassObject(md5, classname);
            classObject.setProguardedClassName(hashtable.get(classname));
            classObject.setLocalPath(file.getAbsolutePath());
            cacheClasses.add(classObject);

        }
        int index = 0;
        for (ClassObject file : cacheClasses) {
            index++;
            //System.out.println(file.toString()+index);
        }
        return cacheClasses;

    }

    public void writeNewClassCache(ArrayList<ClassObject> cacheClasses) {

        Collections.sort(cacheClasses);
        ArrayList<String> md5s = new ArrayList<String>();

        for (ClassObject classObject : cacheClasses) {
            StringBuffer stringBuffer = new StringBuffer();
            stringBuffer.append(classObject.getClassName());
            stringBuffer.append(" ");
            stringBuffer.append(classObject.getMd5());
            md5s.add(stringBuffer.toString());

        }
        try {
            FileUtils.writeLines(new File(Configure.getInstance().getPatchClassMD5()), md5s);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    public ArrayList<ClassObject> computeDiffObject() {
        ArrayList<ClassObject> diffClass = new ArrayList<ClassObject>();
        ArrayList<ClassObject> mClassMappings = processRawClasses();//class
        ArrayList<ClassObject> cacheClasses = readCacheClasses();//
        for (ClassObject classObject : mClassMappings) {

            boolean isNewClass = true;
            for (ClassObject classObjectCache : cacheClasses) {
                if (classObject.getClassName().equals(classObjectCache.getClassName())) {
                    isNewClass = false;
                    if (!classObject.getMd5().equals(classObjectCache.getMd5())) {
                        diffClass.add(classObject);
                    }
                    break;

                }
            }
            if (isNewClass) {
                diffClass.add(classObject);//

            }
        }
        DiffClassUtil.copyDiffClasses(diffClass, Configure.getInstance().getDiffClassesDir());
        return diffClass;

    }

    public ArrayList<ClassObject> readCacheClasses() {
        ArrayList<ClassObject> cacheClasses = new ArrayList<ClassObject>();
        File cache = new File(Configure.getInstance().getPatchClassMD5());
        try {
            List<String> caches = FileUtils.readLines(cache);
            for (String string : caches) {
                String[] maps = string.split(" ");
                ClassObject classObject = new ClassObject(maps[1], maps[0]);
                cacheClasses.add(classObject);
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return cacheClasses;
    }

}