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.结尾