//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);}