is not owned by the current user. Shared storage cannot protect your application from code injection attacks.
在4.1进行资源动态加载时出现上述问题。
解决方法:http://weibo.com/junjieyang咨询
在4.1系统由于This class loader requires an application-private, writable directory to cache optimized classes为了防止一下问题:
External storage does not provide access controls necessary to protect your application from code injection attacks.
所以加了一个判断Libcore.os.getuid() != Libcore.os.stat(parent).st_uid判断两个程序是不是同一个uid
private DexFile(String sourceName, String outputName, int flags) throws IOException {
if(outputName != null) {
try{
String parent = newFile(outputName).getParent();
if(Libcore.os.getuid() != Libcore.os.stat(parent).st_uid) {
thrownewIllegalArgumentException("Optimized data directory " + parent
+" is not owned by the current user. Shared storage cannot protect"
+" your application from code injection attacks.");
}
}catch(ErrnoException ignored) {
// assume we'll fail with a more contextual error later
}
}
mCookie = openDexFile(sourceName, outputName, flags);
mFileName = sourceName;
guard.open("close");
//System.out.println("DEX FILE cookie is " + mCookie);
解决方法:
File dexOutputDir = context.getDir("dex", 0);
DexClassLoader localDexClassLoader = new DexClassLoader(dexpath, dexOutputDir.getAbsolutePath(), null, ClassLoader.getSystemClassLoader().getParent());
便可解决上出问题,dexpath文件必须要以.dex或者apk.结尾