package com.handmobi.smali;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
/**
* 对分dex的简单实现思路
* @author dev-android
*
*/
public class SplitDexUtil {
// private static int maxFuncNum = 65535;//一个dex最大的文件数
private static int maxFuncNum = 1000;//一个dex最大的文件数
private static int apkAllMethodNum = 0;
private static boolean isDoSplit;
/**
* 当方法数过多的时候进而分dex
* @param filePath
* @throws Exception
*/
public static void splitDex(String filePath) throws Exception{
List<File> fileList = new ArrayList<File>();
File file = new File(filePath);
File[] files = file.listFiles();// 获取目录下的所有文件或文件夹
if (files == null) {// 如果目录为空,直接退出
return;
}
// 遍历,目录下的所有文件
for (File f : files) {
if (f.isFile()) {
// fileList.add(f);
if(!isDoSplit){
apkAllMethodNum += getFunNum(f);
System.out.println(f.getAbsolutePath()+"====1111111====="+apkAllMethodNum);
if(apkAllMethodNum >= maxFuncNum){
isDoSplit = true;
}
}
if(isDoSplit){
System.out.println(f.getAbsolutePath()+"====2222222222====="+apkAllMethodNum);
cutFile(f);
}
} else if (f.isDirectory()) {
splitDex(f.getAbsolutePath());
}
}
}
/**
* 获取文件的方法数。
* @param file
* @return
* @throws Exception
*/
public static int getFunNum(File file) throws Exception{
int methodNum = 0;
FileReader fr=new FileReader(file);
BufferedReader br=new BufferedReader(fr);
String line="";
String[] arrs=null;
while ((line=br.readLine())!=null) {
if(line.startsWith(".method")){
++methodNum;
}
}
br.close();
fr.close();
return methodNum;
}
/**
* 剪切文件到另一个目录下
* @param inFile
* @throws Exception
*/
public static void cutFile(File inFile) throws Exception{
File outFile = new File(inFile.getAbsolutePath().toString().replace("demo\\smali", "demo\\smali-class2"));
outFile.getParentFile().mkdirs();
outFile.createNewFile();
FileOutputStream fileOutputStream = null;
InputStream inputStream = null;
byte[] bytes = new byte[1024];
int temp = 0;
try {
inputStream = new FileInputStream(inFile);
fileOutputStream = new FileOutputStream(outFile);
while((temp = inputStream.read(bytes)) != -1){
fileOutputStream.write(bytes, 0, temp);
fileOutputStream.flush();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}finally{
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fileOutputStream != null) {
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
inFile.deleteOnExit();
}
}
public static void main(String[] args) {
try {
splitDex("D:\\workspace\\android_channel_package\\TestBase64\\demo\\smali");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}