Android:以编程方式将 apk 复制到 /system/app
Posted
技术标签:
【中文标题】Android:以编程方式将 apk 复制到 /system/app【英文标题】:Android : programmatically copying apk to /system/app 【发布时间】:2012-05-28 07:43:01 【问题描述】:我正在尝试从我的 java 代码安装系统应用程序,到目前为止,我还没有成功。以下是我到目前为止所做的:
-
我的设备已root。
我的“安装程序”应用程序作为系统应用程序安装。 (手动复制到 /system/app)
我已经使用平台密钥签署了安装程序 apk,并且我在 Manifest 中有
android:sharedUserId="android.uid.system"
。
我一直在为Runtime.getRuntime.exec("su")
尝试(尝试,然后更多)。我打算将系统分区挂载为rw
,为apk做一个cat
,然后将系统分区设置为ro
。以下是命令列表:
mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system<br>
cat /sdcard/application.apk > /system/app/application.apk<br>
mount -o remount,ro -t yaffs2 /dev/block/mtdblock3 /system<br><br>The application.apk here is the app being installed from the installer app. This app is also signed with platform key, and has the sharedUserId configured.
我已请求清单中的INSTALL_PACKAGES
权限。
我尝试了许多 exec("") 格式的变体,包括在每个命令中使用'su -c'
。我得到了断管异常和安全异常。有时,我没有收到异常,但文件没有被复制。
请让我知道我在这里缺少什么。有人搞定了吗?谢谢!
【问题讨论】:
在相关说明中,使用平台密钥签名的应用与 sharedUserId=system; 的区别是什么?和 /system/app 中存在的应用程序? /system/app 中的应用程序可以访问权限级别 2(据我所知不是 1)。无论授予的权限如何,sharedUserId 为 system 的应用程序都会继承授予“父”应用程序的权限,并且在与其“父”应用程序相同的进程 ID 中运行。各种 API 检查应用程序的进程 ID,如果它们不是特定类型,则拒绝访问它们。尽管这 2 者大多紧密相连,但它们并不总是齐头并进。这是描述它的非技术方式,我相信其他人会做得更好...... 【参考方案1】:我一直在挖掘,结果如下:
Android 在 su.c 中有此检查:[“android 源的根目录”/system/extras/su/su.c]/* Until we have something better, only root and the shell can use su.*/ myuid = getuid(); if (myuid != AID_ROOT && myuid != AID_SHELL) fprintf(stderr,"su: uid %d not allowed to su\n", myuid); return 1;
ChainsDD (SuperUser) 和 cyanogen mod 通过实现自己的 su.c 来解决这个问题:https://github.com/CyanogenMod/android_system_su/blob/master/su.c
/system/app
有什么特别之处?似乎分区在非根设备上是只读的,从而防止修改/卸载放置在那里的应用程序。 https://android.stackexchange.com/questions/17871/what-are-the-differences-between-a-system-app-and-user-app
使用平台密钥和sharedUserId = system
签名的应用对于我的目的来说“足够好”,我不必专门将其复制到 /system/app。
我现在接受这个作为答案。
【讨论】:
应用程序可以将自身复制到系统文件夹而不是使用外部应用程序吗?您能否澄清用于复制应用程序的命令?另外,如何获取平台密钥?谢谢。以上是关于Android:以编程方式将 apk 复制到 /system/app的主要内容,如果未能解决你的问题,请参考以下文章