【问题标题】:Android : programmatically copying apk to /system/appAndroid:以编程方式将 apk 复制到 /system/app
【发布时间】:2012-05-28 07:43:01
【问题描述】:

我正在尝试从我的 java 代码安装系统应用程序,到目前为止,我还没有成功。

以下是我到目前为止所做的:

  1. 我的设备已root。
  2. 我的“安装程序”应用程序作为系统应用程序安装。 (手动复制到 /system/app)
  3. 我已经使用平台密钥签署了安装程序 apk,并且我在 Manifest 中有 android:sharedUserId="android.uid.system"
  4. 我一直在为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.
    
  5. 我已请求清单中的INSTALL_PACKAGES 权限。

我尝试了许多 exec("") 格式的变体,包括在每个命令中使用'su -c'。我得到了断管异常和安全异常。有时,我没有收到异常,但文件没有被复制。


请让我知道我在这里缺少什么。有人搞定了吗?

谢谢!

【问题讨论】:

  • 在相关说明中,使用平台密钥签名的应用与 sharedUserId=system; 的区别是什么?和 /system/app 中存在的应用程序?
  • /system/app 中的应用程序可以访问权限级别 2(据我所知不是 1)。无论授予的权限如何,sharedUserId 为 system 的应用程序都会继承授予“父”应用程序的权限,并且在与其“父”应用程序相同的进程 ID 中运行。各种 API 检查应用程序的进程 ID,如果它们不是特定类型,则拒绝访问它们。尽管这 2 者大多紧密相连,但它们并不总是齐头并进。这是描述它的非技术方式,我相信其他人会做得更好......

标签: android root android-install-apk su


【解决方案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

我现在接受这个作为答案。

【讨论】:

  • 应用程序可以将自身复制到系统文件夹而不是使用外部应用程序吗?您能否澄清用于复制应用程序的命令?另外,如何获取平台密钥?谢谢。
猜你喜欢
  • 1970-01-01
  • 2011-06-25
  • 2013-04-10
  • 1970-01-01
  • 2011-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-06
相关资源
最近更新 更多