//asset中加密的apk文件重命名为index.html,拷贝到私有目录
//解密
//加载,执行apk中的方法
public static void handleByJava(Context context){
File copyedFile = new File(context.getFilesDir().getAbsolutePath() + "/" + "main.html");
FileUtil.copyAssetFile(context, "index.html", copyedFile.getAbsolutePath());
FileUtil.customDecryptFile(copyedFile, context.getFilesDir().toString(), "home.html", "android");
String apkPath = new File(context.getFilesDir()+"/"+"home.html").getAbsolutePath();
DexClassLoader classLoader = new DexClassLoader(apkPath, context.getFilesDir().getAbsolutePath(), null, context.getClassLoader());
if(new File(apkPath).exists()){
Log.e("xxx",apkPath+"存在");
}
try {
// 加载指定的类
Class<?> clazz = classLoader.loadClass("com.example.myapplication.Heave");
// 创建类的实例
Object heave = clazz.newInstance();
Method method = clazz.getMethod("initAF",android.content.Context.class);
method.invoke(heave,context);
} catch (Exception e) {
e.printStackTrace();
}
}
//拷贝asset文件到私有目录
public static void copyAssetFile(Context context, String assetFileName, String destinationPath) {
AssetManager assetManager = context.getAssets();
InputStream inputStream = null;
OutputStream outputStream = null;
try {
inputStream = assetManager.open(assetFileName);
File destinationFile = new File(destinationPath);
if (!destinationFile.exists()) {
destinationFile.createNewFile();
}
outputStream = new FileOutputStream(destinationFile);
byte[] buffer = new byte[1024];
int read;
while ((read = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, read);
}
outputStream.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static File customEncryptFile(File sourceFile, String dir, String toFileName, String secretKey){
try {
// 创建加密后的文件
File encryptFile = new File(dir, toFileName);
FileInputStream inputStream = new FileInputStream(sourceFile);
// 根据文件创建输出流
FileOutputStream outputStream = new FileOutputStream(encryptFile);
// 创建缓存字节数组
byte[] buffer = new byte[1024 * 2];
// 读取
int len;
// 读取加密并写入文件
while ((len = inputStream.read(buffer)) != -1) {
outputStream.write(buffer,0 , len);
outputStream.write(secretKey.getBytes());
outputStream.flush();
}
closeStream(outputStream);
return encryptFile;
} catch (Exception e) {
handleException(e);
}
return null;
}
public static File customDecryptFile(File sourceFile, String dir, String toFileName, String secretKey) {
try {
File decryptFile = new File(dir, toFileName);
if(decryptFile.exists()){
decryptFile.delete();
}
FileInputStream inputStream = new FileInputStream(sourceFile);
// 获取解密输出流
FileOutputStream outputStream = new FileOutputStream(decryptFile);
int length= secretKey.getBytes().length;
byte[] buffer = new byte[1024 * 2+ length];
int len;
while ((len = inputStream.read(buffer)) >= 0) {
outputStream.write(buffer,0 , len-length);
outputStream.flush();
}
outputStream.close();
closeStream(inputStream);
return decryptFile;
} catch (IOException e) {
handleException(e);
}
return null;
}
private static void closeStream(Closeable closeable) {
try {
if (closeable != null) closeable.close();
} catch (Exception e) {
handleException(e);
}
}
private static void handleException(Exception e) {
e.printStackTrace();
Log.e(TAG, TAG + e);
}