当前位置: 代码迷 >> Android >> android4.1.2 DexClassLoader is not owned by the current user 有关问题
  详细解决方案

android4.1.2 DexClassLoader is not owned by the current user 有关问题

热度:122   发布时间:2016-05-01 11:18:53.0
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 = 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.结尾

  相关解决方案