2010-01-05 142 views
22

如何将我的应用程序包 推送到Android模拟器“/ system/app”文件夹?将我的apk安装到/ system/app

我已经尝试过使用:
“亚行推myApk.apk /系统/应用程序”
,这让我这个:

"failed to copy: ... No space left on device" 

虽然从设置 - > SD卡&电话存储, 我得到37Mb的内部可用空间。

这个需求的整点是
与权限有关。

我需要有INSTALL_PACKAGES许可
,我知道通过puting在/ system/app中我的申请有,
,我得到的许可。

回答

4

通常情况下,访问“/ system /”目录的唯一方法是使设备生根。但我不完全知道模拟器是否需要这样做。这可能是你的问题。

+1

在制作“adb push ...”之前, 我也使用adb root, 这应该给我root权限。 谢谢 – Tsimmi 2010-01-05 16:12:27

+1

我有一个设备扎根,但我不能使用adb root,只有adb shell“su - ”, – david 2016-07-12 02:44:12

-3

如果您只是想安装它,您可以随时执行:adb install myApk.apk

+0

如果我安装我的包呀, 我不不会像INSTALL_PACKAGES那样获得系统权限。 谢谢;-D – Tsimmi 2010-01-05 16:10:35

+0

这是做到这一点的正确方法。即使您对设备拥有根访问权限,您也无法将APK或任何内容写入'/ system',因为该分区以只读方式安装。 – 2010-01-05 23:51:41

+0

您没有获得安装软件包的权限,因为这是一个安全问题。应用程序不应该能够在人们的背后安装其他软件包。如果你需要安装另一个软件包,告诉用户他们需要它的正确方法是调用另一个软件包的意图。如果意图不存在,则通知用户(通过弹出窗口或其他文本)他们必须下载其他应用程序才能访问该功能。 – AndrewKS 2011-04-15 18:47:19

2

设置 - > SD卡&手机存储说关于/数据文件夹。

/系统是单独安装的,我想除非你自己制作Android版本,否则没有办法在那里编写。

见坐骑运行

adb shell 

# df 
1

你需要运行adb remount第一,那么它应该让你adb push/system文件夹

1

下面的批处理文件将在文件夹中安装任何的apk文件到/ system/app目录。它将系统驱动器挂载为rw,然后复制文件。

要使用它,请将以下代码放入文本编辑器中,并将其保存为install.bat在Windows机器上。然后双击批处理文件以安装与批处理文件位于同一文件夹中的任何APK文件。

注意:除非设备上有root用户,否则无法重新挂载系统分区。我主要在默认为root的模拟器上使用它(原始问题),但在物理设备上这个概念应该是相同的。

 
@ECHO OFF 
%~d0 
CD %~dp0 
adb root 
adb shell mount -o rw,remount -t yaffs2 /dev/block/mtdblock3 /system 
adb shell rm /system/app/SdkSetup.apk 
for /f %%a IN ('dir /b *.apk') do adb push %%a /system/app/. 

+0

对不起我的小批量文件知识,我认为批处理文件也需要root权限,我是对的吗?在android中使用批处理文件你可以给链接?如果在Android演示中给出一个批处理文件,那么这个批处理文件很好,谢谢 – pengwang 2012-05-05 02:16:26

+0

是的,你需要设备上的root用户运行批处理文件并将某些内容拷贝到系统挂载中。没有它,你无法重新安装驱动器rw。 ADB在仿真器上以root用户身份运行。 用法非常简单,我已更新我的帖子以包含更多说明。 – Doug 2012-05-09 17:32:07

+0

“for/f %% a IN('dir/b * .apk')做adb push %% a/system/app /的意思是什么。”它可以为许多apk放到/ system/app /? – pengwang 2012-05-11 08:21:10

0

即使在adb remount之前,您应该更改adb shell中/系统的权限。 您可以使用chmod更改权限。

50

我可以按以下步骤安装APK至/system/app

  1. 将APK推送到SD卡。

    $ adb push SecureSetting.apk /sdcard/ 
    
  2. 进入控制台,并获得外壳

    $ adb shell 
    
  3. 切换到超级用户。如果你的设备没有植根,请先植根。 (如果你不知道该怎么做,只是谷歌)具有写权限

    $ su 
    
  4. 重新挂载系统分区。不支持

    $ mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system 
    
  5. 猫您的APK从/sdcard//system/,有些人得到了与cp命令由于cp失败。因此改为使用cat

    $ cat /sdcard/SecureSetting.apk > /system/app/SecureSetting.apk 
    
  6. REMOUT /system分区恢复到只读,并退出

    $ mount -o remount,ro -t yaffs2 /dev/block/mtdblock3 /system 
    $ exit 
    

然后重新启动设备,在APK应已安装在/system/app

+2

谢谢!那很棒。有什么办法可以避免重新启动吗? – Muzikant 2013-02-10 13:31:13

+2

找到避免重新启动的方法,但只有在安装了busybox时才能使用。你只需要用上面的命令'install /sdcard/yourapkfile.apk/system/app'代替REPLACE步骤5上面的答案 – Muzikant 2013-03-11 13:23:05

+1

我发现,对于第4步,大部分时间它也在工作: mount -o remount,rw/system – posaidong 2014-02-13 02:39:16

0

如果您的apk足够小以便推入,然后再次尝试一些时间。我遇到了同样的问题,并尝试了两次,以将系统推送到/ system/app/

0

显然,“/ system”mount中没有足够的空间存储应用程序。你可以用“adb shell df”命令来检查。

为了解决这个问题,你需要设置分区的大小参数充分,同时启动您的AVD是这样的:

emulator.exe -avd <your avd name> -partition-size 512 
0

检查是否有足够的inode,你可以有足够的内存,但没有足够的inode,即文件占位符。

1

使用以下超级用户ADB shell的命令。将您的APP的APK复制到您的SD卡或内部存储器中。

$ adb shell 
$ su 
$ mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system 
$ cp /sdcard/<Your_APK_PATH> /system/app/file_name_comes_here.apk 
$ chmod 644 /system/app/<YourAPK>.apk 

然后重新启动设备

3

这些是如果正在针对Android 5.0或更高版本的设备安装系统的apk的步骤。对于旧版本使用posaidong的回答

重命名的apk文件base.apk

$ adb push base.apk /sdcard/ 

进入控制台,并获得外壳

$ adb shell 

切换到超级用户。如果你的设备没有植根,请先植根。 (如果你不知道该怎么做,只需Google。)

$ su 

用WRITE权限重新挂载系统分区。

$ mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system 

在/ system/app文件夹内创建一个Test目录。 (或者也可以使用/ system/priv-app)。理想情况下,此文件夹名称应为应用程序名称现在,让我们使用测试

$ mkdir /system/app/Test 

需要此目录

$ chmod 755 /system/app/Test 

副本中

$ cat /sdcard/base.apk > /system/app/Test/Base.apk 

REMOUT /系统分区您base.apk回为只读,和755的许可退出

$chmod 644 /system/app/Test/Base.apk 

Re需要此目录的644权限

$ mount -o remount,ro -t yaffs2 /dev/block/mtdblock3 /system 

$ exit 

重新启动您的设备。当引导完成后,你应该可以看到更新的Android系统消息...

+0

重要说明:为了访问像“android.permission.SHUTDOWN”这样的系统权限,使用'/ system/priv-app'目录而不是'/ system/app' **!这也是一个重要的评论:https://stackoverflow.com/questions/2007024/push-my-apk-to-system-app/30340018#comment38365210_10362072 – OneWorld 2018-02-08 16:40:08

0

我已经多次碰到过这种情况,而复制的apk文件/system分区,使用以下步骤可以最终解决它:

  • 检查免费空间/system分区使用dfadb shell。最有可能的可用空间将小于apk文件的大小。

    Filesystem    Size  Used  Free Blksize 
    /dev       1.3G 80.0K  1.3G  4.0K 
    /sys/fs/cgroup    1.3G 12.0K  1.3G  4.0K 
    /mnt/secure     1.3G  0.0K  1.3G  4.0K 
    /mnt/asec     1.3G  0.0K  1.3G  4.0K 
    /mnt/obb      1.3G  0.0K  1.3G  4.0K 
    /system      3.5G  3.5G 10.0M  4.0K 
    /efs      15.7M  2.8M 12.9M  4.0K 
    /cache      192.8M 736.0K 192.1M  4.0K 
    /data      25.5G 12.7G 12.8G  4.0K 
    /persdata/absolute   4.9M 120.0K  4.8M  4.0K 
    /sbfs      10.8M  8.0K 10.7M  4.0K 
    /mnt/shell/knox-emulated 25.5G 12.7G 12.8G  4.0K 
    /mnt/shell/privatemode  25.4G 12.7G 12.7G  4.0K 
    /mnt/shell/emulated   25.4G 12.7G 12.7G  4.0K 
    /preload      5.8M  3.3M  2.5M  4.0K 
    
  • 使用的du /系统让每个文件夹&文件的大小在/system分区。排列按大小(S)的顺序输出得到(类似的东西):

    4091840 /system/ 
    1199416 /system/app 
    964064 /system/priv-app 
    558616 /system/lib64 
    373320 /system/lib 
    206624 /system/vendor 
    170952 /system/app/WebViewGoogle 
    148824 /system/app/WebViewGoogle/lib 
    125488 /system/voice 
    125480 /system/voice/embedded 
    122880 /system/app/Chrome 
    106520 /system/framework 
    102224 /system/priv-app/Velvet 
    96552 /system/app/SBrowser_3.0.38 
    93936 /system/vendor/lib64 
    93792 /system/vendor/lib64/egl 
    92552 /system/tts 
    92512 /system/tts/lang_SMT 
    ... 
    
  • /system/voice/embedded删除不必要的文件,/system/tts/lang_SMT(语言/区域设置支持)和/或其他文件夹,释放足够的空间/system分区以适应新的apk文件。删除/system以外的分区中的文件可能无助于此场景。 (NB:这个步骤可能需要在读写模式ROOT权限,并重新安装/system分区使用安装邻RW,挂载/系统