27

How can I push my application package to Android emulator "/system/app" folder?

I've already tried to use:
"adb push myApk.apk /system/app"
and it gives me this:

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

Although from settings -> sdCard & Phone Storage, I get 37Mb of internal free space.

The whole point of this need is
related to permissions.

I need to have INSTALL_PACKAGES permission
and I know that by puting my application there,
in /system/app, I get that permission.

Tsimmi
  • 1,828
  • 6
  • 23
  • 35

14 Answers14

56

I can install an APK to /system/app with following steps.

  1. Push APK to SD card.

    $ adb push SecureSetting.apk /sdcard/  
    
  2. Enter the console and get the shell

    $ adb shell
    
  3. Switch to superuser. If your device is not rooted, get it rooted first. (If you don't know how to do that, just Google.)

    $ su 
    
  4. Remount the system partition with WRITE permission.

    $ mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system 
    
  5. Cat your APK from /sdcard/ to /system/ , some guys get a fail with cp command due to cp is not supported. So use cat instead.

    $ cat /sdcard/SecureSetting.apk > /system/app/SecureSetting.apk 
    
  6. Remout /system partition back to READ-ONLY, and exit

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

Then reboot your device, the APK should have been installed on /system/app.

A5C1D2H2I1M1N2O1R2T1
  • 190,393
  • 28
  • 405
  • 485
posaidong
  • 663
  • 6
  • 11
  • 2
    Thanks ! that's great. Is there any way to avoid the need to reboot ? – Muzikant Feb 10 '13 at 13:31
  • 2
    Found a way to avoid reboot, but it only works when busybox is installed. you only need to REPLACE step 5 of the answer above with the following command `install /sdcard/yourapkfile.apk /system/app` – Muzikant Mar 11 '13 at 13:23
  • 2
    I find that, for step 4, most time it's also working: mount -o remount,rw /system – posaidong Feb 13 '14 at 02:39
  • 2
    Just to point out something, not all devices have yaffs2 filesystem the above version `mount -o remount,rw /system` is a better approach. – echo_salik Jul 14 '14 at 08:08
  • if not success, make sure your apk in /system/app is executable by `ls -l`, if not, execute `chmod 777 your.apk` . – shaojun lyu Dec 12 '18 at 02:57
  • What if the app is already installed as a user app? Or worse: apk split app, such as AirBnb? Also, what should be done to convert back to be a user app? – android developer Apr 01 '19 at 20:42
8

Normally, the only way to get access to the "/system/" directory is to have a device rooted. I don't exactly know if that is required for the emulator though. That could be your issue.

Ryan Alford
  • 7,514
  • 6
  • 42
  • 56
4

These are the steps if you are installing a system apk for Android 5.0 or later devices. For older versions use posaidong's answer

Rename your apk file to base.apk

$ adb push base.apk /sdcard/  

Enter the console and get the shell

$ adb shell

Switch to superuser. If your device is not rooted, get it rooted first. (If you don't know how to do that, just Google.)

$ su 

Remount the system partition with WRITE permission.

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

Create a Test directory inside /system/app folder. (or can use /system/priv-app as well). Ideally this folder name should be application name. For now, lets use Test

$ mkdir /system/app/Test 

Requires 755 permission for this dir

$ chmod 755 /system/app/Test 

Copy your base.apk inside

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

Remout /system partition back to READ-ONLY, and exit

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

Requires 644 permission for this dir

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

$ exit

Reboot your device. When boot completes you should see a system message like Android updating ...

kakopappa
  • 5,023
  • 5
  • 54
  • 73
  • Important remark: use the directory `/system/priv-app` instead of `/system/app` **in order to access system permissions** like `android.permission.SHUTDOWN`! That's also an important comment: https://stackoverflow.com/questions/2007024/push-my-apk-to-system-app/30340018#comment38365210_10362072 – OneWorld Feb 08 '18 at 16:40
  • I have a player inside my app and still can not play streams with port lower than 1024. – MHSaffari Dec 26 '20 at 07:54
2

settings -> sdCard & phone storage says about /data folder.

/system is mounted separately and I guess there is no way of writing there unless you make your own Android build.

See mounts by running

adb shell

# df
Pavel P
  • 637
  • 1
  • 7
  • 21
2

I have come across this situation multiple times while copying apk files to /system partition and could finally resolve it using the following steps:

  • Check the Free space in /system partition using df from adb shell. Most probably the Free space would be less than size of apk file.

    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
    
  • Use du /system to get sizes of each folder & file in /system partition. Arrange the output in descending order of size(s) to get (something similar):

    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
    ...
    
  • Delete unnecessary files from /system/voice/embedded, /system/tts/lang_SMT (for language/locale support) and/or other folders to free enough space in /system partition to accommodate the new apk file. Deleting files in partitions other than /system may not help in this scenario. (N.B.: This step may require ROOT privileges and remounting /system partition in read-write mode using mount -o rw,remount /system)

neel
  • 184
  • 5
2

You need to run adb remount first, then it should let you adb pushto /system folders

1

Use below commands from your super user ADB shell. Copy the APK of your APP into your SD card or Internal Storage.

$ 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

Then reboot the device

SoftwareGuy
  • 1,121
  • 2
  • 11
  • 23
1

The following batch file will install any apk files in the folder to the /system/app directory. It mounts the system drive as rw, then copies the files over.

To use it, put the following code into a text editor and save it as install.bat on a Windows machine. Then double-click on the batch file to install any APK files that are in the same folder as the batch file.

NOTE: You can't remount the system partition unless you have root on the device. I've mostly used this on the emulator which defaults to root (And was the original question), but the concept should be the same on a physical device.

@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/.
Doug
  • 6,446
  • 9
  • 74
  • 107
  • sorry for my little batch file knowledge,i think the batch file also need root right,am i right?and how to use batch file in android can you give link ? if give a batch file in android demo that is beatifule thanks – pengwang May 05 '12 at 02:16
  • Yes, you need root on the device to run the batch file and copy something to the system mount. You can't remount the drive rw without it. ADB runs as root by default on the emulator. Usage is pretty straight forward, I've updated my post to include more instructions. – Doug May 09 '12 at 17:32
  • what the mean for "for /f %%a IN ('dir /b *.apk') do adb push %%a /system/app/." it can for many apk put to the /system/app/? – pengwang May 11 '12 at 08:21
  • Yes, its a loop. The loop puts all the apk files in the current folder and pushes it into the /system/app directory. – Doug May 15 '12 at 23:17
0

Even before adb remount you should change the permissions for the /system in the adb shell. you can use chmod to change the permissions.

knmanish
  • 51
  • 4
0

If your apk is smaller enough to push in, then try some times again. I met the same problem and tried twice to push the apks to /system/app/

herbertD
  • 10,657
  • 13
  • 50
  • 77
0

Apparently, there is not enough space for your application in "/system" mount. You can check that with "adb shell df" command.

To solve this issue, you need to set partition-size parameter adequately while starting your AVD like this:

emulator.exe -avd <your avd name> -partition-size 512
Akdeniz
  • 1,260
  • 11
  • 21
0

Check that you have enough inodes, you may have enough memory but not enough inode i.e. file placeholder.

Sylvain
  • 113
  • 7
0

You have to mount system as read/write and then push the application.

This is answered in this question: Push .apk to /system/app/ in HTC HERO

Community
  • 1
  • 1
Marc Climent
  • 9,434
  • 2
  • 50
  • 55
-3

If you're simply looking to install it, you can always do: adb install myApk.apk.

Erich Douglass
  • 51,744
  • 11
  • 75
  • 60
  • If I just install my package that way, I don't get system permissions like INSTALL_PACKAGES. Thanks ;-D – Tsimmi Jan 05 '10 at 16:10
  • This is the correct way to do it. You cannot push an APK or write anything to `/system` even if you do have root access to the device, as that partition is mounted as read-only. – Christopher Orr Jan 05 '10 at 23:51
  • You do not get the permission to install packages because it's a security issue. Applications should not be able to install other packages behind people's back. If you need another package installed, the correct way to tell the user they need it is call an intent from that other package. If the intent does not exist, then inform the user (through a popup or some other text) that they must download the other application to access that feature. – AndrewKS Apr 15 '11 at 18:47