*** is not owned by the current user. Shared storage cannot protect your application from code injection attacks.
起因由于上面Log中的一段Exception
发现这个问题源于动态加载APK中的函数和资源,在4.1之前的Android系统,均能正常使用,发现升级到4.1之后会有这个Exception报出;
所谓动态加载,就是手机本地有一个APK包,用户不需要执行安装过程,程序就可以解包并运行APK中的函数和调取资源。很多场景会用到,比如一些游戏组件,插件,皮肤等等;
动态加载其中一个过程就是将APK解包,即将class.dex从APK中解压出来,这样才能通过java的反射调用到其中的方法。
解包过程中一定会调用这个方法
01
02
03
04
05
06
07
08
09
10
11
12
|
static public DexFile loadDex(String sourcePathName, String outputPathName,
int flags) throws IOException {
/* * TODO: we may want to cache previously-opened DexFile objects.
* The cache would be synchronized with close(). This would help
* us avoid mapping the same DEX more than once when an app
* decided to open it multiple times. In practice this may not
* be a real issue.
*/
return new DexFile(sourcePathName, outputPathName, flags);
}
|
问题就出现在这里,查看4.1的源码,发现Google基于安全考虑在DexFile这个函数中增加了一个验证文件归属权的步骤。
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
|
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) { //就是这里
//4.1增加了一个验证目录uid与当前进程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);
}
|
解决方法,参数outputPathName一定要是运行程序本身的私有地址,通过
01
|
getDir( "dexfile" , 0)
|
方法来获取这个dex文件存储位置就可以解决这个问题。
http://timcho.net/2013/01/16/android_4_1_dong_tai_jia_zai_apk_zhong_de_zi_yuan/
相关推荐
书名:《Android编程入门很简单》(清华大学出版社....第9章Android中的数据存储 第10章绚丽的多媒体技术 第11章Android网上冲浪 第12章Android地图服务 第4篇项目案例开发 第13章联系人助手 第14章个人轨迹跟踪器
书名:《Android编程入门很简单》(清华大学出版社....第9章Android中的数据存储 第10章绚丽的多媒体技术 第11章Android网上冲浪 第12章Android地图服务 第4篇项目案例开发 第13章联系人助手 第14章个人轨迹跟踪器
4.20 加载手机存储卡中的文件 4.21 小结 第5章 交互式服务 5.1 textview的花样 5.2 拨打电话程序 5.3 短信发送程序 5.4 e-mail发送程序 5.5 实现手机震动效果 5.6 图文提醒效果 5.7 状态栏提醒 5.8 检索通讯录 5.8.1...
4.1 定义一个android应用程序:清单文件 4.1.1 [manifest]元素 4.1.2 [application]元素 4.1.3 [activity]元素 4.1.4 [uses-permission]元素 4.1.5 [uses-feature]元素 4.1.6 [uses-sdk]元素 4.1.7 ...
4.9 动态添加/删除的spinner菜单 102 4.10 心爱小宝贝相片集 104 4.11 快速地搜索手机文件引擎 107 4.12 按钮也能随单击变换 109 4.13 具自动提示功能的菜单 110 4.14 数字及模拟小时钟设计 112 ...
13.3 Android的动态加载技术 463 13.4 反编译初步 469 13.4.1 使用dex2jar和jd-gui反编译apk 470 13.4.2 使用apktool对apk进行二次打包 470 第14章 JNI和NDK编程 473 14.1 JNI的开发流程 474 14.2 NDK的开发...
4.9 动态添加/删除的Spinner菜单 4.10 心爱小宝贝相片集 4.11 快速地搜索手机文件引擎 4.12 按钮也能随单击变换 4.13 具自动提示功能的菜单 4.14 数字及模拟小时钟设计 4.15 动态输入日期与时间 4.16 猜猜红桃A在...
4.9 动态添加/删除的Spinner菜单 4.10 心爱小宝贝相片集 4.11 快速地搜索手机文件引擎 4.12 按钮也能随单击变换 4.13 具自动提示功能的菜单 4.14 数字及模拟小时钟设计 4.15 动态输入日期与时间 4.16 猜猜红桃A在...
4.9 动态添加/删除的Spinner菜单 4.10 心爱小宝贝相片集 4.11 快速地搜索手机文件引擎 4.12 按钮也能随单击变换 4.13 具自动提示功能的菜单 4.14 数字及模拟小时钟设计 4.15 动态输入日期与时间 4.16 猜猜红桃A在...
4.9 动态添加/删除的Spinner菜单 4.10 心爱小宝贝相片集 4.11 快速地搜索手机文件引擎 4.12 按钮也能随单击变换 4.13 具自动提示功能的菜单 4.14 数字及模拟小时钟设计 4.15 动态输入日期与时间 4.16 猜猜红桃A在...
4.9 动态添加/删除的Spinner菜单 4.10 心爱小宝贝相片集 4.11 快速地搜索手机文件引擎 4.12 按钮也能随单击变换 4.13 具自动提示功能的菜单 4.14 数字及模拟小时钟设计 4.15 动态输入日期与时间...
4.1 探索Android内置的ContentProvider 4.2 ContentProvider的架构 4.3 实现ContentProvider 4.4 练习图书提供程序 4.4.1 添加图书 4.4.2 删除图书 4.4.3 获取图书数量 4.4.4 显示图书列表 ...
13.3 Android的动态加载技术 / 463 13.4 反编译初步 / 469 13.4.1 使用dex2jar和jd—gui反编译apk / 470 13.4.2 使用apktool对apk进行二次打包 / 470 第14章 JNI和NDK编程 / 473 14.1 JNI的开发流程 / ...
/ 441 12.3.2 优化列表的卡顿现象 / 446 第13章 综合技术 / 448 13.1 使用Crash Handler来获取应用的crash信息 / 449 13.2 使用multidex来解决方法数越界 / 455 13.3 Android的动态加载技术 / 463 13.4 反编译...
google android sdk开发范例大全 第二版 PDF 和 随书光盘代码 ISBN:9787115229649 目录 第1章 了解、深入、动手做 1.1 红透半边天的Android ... A.3 上传*.apk程序到Android Market上