package com.weishu.upf.hook_classloader;
import java.io.Closeable;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import android.content.Context;
import android.content.res.AssetManager;
/**
* @author weishu
* @date 16/3/29
*/
public class Utils {
/**
* 把Assets里面得文件复制到 /data/data/files 目录下
*
* @param context
* @param sourceName
*/
public static void extractAssets(Context context, String sourceName) {
AssetManager am = context.getAssets();
InputStream is = null;
FileOutputStream fos = null;
try {
is = am.open(sourceName);
File extractFile = context.getFileStreamPath(sourceName);
fos = new FileOutputStream(extractFile);
byte[] buffer = new byte[1024];
int count = 0;
while ((count = is.read(buffer)) > 0) {
fos.write(buffer, 0, count);
}
fos.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
closeSilently(is);
closeSilently(fos);
}
}
/**
* 待加载插件经过opt优化之后存放odex得路径
*/
public static File getPluginOptDexDir(String packageName) {
return enforceDirExists(new File(getPluginBaseDir(packageName), "odex"));
}
/**
* 插件得lib库路径, 这个demo里面没有用
*/
public static File getPluginLibDir(String packageName) {
return enforceDirExists(new File(getPluginBaseDir(packageName), "lib"));
}
// --------------------------------------------------------------------------
private static void closeSilently(Closeable closeable) {
if (closeable == null) {
return;
}
try {
closeable.close();
} catch (Throwable e) {
// ignore
}
}
private static File sBaseDir;
// 需要加载得插件得基本目录 /data/data/<package>/files/plugin/
private static File getPluginBaseDir(String packageName) {
if (sBaseDir == null) {
sBaseDir = UPFApplication.getContext().getFileStreamPath("plugin");
enforceDirExists(sBaseDir);
}
return enforceDirExists(new File(sBaseDir, packageName));
}
private static synchronized File enforceDirExists(File sBaseDir) {
if (!sBaseDir.exists()) {
boolean ret = sBaseDir.mkdir();
if (!ret) {
throw new RuntimeException("create dir " + sBaseDir + "failed");
}
}
return sBaseDir;
}
}