We'll see | Matt Zimmerman

a potpourri of mirth and madness

Fix broken Android permissions by re-installing apps

with 5 comments

I run the CyanogenMod derivative of Android on my G1, and somehow managed to get it into a state where it had withdrawn the security permissions from my installed applications. I think this happened when I attempted to upgrade the 1GB microSD to a 4GB one, but the phone failed to boot.

I first noticed the problem when trying to refresh in NewsRob would hang the application, and adb logcat showed:

W/dalvikvm( 540): threadid=3: thread exiting with uncaught exception (group=0x4001e170)
E/NewsRob ( 540): Caught the following exception:
E/NewsRob ( 540): java.lang.SecurityException: Neither user 10039 nor current process has android.permission.WAKE_LOCK.

NewsRob clearly had had this permission before, to prevent the phone from sleeping during a sync. The Manage Applications screen still showed that it did (“System tools: prevent phone from sleeping”). Watching adb logcat while the phone was booting showed what was going on, and that many other applications had the same problem:


W/PackageManager( 138): Not granting permission android.permission.INTERNET to package com.newsrob because it was previously installed without
W/PackageManager( 138): Not granting permission android.permission.WAKE_LOCK to package com.newsrob because it was previously installed without
W/PackageManager( 138): Not granting permission android.permission.ACCESS_NETWORK_STATE to package com.newsrob because it was previously installed without
W/PackageManager( 138): Not granting permission android.permission.VIBRATE to package com.newsrob because it was previously installed without
W/PackageManager( 138): Not granting permission android.permission.WRITE_EXTERNAL_STORAGE to package com.newsrob because it was previously installed without

/data/system/packages.xml, which seems to record which applications are installed and which permissions they have, showed:

<package name="com.newsrob" codePath="/data/app/com.newsrob.apk" system="false" ts="1264200476000" version="353" userId="10039" installer="com.google.android.feedback">
<sigs count="1">
<cert index="25" key="..." />
</sigs>
<perms />
</package>

i.e. the permissions block was empty. It should have looked more like this:

<perms>
<item name="android.permission.VIBRATE" />
<item name="android.permission.WRITE_EXTERNAL_STORAGE" />
<item name="android.permission.ACCESS_NETWORK_STATE" />
<item name="android.permission.WAKE_LOCK" />
<item name="android.permission.INTERNET" />
</perms>

I tried manually hacking it, and also moving and replacing the .apk file on the phone, but packages.xml always returned to this state. Maybe it’s not the master copy of that data.

What finally fixed it for me was to re-install the applications using the package manager, by running:

cd /data/app
for app in *.apk; do pm install -r $app; done

I hadn’t known about the pm command until then, and discovered it by accident when invoking an adb command told me about it. The phone chugged along for quite a while, but eventually re-installed all of the applications, and the problem was fixed.

Web searches showed that I was not the only person to find themselves in this predicament, and did not reveal an obvious solution, so I’m documenting mine here.


Written by Matt Zimmerman

31 January, 2010 at 12:28

5 Responses

Subscribe to comments with RSS.

    • Having seen this script suggested elsewhere, I did try it first (and should have mentioned this). It did not fix this problem.

      The fix_permissions script tries to correct the UNIX permissions and ownership (uid, gid, mode) of files and directories. These look like “0″, “1000″, “rwxr-xr-x”, and such.

      In my case, the problem was with the Android security permissions granted to applications. These look like “android.permission.INTERNET”, “android.permission.WAKE_LOCK” and are a completely different kettle of fish, despite both being called “permissions”.

      Matt Zimmerman

      31 January, 2010 at 17:04

      • I’ve added a link from that page to this article, since it mentions the problem I had but does not explain how to fix it.

        Matt Zimmerman

        31 January, 2010 at 17:10

  1. [...] I learned that the permissions were “missing” from the “/data/system/packages.xml” [...]

  2. Very informative and this seemed to fix the error messages on my logcat output. nice go :)

    thanks..

    kirpi

    4 September, 2010 at 09:42


Leave a Reply