Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2057)

Unified Diff: apk/hijack/org/chromium/deconstructed/NativeInstaller.java

Issue 949803002: Deconstructed APK prototyping Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: apk/hijack/org/chromium/deconstructed/NativeInstaller.java
diff --git a/apk/hijack/org/chromium/deconstructed/NativeInstaller.java b/apk/hijack/org/chromium/deconstructed/NativeInstaller.java
new file mode 100644
index 0000000000000000000000000000000000000000..9663ade94d11d3eb982feccde9f87e66d29fe15f
--- /dev/null
+++ b/apk/hijack/org/chromium/deconstructed/NativeInstaller.java
@@ -0,0 +1,75 @@
+package org.chromium.deconstructed;
+
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.util.Log;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.lang.reflect.InvocationTargetException;
+
+public class NativeInstaller {
+ private static final String TAG = "org.chromium.deconstructed.NativeInstaller";
+ private static final String NATIVE_LIB_DIR_NAME =
+ "code_cache" + File.separator + "lib";
+
+ public static void install(Context context, File nativeDir)
+ throws IOException, NoSuchFieldException {
+ File[] nativeLibs = nativeDir.listFiles();
+ for (File f : nativeLibs) {
+ if (!isValidLib(f)) {
+ return;
+ }
+ }
+ ApplicationInfo appInfo = context.getApplicationInfo();
+ File installDir = new File(appInfo.dataDir, NATIVE_LIB_DIR_NAME);
+ installDir.mkdirs();
+ android.util.Log.e(TAG, installDir.toString());
+ for (File f : nativeLibs) {
+ File e = new File(installDir, f.getName());
+ copyFile(f, e);
+ e.setExecutable(true);
+ }
+
+ injectNativeLibDir(context.getClassLoader(), installDir);
+ }
+
+ private static boolean isValidLib(File f) {
+ // TODO
+ return true;
+ }
+
+ private static void copyFile(File in, File out) throws IOException {
+ InputStream src = null;
+ OutputStream dst = null;
+ try {
+ src = new FileInputStream(in);
+ dst = new FileOutputStream(out);
+ byte[] buf = new byte[1 << 14]; // 16k
+ int len;
+ while ((len = src.read(buf)) > 0) {
+ dst.write(buf, 0, len);
+ }
+ } finally {
+ // TODO: blegh
+ if (src != null) {
+ src.close();
+ }
+ if (dst != null) {
+ dst.close();
+ }
+ }
+
+ }
+
+ private static void injectNativeLibDir(ClassLoader loader, File nativeLibDir) throws NoSuchFieldException {
+ Object dexPathList = Reflect.getField(loader, "pathList");
+ Object[] currentDirs = (Object[]) Reflect.getField(dexPathList, "nativeLibraryDirectories");
+ Object[] newDirs = new Object[] {nativeLibDir};
+ Reflect.setField(dexPathList, "nativeLibraryDirectories", Reflect.concatArrays(currentDirs, newDirs));
+ }
+}
« no previous file with comments | « apk/hijack/org/chromium/deconstructed/JavaInstaller.java ('k') | apk/hijack/org/chromium/deconstructed/Reflect.java » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698