[Q] Accessing files with different owner from App - Android Q&A, Help & Troubleshooting

Background:
I have an App that needs to read files generated by a process outside of its control. These files end up in a folder on the device and they have permissions set so that the App is not allowed to open these files.
The device is rooted and I have access to these files via adb shell and here I can simply do a chmod and the app can read the files. Problem is that these files are generated now and then when the App is running so it is not practical or possible to do the chmod via adb shell. The App needs to be able to operate without being plugged in to adb shell.
So what have I tried so far:
*Searched the internet for answers, YES but no luck
*Searched XDA, Stack Overflow etc YES but no luck
*I have chown the App.apk in /data/app to be root:root and to have the same uid and group id as the files I'm trying to open and read. I have also changed the App userId in /data/system/packages.xml to root.
In all these cases the app is started with its default user id if I check it with ps and the files cannot be opened. Yes I made sure the App was actually off/killed before starting it again after changing these things.
*In java I have tried p = Runtime.getRuntime().exec("sudo chmod 777 /thefolder/*"); but I get IOException same for swapping to "su…" or "sudo su…" Leaving out the superuser returns ok but doesn't do anything to the files in thefolder.
The preferred solution is that this is done in code in either Java or in JNI/C but some sort of one off magic via adb that stays there when device is power cycled is also ok.
Anyone has any good ideas or hints on how these files can be read?
Thanks in advance!

Related

[HOW-TO] Manually backup 3rd-party application settings and data--by cyricc

From the original post by cyricc in the G1 Android Development forum:
HOW TO: Manually backup 3rd-party application settings and data
I just didn't want to be the guy posting only a link. Please post any questions, comments, or thanks in the original thread I deserve NO CREDIT for this post.
##############################
This tutorial will explain how to backup application data and settings for 3rd-party apps that do not have an export/import settings feature. Looking to upgrade your ROM but don't want to lose your todos/highscores/whatnots after a data wipe? Then read on..
(I've never used apps to SD, so I'm not completely sure how the data is stored with that. I'm assuming the entire data partition is moved to the SD though, so the procedures outlined in this guide are not necessary / do not apply to apps2sd)
Tools needed:
adb
Backing up settings
Run a adb shell in the command prompt and navigate to /data/data
Code:
c:\android-sdk-windows-1.5_r1\tools> adb shell
# cd /data/data
Find the folder of the app whose settings you want to backup. In android 1.5, M/SMS are stored in com.android.providers.telephony and bookmarks are in com.android.browser. For third party apps, you can use ls to list all installed apps and find your app folder manually, or use find - say I want to find the app folder for the Astrid todo app:
Code:
# ls
<.....lots of directories....>
com.timsu.astrid
<.....more directories....>
# find *astrid* -maxdepth 0
com.timsu.astrid
Now open a separate command prompt and use adb pull to copy the application's data folder to your computer. This does not copy the app itself, only its saved data and settings. App .apks reside in /data/apps, which you can also adb pull out if you want. In this example I pull out settings for Astrid:
Code:
c:\android-sdk-windows-1.5_r1\tools> adb pull /data/data/com.timsu.astrid d:\desktop\com.timsu.astrid
Feel free to replace d:\desktop with the location of your choice, of course. Repeat the above for each app folder you want to backup.
Restoring settings after a wipe
First thing to do is reinstall the apk, from sdcard, adb install, market, whatever. After the app is installed, you can restore settings in one of two ways: the easy way or the hard but safe (paranoid) way.
The Easy Way:
This quick and dirty method will give everyone full read/write/execute permissions on the application's settings/data. This is normally a Very Bad Idea with a normal linux computer, but realistically there is very little risk of this posing any real security issues on a device like a phone.
First, adb push the settings into the data folder, overwriting the app's stock settings (in this example, the astrid data I backed up) then adb shell into the phone and navigate to /data/data:
Code:
c:\android-sdk-windows-1.5_r1\tools> adb push d:\desktop\com.timsu.astrid /data/data/com.timsu.astrid
Done
c:\android-sdk-windows-1.5_r1\tools> adb shell
# cd /data/data
Now give full permissions to the app's data folder and its contents:
Code:
# chmod 777 com.timsu.astrid
# cd com.timsu.astrid
# chmod 777 * */*
And that's it. Launch the app and your settings/data should be restored.
The Hard Way
I'm not going to go into this in detail because if you're reading this, you probably know the commands to do this anyway. After you reinstall the app, the general idea is to run ls -l on the stock app data directory and its subdirectories to display the owner and permissions of each file/folder as setup by the android system. Write these down then adb push the backup app data folder in, which overwrites everything with directories and files owned by root. Then use chown and chmod to restore the original owners and permissions for each file and directory. Needless to say this can be quite a hassle if you're dealing with more than a few application backups.
i made a script that copies ALL of the applications off of the phone as a backup to a folder on your sd card. the sd card MUST HAVE a folder called "app" in order for this to work.
Code:
@ECHO OFF
adb shell cp data/app/* /sdcard/app
pause
then here is one to reinstall ALL of the apps from that "app" folder back onto your android, keeping the update notifications.
Code:
@ECHO OFF
adb remount
adb shell busybox install sdcard/app/*.apk /data/app
pause
exit
either type those commands into a command prompt or you can make a .bat file and put those commands in.

Java on Weptop Firefox

I finally managed to get java to work with firefox. I test out runescape and it works great on minimum graphics setting may be able set higher.
Im on 4.1.8.3 with full ubuntu mod. HAS NOT BEEN VERIFIED WITH AN UNMODDED WEBTOP
Here a little guide that I wrote. It should work
Basically
Google Java arm and click Java Embedded
Download ARMv7 Linux - Headful from there
Extract the ejre1.6.0_25 folder and move to phone
Copy the ejre1.6.0_25 folder to
/usr/lib/
Ingore this code if you are running from lxterminal
Code:
su
/usr/bin/sudo -u adas bash
In lxterminal or whatever terminal
Code:
sudo ln -s /usr/lib/ejre1.6.0_25/lib/arm/libnpjp2.so /usr/lib/firefox-addons/plugins/libnpjp2.so
sudo chmod 755 /usr/lib/ejre1.6.0_25/bin/java
sudo chmod 755 /usr/lib/ejre1.6.0_25/bin/java_vm
sudo chmod 755 /usr/lib/ejre1.6.0_25/bin/javaws
sudo chmod 755 /usr/lib/ejre1.6.0_25/bin/keytool
If you get "link failed File exists" run this. then run the ln command
Code:
sudo rm /usr/lib/firefox-addons/plugins/libnpjp2.so
You can also use root explorer to set permission for the files
Set to this:
read write execute
X --- X----- X
X ---------- X
X ---------- X
Then it should work
I attach a screenshot of runescape running
I'd like more information if you would regarding the installation of java as I am a diehard runescape fan myself. I've downloaded the Java embed but it was version _25 and not _21, not sure if it matters. And also, do I have to be rooted or not?
If you come pm me or reply here, that would be great.
I tried this and was able to get the plugin to load, but all I get is black boxes where the applets are. Any ideas? The java plugin shows under plugins. I'm using 1.6.0_25.
I'd like to know how you exactly got it to work? I cant get the lxterminal to run on my webtop, I'm really new and found out basically everything else but how to install the plugin. Thanks for the info.
And according to a thread on xda, cant remember which - the lxterminal was removed from the phone on the most recent update... so how would I get around that?
I did all the commands using Android Terminal Emulator from the Market.
Are you fully updated on your phone? as in 4.1.8.3
because ive tried more than once to get it to work. and no avail.
exactly what commands did you do anyway? because that could quite possibly solve my problems.
I'm on 4.1.83. I used the commands that are in the OP, changing out ejre-1.6.0_21 with ejre1.6.0_25 (which is the folder name for the version I downloaded). Make sure you do not have a folder in a folder. I never got it fully working, just black boxes on the web pages. The plugin does show to be installed though.
OHHHHHHHHHHHHHHHHH, thats why.
actually, nvm ... my files are in the exact location his are. >_<
Should I type the lines 1 at a time? I've been copy and pasting them all at once.
I did one at a time.
?.?
Ok this is my situation as of yet, I currently have rooted atrix, running newest version. I open terminal emulator from market, type in the first line "ln -s /usr/lib/ejre-1.6.0_25/lib/arm/libnpjp2.so /usr/lib/firefox-addons/plugins/libnpjp2.so" and it returns "link failed File exists, so im guessing i've already placed it into the plugins folder.
So far so good, now onto second line -
"chmod 755 /usr/lib/ejre-1.6.0_25/bin/java"
and my return being
-unable to chmod /usr/lib/ejre-1.6.0_25/bin/java: No such file or directory
I would type the rest but i'm sure they would return the same
My files are in the correct location /usr/lib/ejre-1.6.0_25/
any suggestions?
Well I have the full ubuntu mod on my phone. I have not test it doing it though anything other than lxterminal
If you see the plugin in firefox that is good. Im betting the permission are not set properly
you can use root explorer to set the permission on the files that are chmod. Make sure all check boxs under execute are selected.
Check what you copied to the phone and make sure you don't have two ejre-1.6.0_25 folders (one within the other) from when you extracted it.
I extracted it to my sd card then moved the folder, so my locations are exactly what he lists. nothing different aside from the _25 instead of _21 which i change in what I type. I just tried to allow permissions, lets see if this changes anything...*crosses fingers*
Edit: When I type the first line, I get
link failed Permission denied
Stephen Who said:
I extracted it to my sd card then moved the folder, so my locations are exactly what he lists. nothing different aside from the _25 instead of _21 which i change in what I type. I just tried to allow permissions, lets see if this changes anything...*crosses fingers*
Edit: When I type the first line, I get
link failed Permission denied
Click to expand...
Click to collapse
Do you have root?
I have root, plugin shows in firefox, permissions are correct, but all applets just show as a black box. I'm running stock. Do you think it only works with the ubunto mod?
Ok I edited the OP so the commands can be run from android terminal or adb.
Im not sure why it doesnt work for you must be the full ubuntu mod.
I might try downloading a new version of java see if it works
Update
I tried the the 25 version and it worked. I updated the commands. I was able to get it to work using adb.
password for adas:?
edit: and yes, I'm rooted. It's asking for a password when I type the second command line. :|

[GUIDE] Basic Unix/Linux command to use with ADB SHELL

So I have been reading quite a few threads here on XDA, and the one thing I noticed for noobs to linux/unix world is that they are struggling with some basic command once adb shell is gained. I decided to whip out this quick tutorial to help those noobs out to become more of an expert...like me...lol j/k
Here we go:
Prerequisites:
You must know how to invoke a adb shell command already to drop into your phone.
ALL commands in Unix/Linux are case sensitive
For more details, go to this ADB tutorial (very good one): http://forum.xda-developers.com/showthread.php?t=517874
Let's get going:
Once a shell is gained via adb, let's look at some of the basic commands you can do to navigate around the filesystem. Note: you must remove the double-quotes (") for the actual command.
Code:
"cd" = is change directory
to change to any directory, you type: cd dir_name (where dir_name is a full path)
Example: I want to go to /data/local/tmp in my phone, I would do
cd /data/local/tmp <hit ENTER>
You can also use the ".." to go UP one directory.
Example: I'm in /data/local/tmp and I want to go up to /data folder, a command would be: cd ../.. alternatively, if I do cd .. then i'll drop into /data/local folder instead.
Code:
"ls" = list files/directories
to list files/directories within a folder, the command should be:
ls <hit enter> => this will list all NON-HIDDEN file/directories within your CURRENT directory.
ls /data/local/tmp => this will list all NON-HIDDEN file/directories within /data/local/tmp directory.
ls -l => this will list all NON-HIDDEN file/directories within your CURRENT directory, plus additional details. Consider this is like a "Details" view in Windows Explorer.
ls -a => this will list all files/directories (including hidden files) within your CURRENT directory.
ls -la => this will list all files/directories (including hidden files) within your CURRENT directory, plus details.
Code:
"chmod" = change mode
Goes to wikipedia for more details: https://secure.wikimedia.org/wikipedia/en/wiki/Chmod
Most commonly used modes on android phones are:
"755" or "777".
So if you have a root.sh shell script that you downloaded from XDA, and uploaded to your phone and try to execute it with ./root.sh and it said "Permission denied". That means your script does not have the execute permission. You need to do:
chmod 755 root.sh <hit enter>
[B]IMPORTANT: There is *NO* negative sign (-) in front of the mode bit. So it is NOT chmod -755 root.sh[/B]
If you get a "File or directory not found" error, which means you are chmod-ing a file that doesn't exist in your current directory. To execute a chmod on root.sh in /data/local/tmp you do:
chmod 755 /data/local/tmp/root.sh
If you want to chmod an ENTIRE DIRECTORY and ALL files underneath it you do:
chmod -R 755 /data/local/tmp => this will set /data/local/tmp and ALL files/folders underneath it to be 755.
Code:
"chown" = change ownership
Go to wikipedia for details: https://secure.wikimedia.org/wikipedia/en/wiki/Chown
Most common used chown for android is: "root:root" or "root:shell"
Example: if you want to change ownership of root.sh to root:shell then you do:
chown root:shell root.sh
NOTE: the -R (recursive) option is also available for chown.
chown -R root:shell /data/local/tmp
Code:
"pwd" = print working directory
so when you are within a directory and you want to know which directory you are in, then you issue the command:
pwd <hit enter>
The system will reply back with the currently directory you are in.
I'll try to add more if I think of anything else useful, or if you have suggestions, please feel free to add.
so what does it mean to add adb to your path? thats holding me back from temp rooting on my mac. Im a total adb noob clearly.
hockey4life0099 said:
so what does it mean to add adb to your path? thats holding me back from temp rooting on my mac. Im a total adb noob clearly.
Click to expand...
Click to collapse
The easiest way to explain it is that you can run ADB from anywhere...do a search and you can find a more detailed (and more proper) explanation and directions on how to set it up.
hockey4life0099 said:
so what does it mean to add adb to your path? thats holding me back from temp rooting on my mac. Im a total adb noob clearly.
Click to expand...
Click to collapse
What OS are you using?
vboyz103 said:
What OS are you using?
Click to expand...
Click to collapse
mac
______________
hockey4life0099 said:
mac
______________
Click to expand...
Click to collapse
Like I said, do a search on XDA...there's a great guide on how to set up ADB properly. I'll link to it tomorrow when I get on the computer.
-- Sent from my 3VO Shooter --
hockey4life0099 said:
mac
______________
Click to expand...
Click to collapse
If you use mac, open a Terminal, and you should be at your home directory and type:
nano ~/.profile
if the .profile doesn't exist yet, then you'll see an empty.
Put this into the file
PATH=$PATH:/path/to/your/android/platform-tools
export PATH
save and exit out of Nano, and type:
source ~/.profile
then after this type adb and if adb is in your PATH then you see adb help.
Overview Of Permissions via ADB SHELL
Example = drwxrwxrwx
To Check Permission at anytime in ADB just Type:
ls -l
The First character defines the Directory, Link, Binary.
Below are some examples
Example = d---------
d = Directory
l = Link
b = Binary
The next 9 characters define the file permissions. These permissions are
given in groups of 3 each.
The first 3 characters are the permissions for the owner of the file or directory.
Example = -rwx------
The next 3 are permissions for the group that the file is owned by.
Example = ----rwx---
The final 3 characters define the access permissions for everyone not part of the group.
Example = -------rwx
There are 3 possible attributes that make up file access permissions.
r - Read permission. Whether the file may be read. In the case of a
directory, this would mean the ability to list the contents of the
directory.
w - Write permission. Whether the file may be written to or modified. For
a directory, this defines whether you can make any changes to the contents
of the directory. If write permission is not set then you will not be able
to delete, rename or create a file.
x - Execute permission. Whether the file may be executed. In the case of a
directory, this attribute decides whether you have permission to enter,
run a search through that directory or execute some program from that
directory
In addition to the file permission, you can also modify the owner and
group of the file. The chown program is used here and its syntax is very
simple. You need to be the owner of a file or root to do this.
Understanding Owner Permissions:
The first command is for owner ID, the Second Command is for Group ID.
exp. root.root ( First Root is owner, Second Root is Group ).
Chmod 644 some file, Like Build.prop For testing & then Veiw the Resulted Changes!
Refer to the table below as a quick reference.
Command Line for Both would look like this
chmod 644 build.prop = -rw-r--r--
\/
Chmod Guide
0 - ---
1 - --x
2 - -w-
3 - -wx
4 - r--
5 - r-x
6 - rw-
7 - rwx
SH Chown Guide
\/
chown root.root build.prop
root.root = Root
root.shell = Shell
Busybox SH Chown Guide
\/
chown 0.0 build.prop
0.0 = Root
0.2000 = Shell
I'll update the chmod with more with More Complex Commands Later
Side Note:Always set owner ( chown ) before Setting Permissions ( Chmod )!
Hope this Clears up things & is Helpful to everyone
~Eugene373​
Add adb to your path in Windows.
As has been explained above all it does is allowing your adb to be called out from any location.
To set it in windows you will need to add path to your adb.exe file to your PATH in widows XP or CLASSPATH in windows7.
You can find it in start->contro panel->system->advanced.
There is a tab called "Inviromental Variables".
Click on that tab and new window will pop up. New window has 2 field in it. We are interested in bottom field called "System variables".
Windows XP user should look for line with variable "Path".
Click that line and choose edit below. New pop up will apear and you can edit path line in there. You should add path to your adb.exe to that line.
Example.
I did install windows sdk in c:\android\android-sdx-windows so my adb.exe file is in that folder. I did add path to that folder in "Paht" line of system variables. Add path to your adb.exe after semicolon.
;c:\Location\of folder\where you have\adb exe file\
Save changes, apply them. Now you can use call for adb commands from any location.
Widows 7 users.
Same changed need to be appied as for Windows XP.
There is only one difference that that path in Inviromental variables in windows7 is called "CLASSPATH".
Rest is same. Just add the path to folder containing your adb.exe file to CLASSPATH line and you would be able to use adb in any location.
Hope this make sense and will help.
My mac keeps sayin no device but I can access adb from anywhere basically its in my path but won't pick up my phone
Sent from my PG86100 using XDA Premium App
snoopy1e11 said:
My mac keeps sayin no device but I can access adb from anywhere basically its in my path but won't pick up my phone
Sent from my PG86100 using XDA Premium App
Click to expand...
Click to collapse
Make sure your phone is in debugging mode.
ADB won't see phone if debugging is not enabled.
It is on
Sent from my PG86100 using XDA Premium App
I'm a windows user.
Can't think of anything else.
Sorry.
agat63 said:
Make sure your phone is in debugging mode.
ADB won't see phone if debugging is not enabled.
Click to expand...
Click to collapse
If you have USB debugging turned on, you should see a triangle with exclamation mark on task bar. Secondly, try to do this:
adb kill-server => kill off current server first
then
sudo adb devices => u need to enter password
Basically, you are running adb with escalated privilege, sometimes it needs root access.
This is Wat I got
Sent from my PG86100 using XDA Premium App
snoopy1e11 said:
This is Wat I got
Sent from my PG86100 using XDA Premium App
Click to expand...
Click to collapse
hmmm interesting...just wondering if you have your device turned on to be disk usage instead of just Charge Only?
Check on your desktop to see if you SD card had mounted, not sure if it makes a difference but worth a try. Another thought is that maybe your USB port doesn't work?? Did you check your phone to see if you have a triangle with exclamation mark in it on the task bar? (to the left)
Also, try it on a different computer if u can, and if it still doesn't work, afraid urs is defective.
I really appreciate ur help I re did the sudo command and hit "adb devices connect" and my device popped up
Sent from my PG86100 using XDA Premium App
snoopy1e11 said:
I really appreciate ur help I re did the sudo command and hit "adb devices connect" and my device popped up
Sent from my PG86100 using XDA Premium App
Click to expand...
Click to collapse
Ha, interesting cuz I never have to issue that command. Good to know you got it to work.

Hosts file

I am trying to update my hosts file and have done so on CM7.1RC1 (the best Rom so far), its proporly formatted as I do this all the time on my linux boxes but for some reason on my gtab it does not work. With oenvpn enabled and working I cannot reach items by name as stated in my hosts file.
Question .. does the /etc/hosts file work the same on the gtab as it does on all other operating systems? If so then ideas of what to look for to resolve this?
brwatters said:
With oenvpn enabled and working I cannot reach items by name as stated in my hosts file.
Click to expand...
Click to collapse
Try both pings (the android one in /system/bin and the busybox one in /system/xbin--you may only have one on some firmwares) to check.
Question .. does the /etc/hosts file work the same on the gtab as it does on all other operating systems? If so then ideas of what to look for to resolve this?
Click to expand...
Click to collapse
Yes--but programs have to use it. The busybox utilities all use it and the stock browser also; don't know about openvpn.
Are the permissions set correctly on /etc/hosts (actually, /system/etc/hosts)? It should be readable for all users.
The issue is that the hosts file (/etc/hosts) in GTab is readonly and the device has to be rooted to edit the file. Now I have not been able to root my GTab running Gingerbread. This makes it impossible to effectively use VPN to access the corporate network. I tried to create another hosts file in /system/bin folder but it would not let me save anything in that folder. Without being able to edit the /etc/hosts file VPN seems to be of limited value in GTab.
Any ideas?
There is no need to "root" a gTab running a custom ROM. If an "adb shell" command works, then you have root permissions. Same thing if you download and install the Superuser app from Market.
To edit /system/etc/hosts, install Root Explorer from the Market. This will let you remount /system read-write easily. Once remounted, just edit the hosts file.
To edit the hosts file on the command line:
Code:
C:\> [B]adb pull /system/etc/hosts .[/B] [I]Get the hosts file[/I]
[I]Edit the file on the PC[/I]
C:\> [B]adb remount[/B] [I]Remount /system read-write[/I]
C:\> [B]adb push hosts /system/etc/hosts[/B] [I]Put the file back[/I]
C:\> [B]adb shell chmod 644 /system/etc/hosts[/B] [I]Set the correct permissions[/I]
Reboot the tablet after this.

[Q] Linux/Android Question

I am adding some mod files and tweaks to an android 2.3.3 image. It is a Livesuit flashable image for the Alpha 2 Skypad. I use unimg.exe to extract the files then fileaddsum and unimg to repack the file under Windows.
I mount the extracted image in Linux Mint then make my changes. I have tried different tricks people have suggested to set the permissions of the file, but whenever I umount and repack the img, it will install, but I have to go into adb and chmod the files. I have written a simple command file so it only take a second, but being new to Linux I am not finding any way to set the permission when I copy over the files to the mounted image.
Any suggestions/ Thanks in advance.
bump..........................................
re-bump .............................................
Not sure if this will help, but in unix permissions are set with chmod. so to ad the exicutable permission you enter:
Code:
su
chmod a+x filename
exit
However if youve had suggestions on setting permissions, you must already know this?
matts95 said:
Not sure if this will help, but in unix permissions are set with chmod. so to ad the exicutable permission you enter:
Code:
su
chmod a+x filename
exit
However if youve had suggestions on setting permissions, you must already know this?
Click to expand...
Click to collapse
That wasn't working for me. But I found a cheat, I guess you could say. Once the image was open I would pull the files from the emulator or a pad directly to the image+folder. Not elegant but it worked.

Categories

Resources