Hey devs.
I have a little question. Let's say I have an APK, like the TouchWiz launcher( just an example ). Obviously, if i push it to /system/app on an AOSP ROM, it won't work, because it is missing some dependencies, or my android version is too low.
So, how do I find out which dependencies an APK needs, what android version, etc.
Thanks, Joe.
Please use the Q&A Forum for questions Thanks
Moving to Q&A
That's all listed in the APKs AndroidManifest.XML. I think the minimum Android version is listed as MinSDKVersion or something.
To view an APKs AndroidManifest.XML, use a tool like Root Explorer. If you're using RE, just click on the APK and choose View, then long press on the AndroidManifest and choose the option for viewing it in a text viewer.
- chris
GodSlayer said:
Hey devs.
I have a little question. Let's say I have an APK, like the TouchWiz launcher( just an example ). Obviously, if i push it to /system/app on an AOSP ROM, it won't work, because it is missing some dependencies, or my android version is too low.
So, how do I find out which dependencies an APK needs, what android version, etc.
Thanks, Joe.
Click to expand...
Click to collapse
Google for "APK Analyzer"
Same question here. Root Explorer is not very handy for this task. And I can't find "APK Analyzer". I need a desktop application.
maximilliangreat said:
Same question here. Root Explorer is not very handy for this task. And I can't find "APK Analyzer". I need a desktop application.
Click to expand...
Click to collapse
Apk Analyzer is a windows desktop app from Sony. But its for developers. I find it easier to just read logcat for FC's which will mention a nullpointer or missing function, then do a full text search for said function in the fully decompiled ROM. Takes a while doing that but it always works if you know your way around smali.
Sent from my X10i using Tapatalk 2
Apk Analyzer is a windows desktop app from Sony.
Click to expand...
Click to collapse
Good application, but heavily developer oriented.
I need a much simpler (and faster) tool, to quickly preview required android version, application name and version. Functions used by application are less important to me.
maximilliangreat said:
Good application, but heavily developer oriented.
I need a much simpler (and faster) tool, to quickly preview required android version, application name and version. Functions used by application are less important to me.
Click to expand...
Click to collapse
All this stuff is about the dependencies scanning, for the application name/version/etc stuff see my EDIT: post at the bottom
As far as I know, there is no tool made to do this. The nature of the Java/DalvikVM programming is much like other languages, modular. When the Android OS boots up, it preloads all classes and functions into the dalvik cache and registry, and if a seperate package (APK or JAR) references that function then the system loads it when it needs it. Apart from examining the .java source, there is no "header" or "include" file to see what other packages the package depends on.
Take this example - this is taken from a smali file from deep in the framework.jar for AOSP ROM's:
Code:
invoke-static {}, Landroid/os/SystemClock;->uptimeMillis()J
This is from ./android/net/http/IdleCache.smali. It is requesting to run the "uptimeMillis()J" function from ./android/os/SystemClock, it does not reference which JAR or APK has it. In this case it's the same framework.jar file, but Android has no idea about this because the classes/functions are preloaded in one chunk when the OS boots. Technically, you could remove these SystemClock smali files from framework.jar and put them in a file named "scoobydoo.jar" and the function would still work fine.
What I am saying is, the names of APK's and JAR's are never referenced in the decompiled smali code of an APK - only (sometimes) in the java source. So in the case of reverse engineering i.e. porting apps from one ROM/device to another where building-from-source is not possible, you would need to search every single smali file for invokes, member classes, etc. and then do a full text search for those functions on a fully-decompiled ROM to see where those functions/classes are.
This is why it's easier to just grab the APK you want, dump it into the ROM, and see what happens. Run logcat, run the program, when it FC's then examine the Error or Warnings relating to that package. It will probably mention "nullpointer exception" or "unknown reference" or something, I can't remember the exact message - and also the name of the function, like "Lcom/android/somepackage/somefunction()L" which it couldn't find, which caused the FC. You then would do a full text-search on either all decompiled APK's/JAR's, or on the ones you have a hunch on, and merge that APK/JAR file in too. If the JAR/APK already exists though, then it gets complicated - you need to merge the function into the existing package. Sometimes this is very difficult.
As I said, if you give me an example APK and a Logcat of it crashing, I will help But what you are asking for is a Package Dependency-Walker, which currently doesn't exist for Android. Such a thing would be nice though, as it'd make hacking a kanging much easier - but its useless for android developers because the original source code/project already shows its' dependencies (or, if written properly, has its' dependencies already included in the projects' build tree).
EDIT: Finding the required Android version however is easy. Decompile the APK and open AndroidManifest.xml, near the top you'll see a line like this:
Code:
<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="10" />
Which means it's requires at least Froyo to run, but was targeted at Gingerbread MaintenanceRelease1 (2.3.3-2.3.4). For decoding the API integers, see here.
Application name and version are also in the manifest file. They commonly use values from the string table though (which looks like android:label="@string/app_name"), which means you need to search for that variable in (e.g.) ./res/values-en/strings.xml
Since there's now an Xposed Framework Module available to do this same thing, that is the much better way to go than modifying your framework-res.apk directly.
Check that out here http://repo.xposed.info/module/de.makuser.nexussms
-Original post follows-
I got tired of seeing several threads about this topic so I figured I would post a "How to", which should work on all ROMs and versions around.
This procedure is actually fairly simple, and if you have basic Android and computer knowledge you can do this.
What Does This Do?
On mobile-enabled tablets like the N7 3G and the N7 LTE, the device itself is capable of sending & receiving MMS and SMS messages. Maybe you've read about how Google Hangouts got the ability to do this not too long ago. However, if you excitedly downloaded and installed the new version, you may be like "What the hell is this?!?" because by default you cannot see any SMS-related options. In Jellybean and KitKat, a device has to be "a phone" before the system thinks the device is able to send SMS and MMS messages. However, its fairly easy to change this particular property on your device so that it self-identifies as a "phone" and you get access to SMS.
Important: You actually have to have SMS service to use SMS service. Even though it boggles my mind, people have actually sometimes been confused by this particular mod, and have asked me if it somehow gives you SMS service. It does not, it only gives you access to the software functionality to send and receive SMS messages.
Even More Bolded Text!: there is one exception to this. If you are using CyanogenMod 10.2 (or 11 if they have ported Voice+ to it, not sure at this time), you can use this mod in conjunction with Google Voice and the Voice Plus app. Voice+ allows you to send & receive messgaes via the Google Voice service behind the scenes, but on the front end you can use the stock MMS.apk, or the Google Hangouts app to do this. This does not involve modifying Google Hangouts, its just sort of "bridging" Google Voice and the native SMS handling so that your Google Voice texts act like regular SMS messages. Voice+ is part of the CyanogenMod project and you can read more about it here. It's honestly pretty nice if you're a Google Voice user, since the regular Google Voice app kindof sucks.
This procedure involves modifying a boolean setting in your device's framework-res.apk file. That may sound like gibberish to you, but its still not hard to get this done.
What You'll Need
This guide is written for people who use Windows. All the utilities I'll talk about in this guide are for Windows. I'm sure its possible to do this on Mac & Linux, but the main utility I use to make this easy (FrameWork Flasher) is for Windows.
-An archive manager. I recommend 7-Zip, since it is free, open source, and can handle basically every archive format known to man.
-FrameWork Flasher. I updated this application to work with KitKat, but am not the original creator. You can download the updated version from MediaFire. FrameWork Flasher was created by XDA's own Wes Foster, and you can see his original post here.
-Some kind of text editor. I use NotePad++
-An Android device with a custom recovery installed on it. "Custom Recovery" means like ClockWork Mod, or TWRP. You need this to flash your modded file back onto your device.
Got all your stuff together? OK, on with the How Tos.
How To Do This
The first thing you'll need to do is get a copy of your current ROM's framework-res.apk file. There are a variety of ways to do this. If you're running a custom flashable ROM, like CyanogenMod, the simplest way to go is to just download your ROM's flashable ZIP file onto your computer and then open it up in 7-Zip. The file should be located inside the ZIP in the system\framework folder. Just extract that to your Desktop, or wherever you're going to keep the files you're working on.
If you're running a "stock" firmware, probably the easiest way to get your current framework-res.apk is to copy it from your current tablet. Note: this method should always work regardless what ROM you are running, I just find it easier to pull the files out of the downloaded ZIPs on a computer. You'll need an Android file manager that allows you access to the entire file system, not just the "sdcard" type area. I use SolidExplorer, but Root Explorer would work just as well. Your goal is to get the file /system/framework/framework-res.apk on your Android device onto your computer. There are probably a dozen ways to accomplish this. Super noob method: just copy this file from its original location to your "Downloads" folder, then plug your device into your computer via USB and copy the file out of the Downloads folder and onto your computer using MTP. Another method would be to send it to yourself as an attachment on an email. Hell, Solid Explorer has a SMB/SAMBA client built into it, so if you know how to use that you can just push the file directly from its original location to a shared folder on your computer. If you need a step-by-step on how to accomplish this particular step, IMO you're not tech savvy enough to be doing this stuff.
Anyways, so you should now have the framework-res.apk file from your current ROM on your computer.
Download and unzip my FrameworkFlasher-MOD file. Inside the folder, you'll see several folders and files. You need to put the original framework-res.apk file in the "place-framework-res-here" folder (how inscrutible!). Then you can run RunMe.bat.
You should get a pop-up window with a simple text-based menu. You'll want to run Option 1. The program will process for a while, and then should end up at a "The APK has been decompiled successfully" message. You can press any key to continue. At this point its not a bad idea to just leave FrameWork Flasher running.
FrameWork Flasher should have unpacked all the resources from the APK into the folder "files-to-edit". You'll need to go into files-to-edit\framework-res.apk\res\values. Inside of their, you'll find a bunch of XML files. You need to open bools.xml in the text editor of your choice. You're looking for the line that says
<bool name="config_voice_capable">false</bool>
All you need to do is change false to true, so you should end up with
<bool name="config_voice_capable">true</bool>
Then, save the file and close your text editor and go back to FrameWork Flasher.
You'll now want to run through options 2, 3 and 4. After doing this, you'll have a file called "update.zip" in the "final-zip-file" folder. You'll need to put this onto your device and flash it.
If you've flashed ROMs before, I'd hope you know how to do this. As with the "get your framework file" step, there are many different possible ways to get the update.zip file onto your device. You could transfer via USB, over the network, via email, whatever.
Once you've got the file on your device, you flash it like you do any other flashable ZIP using CWM or TWRP. This ZIP should work with either recovery, and you do NOT need to clear cache or anything like that. Simply flash and then reboot your device.
NOTE FOR T-MOBILE USERS: Some T-Mobile customers, including me, get a "New Voicemail" notification on their device(s) with voice capable turned on. This is specifically a problem with the way your T-Mobile account was initially set up and/or provisioned. The device is correctly reporting the voicemail status it gets from your account. The problem is that T-Mobile sometimes puts the "Welcome to your new voice mailbox!" message into your inbox even if your voicemail is not turned on. As far as I know there's no way to fix this issue short of working with a T-Mobile tech to get them to fix it, which I haven't bothered trying to do given the weird nature of what I'm doing. In CM10.2 you can just swipe this message away. It occurs once and only once each time the device is rebooted. On the current builds of CM11, the voicemail notfication cannot be swiped away. This is a known bug in AOSP and was fixed in 4.4.2, so the fix should come to CM11 soon enough.
Forgot to mention, since this makes your device think its a "phone", if you install Dialer.apk, you can have access to the normal "Phone" app in your Apps drawer, and mess with SIP goodness
Also, for CyanogenMod users, your ROM probably did not come with some APKs that will make this more useful.
You CAN just use Google Hangouts as your SMS/MMS app, but some people may prefer to use the native CM app instead (it has those nice pop-up messages!). For that you need MMS.apk.
If you want to mess with the "Phone" functionality, you'll need Dialer.apk.
And finally, if you want to receive emergency notifications from the government (for like natural disasters and Independence Day-style alien invasions and stuff ) you'll need CellBroadcastReceiver.apk. Please note that none of these are needed for SMS functionality and all these APKs are from CyanogenMod and will not work on stock or other ROMs.
For CM10 Stable, I grabbed these APKs out of the Nexus 4 (mako) ROM, stuck them in a zip and uploaded them here.
On CM11-M1. same deal but I used the Nexus 5 (hammerhead) ROM as my source. Those are here.
These files just need to be placed into the appropriate folder(s) on your device and then you'll need to set the file ownership & permissions the same as the rest of the the stuff in there (owned by root:root, -rw-r--r-).
They all go in /system/app, except for MMS and Dialer on CM11. On KitKat they have introduce the new /system/priv-app folder. My ZIPs contain those directories to remind you where to put the stuff.
I'm not a Windows user and I'd love to modify my own (stock) framework-res.apk to re-enable SMS support. Do you know what tools FrameWork Flasher uses "behind the scenes" to decompile and recompile the apk?
I don't like the idea of tampering with framework-res.apk using apktool unless somebody can confirm that this is the right direction.
sbiriguda said:
I'm not a Windows user and I'd love to modify my own (stock) framework-res.apk to re-enable SMS support. Do you know what tools FrameWork Flasher uses "behind the scenes" to decompile and recompile the apk?
I don't like the idea of tampering with framework-res.apk using apktool unless somebody can confirm that this is the right direction.
Click to expand...
Click to collapse
APK Tool is indeed the right direction to take.
I actually had to update the binary of APK tool that Framework Flasher uses, since the one included in the original isn't new enough to know what JellyBean and KitKat are Since FrameWork Flasher is a Windows Batch Script, I'm certain its just automatically doing stuff in the command line you could be doing by hand.
Looking at the source, I think the deompilation is done with this command:
java -Xmx%heapn%m -jar apktool.jar d "../place-framework-res-here/framework-res.apk" "../files-to-edit/framework-res.apk"
"%heapn%" is a variable, which appears to default to the value of 64.
So the command
"java -Xmx64m -jar apktool.jar d "/path/toframework-res.apk" "/path/to/extract/to"
should work on Linux or Mac, provided you've got Java installed and the jar in the current working directory. Obviously change the paths to match your local stuff. Post how it works if you'd like, I'love to update the guide to include Mac / Linux instructions, and Framework Flasher is the only "Windows" part about it.
DivinityCycle said:
Post how it works if you'd like, I'love to update the guide to include Mac / Linux instructions, and Framework Flasher is the only "Windows" part about it.
Click to expand...
Click to collapse
Obviously I messed up the resulting framework-res.apk because it got stuck in a Zygote startup loop. It's worth noting that I built apktool from the latest git sources, so there might be some bugs lurking in the shadows.
Oh well, I'll just wait for somebody else to do the dirty work
sbiriguda said:
Obviously I messed up the resulting framework-res.apk because it got stuck in a Zygote startup loop. It's worth noting that I built apktool from the latest git sources, so there might be some bugs lurking in the shadows.
Oh well, I'll just wait for somebody else to do the dirty work
Click to expand...
Click to collapse
Well, if you send me your framework-res.apk I can mod it for you. Takes like 2 seconds
The Framework Flasher source code shows the following for the actual "do the work" steps:
To decompile the original APK-
java -Xmx%heapn%m -jar apktool.jar d "../place-framework-res-here/framework-res.apk" "../files-to-edit/framework-res.apk"
To compile the new APK-
java -Xmx%heapn%m -jar apktool.jar b %~dp0files-to-edit\framework-res.apk %~dp0place-framework-res-here\unsignedframework-res.apk
To sign the APK-
java -Xmx%heapn%m -jar signapk.jar -w testkey.x509.pem testkey.pk8 ../place-framework-res-here/unsignedframework-res.apk ../place-framework-res-here/signedframework-res.apk
To build the unsigned ZIP-
7za a -tzip %~dp0place-framework-res-here\unsignedframework-res.apk %~dp0temp-files\* -mx%usrc% -r
And finally, to sign the ZIP-
java -Xmx%heapn%m -jar signapk.jar -w testkey.x509.pem testkey.pk8 ../final-zip-file/update_unsigned.zip ../final-zip-file/update.zip
note: you do not actually need to sign the ZIP. You CAN flash a zip without a signature on it, its just that with signature you get verification that the file is intact, which isn't a bad idea.
In Batch's screwy syntax, %heapn% is the variable that contains the heap size, and it looks like the default heap size the script uses is 64 unless otherwise specified by the end-user.
Also, %~dp0 is just a path expansion expression used to give the full path to the target files where its used.
I'm pretty sure you can make use of the jar and key files inside the FrameWork Flasher zip file I attached to this thread. You can find them in the resources folder. Both apktool.ar and signapk.jar are necessary, and I'm pretty sure the testkey files are needed to do the digital signatures and make this stuff work. Hope that stuff helps
Your mediafire link is just another link to download 7zip, could you update it. Thanks.
deyanimay said:
Your mediafire link is just another link to download 7zip, could you update it. Thanks.
Click to expand...
Click to collapse
Damn you multi-tasking!!! sorry about that. Fixing it nao.
The link should be http://www.mediafire.com/download/jozlg1xy4vxiegb/FrameworkFlasher-MOD.zip
when I tried to use framework flasher option 1 it said
Framework Flasher 1.1.4 - by Wes Foster (wesf90)
Please read the "Help" section before using this script
--------------------------------------------------------------------------------
----
Compression: 9 Heap Size: 64mb
````````````````````````````````````````````````````````````````````````````````
````
Main Options (in order)
-----------------------------------
(1) Decompile APK
(2) Compile APK
(3) Sign APK
(4) Create and Sign update.zip
(5) Great News! (when your finished creating the zip)
Other Options
-----------
(10) Set Compression Level for APK's
(11) Set Max Memory Size (if you get stuck when decompiling/compiling)
(12) Read Logs
(13) About / How-to / Help
(99) Exit
--------------------------------------------------------------------------------
Choose the number corresponding to the option:1
(removing old files...)
(removing old files-to-edit...)
===============++ Decompiling the APK. Please, please be patient ++==========
=====
ECHO is off.
An error has occurred. Check the log for more info.
ECHO is off.
Press any key to continue . . .
Click to expand...
Click to collapse
I attached the log. I'm trying to do this with CM 11 M1 on my deb, windows 8. Any ideas?
edit: framework-res.apk i'm trying to decompile: https://www.dropbox.com/s/iqc3eniv0u51ytg/framework-res.apk
seems like this is a common problem (googled it echo off) but I havent found a solution that works
edit 2: just tried it on my windows 7 laptop with the same result
edit 3: tried doing this with the cm 10.2 framework-res.apk with the same result.
About the voice mail message. Have you tried to install T-mobile Visual Voicemail to see if it could download then delete the message? I don't know how this app works, it's just the first thing I thought of when I read your post.
Thanks for creating this quide. I tried the single steps of the guide two weeks ago (I described it here: http://forum.xda-developers.com/showpost.php?p=47928887&postcount=167), but always got a bootloop. (De-)compiling the framework succeeded without errors and I tried it with and without changing the build.prop. By now I have no clue what went wrong. Mabye you need a special version of apktool fitting the rom you want to patch ?
Paten said:
About the voice mail message. Have you tried to install T-mobile Visual Voicemail to see if it could download then delete the message? I don't know how this app works, it's just the first thing I thought of when I read your post.
Click to expand...
Click to collapse
I've tried this and it doesn't work. I guess the app can't properly add the visual voicemail service to that line. I've also asked T-mobile about it and they said that I don't even have a voicemail box to store messages so there is nothing they can do about it.
nsmart said:
Thanks for creating this quide. I tried the single steps of the guide two weeks ago (I described it here: http://forum.xda-developers.com/showpost.php?p=47928887&postcount=167), but always got a bootloop. (De-)compiling the framework succeeded without errors and I tried it with and without changing the build.prop. By now I have no clue what went wrong. Mabye you need a special version of apktool fitting the rom you want to patch ?
Click to expand...
Click to collapse
Same here, it appears that setting config_voice_capable to true triggers an NPE inside the Keyguard class (i.e. the system PIN entry dialog) which then in turn causes SystemUI to restart over and over.
Perhaps the answer lies somewhere in the changes between 4.4 and 4.4.2 inside the AOSP device tree for deb, but I don't have the time to do an extensive diff of everything that has changed between those two releases.
Has anybody succeded in modding the stock KOT49H build without side effects?
---EDIT---
Apparently @GuyAdams managed to do it. Question is, how
cheers mate, nice post etc, been trying to get this going the last few days (and trying the other posts I've seen you talking on) but so far no luck. I'm getting the same log error as the previous poster too.
cheers
running nexus 7 with cm11 latest nightly.
burpitt said:
cheers mate, nice post etc, been trying to get this going the last few days (and trying the other posts I've seen you talking on) but so far no luck. I'm getting the same log error as the previous poster too.
cheers
running nexus 7 with cm11 latest nightly.
Click to expand...
Click to collapse
Well that sucks! It looks like APKtool doesn't work on anything newer than 4.4. I was able to reproduce the errors by trying to decompile / recompile the framework-res.apk from stock 4.4.2. The current release of APKtool from Slimbean I found here on XDA Devs appears to not be new enough. The main attraction of FrameWork Flasher over other solutions was the extremely easy & rapid download & use (as opposed to the end user having to like go download and install the entire Android dev kit), and Virtuous Ten Studio can definitely do this job, but again it looks to be an order of magnitude more complex for the average user to use. I'm going to be a little busy today doing actual work, but I should be able to find the time to work on this other stuff as well. Frustrating!
Is this working for the rom here: http://forum.xda-developers.com/showthread.php?t=2545628
And what about the carrier dont they see you now making calls and texts on a line that is set to be a tablet?
curtdragon said:
Is this working for the rom here: http://forum.xda-developers.com/showthread.php?t=2545628
And what about the carrier dont they see you now making calls and texts on a line that is set to be a tablet?
Click to expand...
Click to collapse
Did you even read my post? At no point did I say anything about "making calls", and as stated in the OP, this simply turns on the software on the tablet that allows you to send & receive SMS/MMS messages. You have to have to actually have SMS service to send / received SMS messages.
Also as carefully stated in OP, using CM10 or CM11 means you can use Voice+ to make Google Voice messages act like regular SMS.
Last but not least, the most recent builds of Bruce's CM11 ROM (the one you linked to) already have this modification applied (as he explained in the most recent few posts).
DivinityCycle said:
Did you even read my post? At no point did I say anything about "making calls", and as stated in the OP, this simply turns on the software on the tablet that allows you to send & receive SMS/MMS messages. You have to have to actually have SMS service to send / received SMS messages.
Also as carefully stated in OP, using CM10 or CM11 means you can use Voice+ to make Google Voice messages act like regular SMS.
Last but not least, the most recent builds of Bruce's CM11 ROM (the one you linked to) already have this modification applied (as he explained in the most recent few posts).
Click to expand...
Click to collapse
Hey thanks for coming off as a douchbag. Do I even read? No, perhaps you've edited your post several times since i did. Not to mention the fact that your title reads "Enable SMS on any ROM" then you go on to say that it will also enable the voice portion of the phone. Finally I asked a legitimate question it he texts why? because with ATT i have a share plan. While the plan says it's unlimited talk and text then the data is shared each device is different on the account and priced differently as well.
Also if I wanted to use Google Voice to send text messages i would just do that. Voice+ sends
But as you said this is enabled in the ROm i am using so I will exit this thread now.
You really need work on your people skills.
I do not run framework flasher is not possible to have a zip ready to be flash? I have a nexus 7 2013 LTE with cm 11 kot49h.... Thanks
Inviato dal mio Nexus 7 utilizzando Tapatalk