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的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 中以编程方式将图像文件从图库复制到另一个文件夹

在 android 上以编程方式安装 APK

Android以编程方式安装apk

Android:以编程方式安装.apk [重复]

以编程方式将“测试版”apk 升级为“生产”

在java中以编程方式编辑apk文件