Stale cache management to address a P1 bug # 3296131.

Change-Id: I593f35a91c4a14c055828f8989fe01b9e7790039
diff --git a/graphics/java/android/renderscript/RenderScript.java b/graphics/java/android/renderscript/RenderScript.java
index 0b7262b..16ad55a 100644
--- a/graphics/java/android/renderscript/RenderScript.java
+++ b/graphics/java/android/renderscript/RenderScript.java
@@ -417,9 +417,9 @@
     synchronized void nScriptCSetScript(byte[] script, int offset, int length) {
         rsnScriptCSetScript(mContext, script, offset, length);
     }
-    native int  rsnScriptCCreate(int con, String val, String cacheDir);
-    synchronized int nScriptCCreate(String resName, String cacheDir) {
-      return rsnScriptCCreate(mContext, resName, cacheDir);
+    native int  rsnScriptCCreate(int con, String packageName, String resName, String cacheDir);
+    synchronized int nScriptCCreate(String packageName, String resName, String cacheDir) {
+        return rsnScriptCCreate(mContext, packageName, resName, cacheDir);
     }
 
     native void rsnSamplerBegin(int con);
diff --git a/graphics/java/android/renderscript/ScriptC.java b/graphics/java/android/renderscript/ScriptC.java
index b10247c..c1e4358 100644
--- a/graphics/java/android/renderscript/ScriptC.java
+++ b/graphics/java/android/renderscript/ScriptC.java
@@ -77,8 +77,14 @@
 
         rs.nScriptCBegin();
         rs.nScriptCSetScript(pgm, 0, pgmLength);
-        Log.v(TAG, "Create script for resource = " + resources.getResourceName(resourceID));
+
+        // E.g, /system/apps/Fountain.apk
+        String packageName = rs.getApplicationContext().getPackageResourcePath();
+        // For res/raw/fountain.bc, it wil be /com.android.fountain:raw/fountain
+        String resName = resources.getResourceName(resourceID);
         String cacheDir = rs.getApplicationContext().getCacheDir().toString();
-        return rs.nScriptCCreate(resources.getResourceName(resourceID), cacheDir);
+
+        Log.v(TAG, "Create script for resource = " + resName);
+        return rs.nScriptCCreate(packageName, resName, cacheDir);
     }
 }
diff --git a/graphics/jni/android_renderscript_RenderScript.cpp b/graphics/jni/android_renderscript_RenderScript.cpp
index 493653a..9da4428 100644
--- a/graphics/jni/android_renderscript_RenderScript.cpp
+++ b/graphics/jni/android_renderscript_RenderScript.cpp
@@ -902,12 +902,14 @@
 }
 
 static jint
-nScriptCCreate(JNIEnv *_env, jobject _this, RsContext con, jstring resName, jstring cacheDir)
+nScriptCCreate(JNIEnv *_env, jobject _this, RsContext con, jstring packageName, jstring resName, jstring cacheDir)
 {
     LOG_API("nScriptCCreate, con(%p)", con);
+    const char* packageNameUTF = _env->GetStringUTFChars(packageName, NULL);
     const char* resNameUTF = _env->GetStringUTFChars(resName, NULL);
     const char* cacheDirUTF = _env->GetStringUTFChars(cacheDir, NULL);
-    jint i = (jint)rsScriptCCreate(con, resNameUTF, cacheDirUTF);
+    jint i = (jint)rsScriptCCreate(con, packageNameUTF, resNameUTF, cacheDirUTF);
+    _env->ReleaseStringUTFChars(packageName, packageNameUTF);
     _env->ReleaseStringUTFChars(resName, resNameUTF);
     _env->ReleaseStringUTFChars(cacheDir, cacheDirUTF);
     return i;
@@ -1301,7 +1303,7 @@
 
 {"rsnScriptCBegin",                  "(I)V",                                  (void*)nScriptCBegin },
 {"rsnScriptCSetScript",              "(I[BII)V",                              (void*)nScriptCSetScript },
-{"rsnScriptCCreate",                 "(ILjava/lang/String;Ljava/lang/String;)I",  (void*)nScriptCCreate },
+{"rsnScriptCCreate",                 "(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)I",  (void*)nScriptCCreate },
 
 {"rsnProgramStoreBegin",             "(III)V",                                (void*)nProgramStoreBegin },
 {"rsnProgramStoreDepthFunc",         "(II)V",                                 (void*)nProgramStoreDepthFunc },
diff --git a/libs/rs/Android.mk b/libs/rs/Android.mk
index 2ec003f..c2e58b6 100644
--- a/libs/rs/Android.mk
+++ b/libs/rs/Android.mk
@@ -113,11 +113,11 @@
 	rsVertexArray.cpp
 
 
-LOCAL_SHARED_LIBRARIES += libcutils libutils libEGL libGLESv1_CM libGLESv2 libui libbcc
+LOCAL_SHARED_LIBRARIES += libz libcutils libutils libEGL libGLESv1_CM libGLESv2 libui libbcc
 
-LOCAL_STATIC_LIBRARIES := libft2 librslib_rt
+LOCAL_STATIC_LIBRARIES := libdex libft2 librslib_rt
 
-LOCAL_C_INCLUDES += external/freetype/include
+LOCAL_C_INCLUDES += external/freetype/include external/zlib dalvik
 
 LOCAL_LDLIBS := -lpthread -ldl
 LOCAL_MODULE:= libRS
diff --git a/libs/rs/rs.spec b/libs/rs/rs.spec
index cf94060..021ff92 100644
--- a/libs/rs/rs.spec
+++ b/libs/rs/rs.spec
@@ -321,6 +321,7 @@
 	}
 
 ScriptCCreate {
+        param const char * packageName
         param const char * resName
         param const char * cacheDir
 	ret RsScript
diff --git a/libs/rs/rsScriptC.cpp b/libs/rs/rsScriptC.cpp
index 0ae85cb..5197eeb 100644
--- a/libs/rs/rsScriptC.cpp
+++ b/libs/rs/rsScriptC.cpp
@@ -20,6 +20,9 @@
 #include "../../compile/libbcc/include/bcc/bcc.h"
 #include "utils/Timers.h"
 #include "utils/StopWatch.h"
+extern "C" {
+#include "libdex/ZipArchive.h"
+}
 
 #include <GLES/gl.h>
 #include <GLES/glext.h>
@@ -402,7 +405,12 @@
 extern const char rs_runtime_lib_bc[];
 extern unsigned rs_runtime_lib_bc_size;
 
-void ScriptCState::runCompiler(Context *rsc, ScriptC *s, const char *resName, const char *cacheDir) {
+void ScriptCState::runCompiler(Context *rsc,
+                               ScriptC *s,
+                               long modWhen,
+                               long crc32,
+                               const char *resName,
+                               const char *cacheDir) {
     {
         s->mBccScript = bccCreateScript();
         s->mEnviroment.mIsThreadable = true;
@@ -413,6 +421,8 @@
         if (bccReadBC(s->mBccScript,
                       s->mEnviroment.mScriptText,
                       s->mEnviroment.mScriptTextLength,
+                      modWhen,
+                      crc32,
                       resName,
                       cacheDir) >= 0) {
           //bccLinkBC(s->mBccScript, rs_runtime_lib_bc, rs_runtime_lib_bc_size);
@@ -424,6 +434,8 @@
             bccReadBC(s->mBccScript,
                       s->mEnviroment.mScriptText,
                       s->mEnviroment.mScriptTextLength,
+                      modWhen,
+                      crc32,
                       NULL,
                       cacheDir);
             bccCompileBC(s->mBccScript);
@@ -542,7 +554,11 @@
     ss->mScript->mEnviroment.mScriptTextLength = len;
 }
 
-RsScript rsi_ScriptCCreate(Context * rsc, const char *resName, const char *cacheDir)
+
+RsScript rsi_ScriptCCreate(Context *rsc,
+                           const char *packageName,
+                           const char *resName,
+                           const char *cacheDir)
 {
     ScriptCState *ss = &rsc->mScriptC;
 
@@ -550,7 +566,34 @@
     ss->mScript.clear();
     s->incUserRef();
 
-    ss->runCompiler(rsc, s.get(), resName, cacheDir);
+    // Open the apk and return the ZipArchive:
+    //  int dexZipOpenArchive(const char* fileName, ZipArchive* pArchive)
+    ZipArchive archive;
+    long modWhen;
+    long crc32;
+    if (!dexZipOpenArchive(packageName, &archive)) {  // Success
+      ZipEntry entry = dexZipFindEntry(&archive, resName);
+
+      int method;
+      size_t uncompLen;
+      size_t compLen;
+      off_t offset;
+      if (!dexZipGetEntryInfo(&archive,
+                              entry,
+                              &method,
+                              &uncompLen,
+                              &compLen,
+                              &offset,
+                              &modWhen,
+                              &crc32)) {
+      } else {
+        LOGI("Coudn't get entry info for the bitcode in an apk");
+      }
+    } else {
+      LOGI("Couldn't open the archive and read the bitcode");
+    }
+
+    ss->runCompiler(rsc, s.get(), modWhen, crc32, resName, cacheDir);
     ss->clear(rsc);
     return s.get();
 }
diff --git a/libs/rs/rsScriptC.h b/libs/rs/rsScriptC.h
index a714132..4cb5ade 100644
--- a/libs/rs/rsScriptC.h
+++ b/libs/rs/rsScriptC.h
@@ -83,7 +83,7 @@
     void init(Context *rsc);
 
     void clear(Context *rsc);
-    void runCompiler(Context *rsc, ScriptC *s, const char *resName, const char *cacheDir);
+    void runCompiler(Context *rsc, ScriptC *s, long modWhen, long crc32, const char *resName, const char *cacheDir);
 
     struct SymbolTable_t {
         const char * mName;