Loading core/java/android/os/GraphicsEnvironment.java +38 −2 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package android.os; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.res.AssetFileDescriptor; import android.content.res.AssetManager; import android.opengl.EGL14; import android.os.Build; Loading @@ -30,6 +31,7 @@ import dalvik.system.VMRuntime; import java.io.BufferedReader; import java.io.File; import java.io.FileDescriptor; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; Loading @@ -54,6 +56,7 @@ public class GraphicsEnvironment { private static final String PROPERTY_GFX_DRIVER_WHITELIST = "ro.gfx.driver.whitelist.0"; private static final String ANGLE_PACKAGE_NAME = "com.android.angle"; private static final String GLES_MODE_METADATA_KEY = "com.android.angle.GLES_MODE"; private static final String ANGLE_RULES_FILE = "a4a_rules.json"; private ClassLoader mClassLoader; private String mLayerPath; Loading Loading @@ -250,8 +253,40 @@ public class GraphicsEnvironment { if (DEBUG) Log.v(TAG, "ANGLE package libs: " + paths); // Pass the rules file to loader for ANGLE decisions AssetManager angleAssets = null; try { angleAssets = context.getPackageManager().getResourcesForApplication(angleInfo).getAssets(); } catch (PackageManager.NameNotFoundException e) { Log.w(TAG, "Failed to get AssetManager for '" + ANGLE_PACKAGE_NAME + "'"); return; } AssetFileDescriptor assetsFd = null; try { assetsFd = angleAssets.openFd(ANGLE_RULES_FILE); } catch (IOException e) { Log.w(TAG, "Failed to get AssetFileDescriptor for " + ANGLE_RULES_FILE + " from " + "'" + ANGLE_PACKAGE_NAME + "'"); return; } FileDescriptor rulesFd = null; long rulesOffset = 0; long rulesLength = 0; if (assetsFd != null) { rulesFd = assetsFd.getFileDescriptor(); rulesOffset = assetsFd.getStartOffset(); rulesLength = assetsFd.getLength(); } else { Log.w(TAG, "Failed to get file descriptor for " + ANGLE_RULES_FILE); return; } // Further opt-in logic is handled in native, so pass relevant info down setAngleInfo(paths, packageName, appPref, devOptIn); setAngleInfo(paths, packageName, appPref, devOptIn, rulesFd, rulesOffset, rulesLength); } /** Loading Loading @@ -391,5 +426,6 @@ public class GraphicsEnvironment { private static native void setDebugLayers(String layers); private static native void setDriverPath(String path); private static native void setAngleInfo(String path, String appPackage, String appPref, boolean devOptIn); boolean devOptIn, FileDescriptor rulesFd, long rulesOffset, long rulesLength); } core/jni/android_os_GraphicsEnvironment.cpp +7 −3 Original line number Diff line number Diff line Loading @@ -32,12 +32,16 @@ void setDriverPath(JNIEnv* env, jobject clazz, jstring path) { android::GraphicsEnv::getInstance().setDriverPath(pathChars.c_str()); } void setAngleInfo_native(JNIEnv* env, jobject clazz, jstring path, jstring appName, jstring appPref, jboolean devOptIn) { void setAngleInfo_native(JNIEnv* env, jobject clazz, jstring path, jstring appName, jstring appPref, jboolean devOptIn, jobject rulesFd, jlong rulesOffset, jlong rulesLength) { ScopedUtfChars pathChars(env, path); ScopedUtfChars appNameChars(env, appName); ScopedUtfChars appPrefChars(env, appPref); int rulesFd_native = jniGetFDFromFileDescriptor(env, rulesFd); android::GraphicsEnv::getInstance().setAngleInfo(pathChars.c_str(), appNameChars.c_str(), appPrefChars.c_str(), devOptIn); appPrefChars.c_str(), devOptIn, rulesFd_native, rulesOffset, rulesLength); } void setLayerPaths_native(JNIEnv* env, jobject clazz, jobject classLoader, jstring layerPaths) { Loading @@ -57,7 +61,7 @@ void setDebugLayers_native(JNIEnv* env, jobject clazz, jstring layers) { const JNINativeMethod g_methods[] = { { "getCanLoadSystemLibraries", "()I", reinterpret_cast<void*>(getCanLoadSystemLibraries_native) }, { "setDriverPath", "(Ljava/lang/String;)V", reinterpret_cast<void*>(setDriverPath) }, { "setAngleInfo", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)V", reinterpret_cast<void*>(setAngleInfo_native) }, { "setAngleInfo", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLjava/io/FileDescriptor;JJ)V", reinterpret_cast<void*>(setAngleInfo_native) }, { "setLayerPaths", "(Ljava/lang/ClassLoader;Ljava/lang/String;)V", reinterpret_cast<void*>(setLayerPaths_native) }, { "setDebugLayers", "(Ljava/lang/String;)V", reinterpret_cast<void*>(setDebugLayers_native) }, }; Loading Loading
core/java/android/os/GraphicsEnvironment.java +38 −2 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package android.os; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.res.AssetFileDescriptor; import android.content.res.AssetManager; import android.opengl.EGL14; import android.os.Build; Loading @@ -30,6 +31,7 @@ import dalvik.system.VMRuntime; import java.io.BufferedReader; import java.io.File; import java.io.FileDescriptor; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; Loading @@ -54,6 +56,7 @@ public class GraphicsEnvironment { private static final String PROPERTY_GFX_DRIVER_WHITELIST = "ro.gfx.driver.whitelist.0"; private static final String ANGLE_PACKAGE_NAME = "com.android.angle"; private static final String GLES_MODE_METADATA_KEY = "com.android.angle.GLES_MODE"; private static final String ANGLE_RULES_FILE = "a4a_rules.json"; private ClassLoader mClassLoader; private String mLayerPath; Loading Loading @@ -250,8 +253,40 @@ public class GraphicsEnvironment { if (DEBUG) Log.v(TAG, "ANGLE package libs: " + paths); // Pass the rules file to loader for ANGLE decisions AssetManager angleAssets = null; try { angleAssets = context.getPackageManager().getResourcesForApplication(angleInfo).getAssets(); } catch (PackageManager.NameNotFoundException e) { Log.w(TAG, "Failed to get AssetManager for '" + ANGLE_PACKAGE_NAME + "'"); return; } AssetFileDescriptor assetsFd = null; try { assetsFd = angleAssets.openFd(ANGLE_RULES_FILE); } catch (IOException e) { Log.w(TAG, "Failed to get AssetFileDescriptor for " + ANGLE_RULES_FILE + " from " + "'" + ANGLE_PACKAGE_NAME + "'"); return; } FileDescriptor rulesFd = null; long rulesOffset = 0; long rulesLength = 0; if (assetsFd != null) { rulesFd = assetsFd.getFileDescriptor(); rulesOffset = assetsFd.getStartOffset(); rulesLength = assetsFd.getLength(); } else { Log.w(TAG, "Failed to get file descriptor for " + ANGLE_RULES_FILE); return; } // Further opt-in logic is handled in native, so pass relevant info down setAngleInfo(paths, packageName, appPref, devOptIn); setAngleInfo(paths, packageName, appPref, devOptIn, rulesFd, rulesOffset, rulesLength); } /** Loading Loading @@ -391,5 +426,6 @@ public class GraphicsEnvironment { private static native void setDebugLayers(String layers); private static native void setDriverPath(String path); private static native void setAngleInfo(String path, String appPackage, String appPref, boolean devOptIn); boolean devOptIn, FileDescriptor rulesFd, long rulesOffset, long rulesLength); }
core/jni/android_os_GraphicsEnvironment.cpp +7 −3 Original line number Diff line number Diff line Loading @@ -32,12 +32,16 @@ void setDriverPath(JNIEnv* env, jobject clazz, jstring path) { android::GraphicsEnv::getInstance().setDriverPath(pathChars.c_str()); } void setAngleInfo_native(JNIEnv* env, jobject clazz, jstring path, jstring appName, jstring appPref, jboolean devOptIn) { void setAngleInfo_native(JNIEnv* env, jobject clazz, jstring path, jstring appName, jstring appPref, jboolean devOptIn, jobject rulesFd, jlong rulesOffset, jlong rulesLength) { ScopedUtfChars pathChars(env, path); ScopedUtfChars appNameChars(env, appName); ScopedUtfChars appPrefChars(env, appPref); int rulesFd_native = jniGetFDFromFileDescriptor(env, rulesFd); android::GraphicsEnv::getInstance().setAngleInfo(pathChars.c_str(), appNameChars.c_str(), appPrefChars.c_str(), devOptIn); appPrefChars.c_str(), devOptIn, rulesFd_native, rulesOffset, rulesLength); } void setLayerPaths_native(JNIEnv* env, jobject clazz, jobject classLoader, jstring layerPaths) { Loading @@ -57,7 +61,7 @@ void setDebugLayers_native(JNIEnv* env, jobject clazz, jstring layers) { const JNINativeMethod g_methods[] = { { "getCanLoadSystemLibraries", "()I", reinterpret_cast<void*>(getCanLoadSystemLibraries_native) }, { "setDriverPath", "(Ljava/lang/String;)V", reinterpret_cast<void*>(setDriverPath) }, { "setAngleInfo", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)V", reinterpret_cast<void*>(setAngleInfo_native) }, { "setAngleInfo", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLjava/io/FileDescriptor;JJ)V", reinterpret_cast<void*>(setAngleInfo_native) }, { "setLayerPaths", "(Ljava/lang/ClassLoader;Ljava/lang/String;)V", reinterpret_cast<void*>(setLayerPaths_native) }, { "setDebugLayers", "(Ljava/lang/String;)V", reinterpret_cast<void*>(setDebugLayers_native) }, }; Loading