Skip to content

Commit

Permalink
Android Tricks
Browse files Browse the repository at this point in the history
Sentient Android Dalvik Runtime Defining ClassLoader
  • Loading branch information
hypersoft committed May 1, 2019
1 parent c7a381a commit 59b4782
Show file tree
Hide file tree
Showing 10 changed files with 20 additions and 279 deletions.
1 change: 1 addition & 0 deletions .idea/artifacts/Libraries.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Binary file added module/dalvik/rhino-android-1.5-sources.jar
Binary file not shown.
Binary file added module/dalvik/rhino-android-1.5.jar
Binary file not shown.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -1,14 +1,21 @@
package box.star.js.android;

import org.mozilla.javascript.Context;

import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

public class Android {

private static boolean tryDalvik = true;
private static Class dalvikClassLoader;
private static Constructor<ClassLoader> dalvikConstructor;

public static boolean isNotLoaded(){
return dalvikConstructor == null;
}

public static boolean isPlatform(){
if (tryDalvik) {
try {
Expand All @@ -24,16 +31,14 @@ public static boolean isPlatform(){
return dalvikConstructor != null;
}

public static ClassLoader getDalvikClassLoader(String path, ClassLoader parent) throws ClassNotFoundException {
if (isPlatform()){
try { return dalvikConstructor.newInstance(path, parent); }
catch (Exception e) { throw new RuntimeException(e); }
}
throw new ClassNotFoundException("dalvik.system.PathClassLoader");
}

public static File getApplicationCacheDirectory(){
return new File(System.getProperty("java.io.tmpdir"));
public static Context init() {
try {
Class rhinoHelper = Class.forName("com.faendir.rhino_android.RhinoAndroidHelper");
Constructor<?> constructor = rhinoHelper.getConstructor();
Object rh = constructor.newInstance();
Method m = rhinoHelper.getDeclaredMethod("enterContext");
return (Context) m.invoke(rh);
} catch (Exception e) {throw new RuntimeException(e);}
}

}

This file was deleted.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
import java.util.jar.Attributes;
import java.util.jar.Manifest;

import box.star.js.android.Android;
import org.mozilla.javascript.ast.AstRoot;
import org.mozilla.javascript.ast.ScriptNode;
import org.mozilla.javascript.debug.DebuggableScript;
Expand Down Expand Up @@ -410,6 +411,7 @@ public static Context getCurrentContext()
*/
public static Context enter()
{
if (Android.isNotLoaded() && Android.isPlatform())return Android.init();
return enter(null);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,52 +4,34 @@

package org.mozilla.javascript;

import box.star.js.android.DexFileClassLoader;
import box.star.js.android.Android;

/**
* Load generated classes.
*
* @author Norris Boyd
* Android Support:
* @author Triston-Jerard: Taylor
*/
public class DefiningClassLoader extends ClassLoader
implements GeneratedClassLoader
{

private static DexFileClassLoader dexLoader;

public DefiningClassLoader() {
this(DefiningClassLoader.class.getClassLoader());

}

public DefiningClassLoader(ClassLoader parentLoader) {
if (Android.isPlatform() && dexLoader == null){
dexLoader = new DexFileClassLoader(parentLoader);
}
this.parentLoader = parentLoader;
}

public Class<?> defineClass(String name, byte[] data) {
// Use our own protection domain for the generated classes.
// TODO: we might want to use a separate protection domain for classes
// compiled from scripts, based on where the script was loaded from.
if (dexLoader != null){
return dexLoader.defineClass(name, data);
}
return super.defineClass(name, data, 0, data.length,
SecurityUtilities.getProtectionDomain(getClass()));
}

public void linkClass(Class<?> cl) {
if (dexLoader != null){
return;
}
resolveClass(cl);
}

Expand All @@ -58,10 +40,6 @@ public Class<?> loadClass(String name, boolean resolve)
throws ClassNotFoundException
{

if (dexLoader != null) {
return dexLoader.loadClass(name, resolve);
}

Class<?> cl = findLoadedClass(name);
if (cl == null) {
if (parentLoader != null) {
Expand Down

0 comments on commit 59b4782

Please sign in to comment.