I am trying to change some sys values but I don't seem to be having much success.
In my case I am trying to change values of files in the folder
"/sys/devices/platform/omap/musb-omap2430/musb-hdrc/usb1/1-0:1.0"
e.g. the file bInterfaceClass which currently has value 09
My tries:
(In shell, as root)
chmod 777 bInterfaceClass
echo 07 >> bInterfaceClass
I didn't receive an error but when looking up the value
cat bInterfaceClass
It is still 09
Now looking up this file in Root Explorer, I can see that the last modification date of the file has changed, so my guess: something resets the value of such a sys file as soon as it changes. Can anyone shine some more light on this issue? How can I change the value?
Many thanks!
THIS IS HACKERY, you have been warned! :)
Instructions here are not generally found on the Internet, but can be great for testing interfaces and capabilities without significantly changing system code. THESE CAN BE USED TO ADDRESS ANYTHING WHICH IS BEING OVERWRITTEN without warning or cause. Using these, you can sometimes see based off of using dmesg ps and logcatwhat exactly is causing you so many problems, while testing a solution.
The is likely in the Kernel with things like this getting written over, maybe a system service or script internally. A quality perm fix would be in the /drivers folder of the kernel. I can only assume this is on a Beagle or Panda Board, maybe a Moto device. If it is Beagle or Panda, this will be easier (yay Linaro, AOSP support, big community!).
If this is something that does not need to Hold USB open, but merely have the desired number present you can try below:
Open up your boot.img and open he Root Disk/Ramdisk and finally one of your init..rc files. You can use this tool: https://github.com/dsixda/Android-Kitchen - requires Linux and a few packages, great tool!
If you are lucky, this will appear as part of the init.rc files (which you can check in-system) or in the /system/etc folder as one of the class main or core scripts.
You can declare the value you want if you look for it in the:
on init
Section of the init.platform.rc and look where
/sys/devices/platform/omap/musb-omap2430/musb-hdrc/usb1/1-0:1.0
is initialized,
then in the .rc file
chmod 777 /sys/devices/platform/omap/musb-omap2430/musb-hdrc/usb1/1-0:1.0/bInterfaceClass
write /sys/devices/platform/omap/musb-omap2430/musb-hdrc/usb1/1-0:1.0/bInterfaceClass 07
Then if doing that and initializing it as such does not hold by that alone, open the normal init.rc and add
on nonencrypted
write /sys/devices/platform/omap/musb-omap2430/musb-hdrc/usb1/1-0:1.0/bInterfaceClass 07
and also
on property:vold.decrypt=trigger_shutdown_framework
write /sys/devices/platform/omap/musb-omap2430/musb-hdrc/usb1/1-0:1.0/bInterfaceClass 07
as those two properties or functions will cover you at the end of the inits to set that property again (you already gave it 777 privilages earlier as part of the on init)
If you want something you can play with without flashing new Boot.img files:
Declare your script in the system/bin as a service in the init.platform.rc (don't worry most every .rc file is linked and includes each other) using:
service usbchanger /system/bin/sh /system/bin/usbchanger.sh
class late_start
user root
disabled
Then in the normal init.rc
on nonencrypted
start usbchanger
on property:vold.decrypt=trigger_shutdown_framework
start usbchanger
Your script will then become a constantly running service (you can do the same with a binary). This is totally a desired trait when doing debugging and testing new features/fixes because you can change the values and running commands while the system is open and does not require you to re-flash after every change. However, for production you should not have this going. Its bad code to do that generally when really, it should be in the kernel or core.
Related
I'm switching from busybox to toybox in a customized Yocto.
After the switch I no longer have /dev/block/ populated.
I'd like to learn how /dev/block/bootdevice/by-name is populated?
Is this done by mdev?
The toybox mdev command is still in pending.
However, the /dev/block/bootdevice/by-name seems to be an Android feature which is using toybox irc.
In Android there are a couple of parts to this:
/dev/block/bootdevice is created by an init script, for example init.hardware.rc:
symlink /dev/block/platform/${ro.boot.boot_devices} /dev/block/bootdevice
In this case the ro.boot.boot_devices property is derived from the kernel command line argument set when the kernel image is built by BoardConfig-common.mk:
BOARD_KERNEL_CMDLINE += androidboot.boot_devices=soc/1d84000.ufshc
(All androidboot.* command line options are converted into ro.boot.* properties by init, see ProcessKernelCmdline()).
/dev/block/platform/* links are created by ueventd (which is part of the Android version of init). The function responsible for this is DeviceHandler::GetBlockDeviceSymlinks().
This function is also responsible for creating the /dev/block/platform/*/by-name links based on the partition names supplied by the kernel in the uevent. Not all partition schemes supply a partition name, for example GPT does while a DOS MBR partition table does not.
More recent versions of this function will also create generic links in /dev/block/by-name for partitions on the boot device. The boot device is again identified using the androidboot.boot_devices kernel command line option.
I have a driver compiled and running on hardware running Android 4.3. By running, I mean 'insmod gipc' loaded the driver and it ran through initialization. It assigned the major number 243 to the driver as evident in the /proc/devices files. The example code application is looking for the following two files
/sys/class/gipc/gipc1/name
/dev/gipc1
How should these files be created? Android does not have mknod and does not support udev. I do not really need the file in /sys/class, but without the file in /dev, I cannot access the driver.
I ended up using the following functions, class_create(), device_create(), and device_create_file() to accomplish this. Not sure if there is a more preferred way, or a way of having the files automatically created.
I've been pulling photos from my android device to my linux OS like this:
$ adb pull <what-to-pull> <where-to-place>
In the future I would prefer to pull only the ones I don't alreay have.
What's the best way to do this?
Maybe I could put all the photos I've downloaded to the same folder and skip the ones with names that already exist in the folder I'm pulling from? How to do that?
Is that even the best way? Does an easier way to do this exist?
If so... how?
I'm on arch linux by the way, in case the distribution effects your suggested answer.
adb shell find "/sdcard/DCIM" -iname "*.jpg" | tr -d '\015' | while read line; do adb pull $line; done;
^that works well enough.
From here.
The adb-sync tool worked for me: https://github.com/google/adb-sync
Note that I had to make several changes to the source code to get it working for my use-case (invalid paths for Windows causing crash, Python version mismatch apparently, etc -- for details, see issues I commented in), but it ended up being the only way I was able to retrieve my files from a corrupted data partition.
(The adb pull of the whole directory would crash on various files, and I didn't want to manually have to delete each one then restart the whole transfer. With adb-sync [+my modifications] it would just fail that one file then continue.)
Regarding your question of having it only transfer new files, I believe adb-sync does that automatically if a file hasn't been changed. If you don't want it to re-transfer an existent file ever (ie. even if the file has been updated), I think that's what the flag mentioned here is for: https://github.com/google/adb-sync/issues/22
I am currently working with multiple android builds on different hardware. I am having an issue where they all have the same serial number, 0123456789ABCDEF. This makes it impossible to use adb when I connected to two or more devices at once, because the adb doesn't know which one to talk to.
I know that the name is being pulled from /sys/class/android_usb/android0/iSerial and if I wanted to I could change it there once the build is complete. Ideally though, I want that file to be set during the build depending on the build settings. I want to know where that file is being generated during the build. I believe it's being set either somewhere in barebox or in /system/core/adb, but have had no luck on the things I've tried editing.
If anyone has ran into this, any help would be greatly appreciated.
Edit:
Found the solution.
This can be found in /device/company_name/device_name/init.device_name.usb.rc
on boot
write /sys/class/android_usb/android0/iManufacturer ${ro.product.manufacturer}
write /sys/class/android_usb/android0/iProduct ${ro.product.model}
write /sys/class/android_usb/android0/iSerial ${ro.serialno}
echo "ro.serialno is ${ro.serialno}"
write /sys/class/android_usb/android0/idVendor 0451
write /sys/class/android_usb/android0/idProduct D101
..."
Change the ro.serialno to whatever you'd like.
Can someone consider and evaluate my approach to customization of Froyo? I'm a beginner.
I've download the sources from Android website and i've successfull recompiled and run it on my (study) device.
Let's consider a trivial customization: on Settings activity the last choice is something like 'Info about the phone' but... my device is not a phone so i want to replace this string.
Once moved to [my froyo]/packages/apps/Settings/res/values i've edited the 'string.xml' file with the right value. At this point my problems begin...
Considering that i've the Java compiler, how can i recompile only the (i.e.) Settings apk and not the entire operating system (my solution has been to recompile the whole operating system)???
Once obtained the NEW Settings.apk, how can i upload it to my device substituting the previous (system) one? I've tryed 'adb install' with all the options but it fails; i've tryed 'adb unistall' on the previous (system) one but it fails as well. (my solution was to upload again the whole operation system).
In conclusion, how can i change a string from 'phone' in 'squirrel' without spending an hour? I want only to customize a little bit the system applications. I'd like to edit the source, try it on device and only once that all the customizations have been done recompile the operating system.
Okay lets start with the first question. To recompile a specific package you can just type
make <PackageName>
in your case it should be make Settings.
Then after the new package was compiled you will find it in the build directory.
copy the apk directly to the /system/app folder in your device and delete the /data/dalvik-cache/ entry for it and reboot the device, the new package should be loaded.
For making the /system partition writable you need to type
adb remount
But note that some Packages may have dependencies which might be needed for your customization. Something like the framework_res.apk