Sorry for the delay as I have something to attend after works
First thing first: this totally depends on the root method provided by jersacct in this thread. All the credit to him and others who has helped during the adventure.
Technical details about how to make installation works:
As we all know that ApplistUpdate.apk contains whitelist zip and will install the whitelist.xml in /data/system/ folder. But changing that file didn't seem have any impact, as several of us tried it before. I have searched the whole file system trying to find the files that might be used to control the installation but to no avail.
So I decided to decompile some of the apks and frameworks. The process is quite tedious as the decompilation was not always working, especially for the frameworks. I have tried a few tools but still not 100% working. But luckily I just got enough decompiled code to analyze the logic of whitelisting. After studying the code, here are some findings:
- The "whitelist" system service (in /system/framework/framework.jar/odex) provides the service for other apps to check "whitelist" functionality. It doesn't do much itself except forwarding the call to WhiteListManager.
- The WhiteListManager provides the core functions related to apps installation/permissions and is in /system/framework/services.jar/odex. It loads /system/data/whitelist.xml file during system boot-up. It has the following functions:
- checkInstallPermission()
- checkAddinApplication()
- getRegulationMode()
- checkAudioFlag()
- getAudioStreamType()
- checkRevertFlag()
[highlight]The function checkInstallPermission() is called when app is installed. For 3rd party apps, it will compare the apk signatures to the keyStore values loaded from whitelist.xml.[/highlight]
After lots of tries, I finally managed to create the correct signatures for my test app and I was able to get the "Install" button enabled for my test app!!!
Here are the lines added to whitelist.xml for my test app:
Code:
<application>
<property>
<name>TestApp</name>
<package>com.purespin.testapp</package>
<versionCode>1-999999999</versionCode>
<keyStoreLists>
<keyStore>308201e53082014ea003020102020454d05fc1300d06092a864886f70d01010505003037310b30090603550406130255533110300e060355040a1307416e64726f6964311630140603550403130d416e64726f6964204465627567301e170d3135303230333035343232355a170d3435303132363035343232355a3037310b30090603550406130255533110300e060355040a1307416e64726f6964311630140603550403130d416e64726f696420446562756730819f300d06092a864886f70d010101050003818d00308189028181009c29ce69a49970e1c26f36c5cbd4051f384b07701e481bcd5563aa5f9952f9ac26aecdee8807de4202ea7cd94a6088d96ef6133d927375759d983777a6f655d08a1e055ce44413dd751a04a407b4773f904abf268faea3ba3de6ae8714c71620dd641d5cbd2deff2e8826aab1f62e3a62e7838a988548d2f76b5e59a35bc9d7d0203010001300d06092a864886f70d0101050500038181004822e80b27a715cd17ee08fa13592e7c18dde93443c1a26d04c80dcbd908e69f2d846a37e397246a64430d858b602a7e7befd77451e7e159de07225d5585e470680acbea0791970bc85f537f7034a5b37ef8fa9f555938d79748fe479c535c9a21cabe3979df15a6ac4428055ae1ad309f5106770223514f2c434447d62c37ca</keyStore>
</keyStoreLists>
</property>
<controlData>
<withAudio>without</withAudio>
<audioStreamType>null</audioStreamType>
<regulation>null</regulation>
<revert>no</revert>
</controlData>
</application>
The rest are pretty straightforward, just get the signatures for any app you want install and add it to the whitelist.xml, upload it to HU, reboot and it can be installed.
What have been tested?
I tried some apps and they all can be installed and launched:
- Waze (3.9.9) is running perfectly within 5km test drive without data. I have launched it for a few minutes before going out. So it probably downloaded some maps to cache while still connecting to home wifi.
- HERE/Sygic can be installed and launched but having some problems. The settings page is blank in HERE so I can't choose external USB as the storage. Sygic asked to download maps after launch. So I just uninstalled these 2.
- Spotify is running fine too. But there is no setting to choose external USB as the offline storage (the same version on my phone does have the setting option).
- Kodi is working great. I can even playback video while driving. I know this is illegal but hey! I just want to have some fun . I think this can be disabled by the restrictions settings in the whitelist.xml.
Now the biggest challenge is the storage space. Part of the internal storage is mounted as /sdcard and all the USB ports are mounted as /mnt/usb?. So far all the apps cannot use the USB drives (ES File Explorer can read/write to USB but all the other apps can't recognize the USB as a valid external storage). After installing a few apps, I got warning saying "not enough storage". That's why I had to uninstall HERE/Sygic and didn't play with it much.
I think the whole process to get the signature from apk, update whitelist.xml and upload it to HU can be automated by writing a simple app, just like what S_Mike did for the EU versions. But given the limited internal storage space, it is low priority now.
Note that all the apps are installed under /data/app/ folder, not under /system/app/ folder. But to my surprise, the installed apps have all the "root" privilege. For example, ES File Explorer can open /data/system/whitelist.xml, which is only rw by the root user. It can even edit and write to the file!!! [highlight](I guess one has to be very careful when someone just play around! They can easily brick the HU!!!)[/highlight]
Quick Test
Sorry for the long story. For someone just need a quick test, you can download the attached whitelist.xml and follow these steps (You should compare the content of it with the original one in your HU to see the differences):
Steps:
- Root your HU by following the instruction in the original post in this thread.
- adb push whitelist.xml /data/local/tmp/
- adb shell
- su
- cd /data/system
- cp whitelist.xml whitelist.xml.original
- cp /data/local/tmp/whitelist.xml .
- reboot
After reboot, insert a USB with the following apks and try the "USB install" app to install:
- com.purespin.testapp
- com.waze
- com.spotify.music
- org.xbmc.kodi
- com.estrongs.android.pop
- com.sygic.aura
- com.here.app.maps
- com.tinusapps.gpsspeedo
- oops.ledspeedometer
- com.eclipsim.gpsstatus2
- com.rechild.advancedtaskkiller
For other apps
Download the attached GetAndroidSig.jar file and run it against the apk you want to install:
Code:
java -jar GetAndroidSig.jar abc.apk
it will print out the signatures for the apk. Add them to the whitelist.xml together with app name and package name. See the attached whitelist.xml for examples. If there are more then 1 signatures, you need to add them all. Check the HERE WeGo example in the xml file.
That's all the info I have now. Let me know if you run into any issue or have any question.
Warnings: I'm not responsible for any damage of your head unit. Use it for your own risk.