Optimized data directory /mnt/sdcard is not owned by the current user
最近在研究android下的动态加载,然后发现当我加载sd卡下的apk的时候会提示以下错误:
Optimized data directory /mnt/sdcard is not owned by the current user. Shared storage cannot protect your application from code injection attacks.”:
原来在android4.1.1 以后加了这样的限制,增加了对JAR/DEX存放目录文件的user_id 和动态加载JAR/DEX的进程的user_id是否一致的判断,如果不一致将抛出异常导致加载失败。
这样确实也是为了安全性的考虑,如果都放到sd卡下,显然也可能会被其他人利用。解决办法:
指定 dexoutputpath为APP自己的缓存目录即可。
File optimizedDexOutputPath = activity.getDir("dex", 0) ;-------------------//在ansroid4.1以后,增加了jar/dex文件存放目录的userid是否一致的判断。不一致就将抛异常,解决办法放在私有目录中即可。
----------------------------------
DexClassLoader classLoader = new DexClassLoader(file.getAbsolutePath(),optimizedDexOutputPath.getAbsolutePath(), null, activity.getClassLoader());
就可以解决动态加载jar在4.1以后android系统上面会抛出安全的问题。
File
dexOutputDir
=
context
.
getDir
(
"dex"
,
0
)
;
DexClassLoader
dexClassLoader
=
new
DexClassLoader
(
dexPath
,
dexOutputDir
.
getAbsolutePath
(
)
,
null
,
getClassLoader
(
)
)
;
外部动态加载DEX文件安全建议
1. 将所需要动态加载的DEX/APK文件放置在APK内部或应用私有目录中
为了所加载的DEX/APK不被恶意代码注入,阿里聚安全建议将要动态加载的DEX/APK放置在APK内部;
2. 使用加密网络协议进行下载加载的DEX/APK文件并将其放置在应用私有目录中
阿里聚安全建议使用加密网络协议进行下载并将下载的DEX或APK放置在应用的私有目录;
3. 对不可信的加载来源进行完整性校验
如果应用必须将所加载的DEX或APK放置在能被其他应用人意读写的目录中(如sdcard)或使用没有加密的网络协议进行下载加载源,阿里聚安全建议对这些不可信的加载源进行完整性校验和白名单处理,以保证不被恶意代码注入