android4.1.2 DexClassLoader is not owned by the current user 有关问题
android4.1.2 DexClassLoader is not owned by the current user 问题
}
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 = new
File(outputName).getParent();
if
(Libcore.os.getuid() != Libcore.os.stat(parent).st_uid) {
throw
new
IllegalArgumentException("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.结尾