Happening now! New Honor Phone Launch
FORUMS
Remove All Ads from XDA

[GUIDE]Porting ARMv7 roms to ARMv6 devices

588 posts
Thanks Meter: 401
 
By Hikari, Senior Member on 13th October 2012, 05:07 PM
Post Reply Email Thread
I believe many people wanted to learn how to do this. Well I was one of them until a while ago..
First of all I want to Thank Lens_flare for his awesome MIUIv4 porting guide! I actually learned porting after following his guide..


Anyways,
WHAT YOU'LL NEED:

LET'S BEGIN!

Now ,I don't want to write the instructions on how to make a basic port as rishabh has already written one over here(Don't forget to thank him!). My actual purpose was to make a support post in his thread as a further info on porting but the info which needed to be written was way too big so I decided to post a new thread.. Anyways, follow his guide to get over with the simple porting process .. I highly recommend you to use dsixda's Android Kitchen. It will help a lot in porting. (from deodexing to easily unpacking/re-building ROM zips, signing, zipaligning apks, etc. etc.)

The actual porting begins now!..
I assume you already got built your zip following the above given guide, now we can go on..
Firstly flash the zip you built. It will obviously not boot.. so called 'bootloop'... What we are going to do is to observe the logcat and find errors causing bootloop, and fix them..

COMPARING AND PATCHING/DIFFING
We are going to fix errors by finding the error causing .smali files by observing the log (There might of course be other factors for a bootloop, but that doesn't interest us yet. If in the porting process we get different kind of errors we are goin to look into them then..)
Please look below at "UNDESTANDING LOGS AND DEBUGGING" section for better understanding of logcat and what we are gonna do exactly!

Patching?? What's that?
Quote:
Originally Posted by Lens_flare

Patching (usually named diffing, diff that means "find differences and eliminate them") in our context is a process of comparing two files and adding contents of one of them to another and not replacing anything.

OK! Let's imagine logcat gave us this info;
Code:
E/dalvikvm( 8925): ERROR: couldn't find native method
 
E/dalvikvm( 8925): Requested: Landroid/content/res/AssetManager;.splitThemePackage:(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)I
 
E/JNIHelp ( 8925): RegisterNatives failed for 'android/content/res/AssetManager', aborting
I'm pretty sure you can all see
Code:
android/content/res/AssetManager
and
Code:
ERROR: couldn't find native method
these show us that there is a missing native method in AssetManager.smali file under android/content/res of framework.jar

Now, I assume you already got apktool set up, we should decompile both base framework.jar(the one in the base rom, obviously) and port framework.jar(the one you are porting). Rename the base framework.jar file to "framework_base.jar" and leave the port stay "framework.jar" and put them in apktool directory..

Run a cmd, cd to the apktool directory and decompile the jars by typing
Code:
apktool d framework.jar
Code:
apktool d framework_base.jar
Once the de-compilation is finished you will get two folders in the apktool directory. One "framework.jar.out" and the other "framework_base.jar.out"

Navigate to "smali/android/content/res" in both the folders and find AssetManager.smali.
Get your comparison tool opened up and import the base AssetManager.smali to one side and the port to the other.
Now, you can start adding missing stuff.. NOTE: While patching AssetManager.smali, DO NOT REPLACE ANYTHING! JUST ADD MISSING LINES!!

Ok after you make sure you have added missing lines, save files and close the program.
Switch back to apktool and recompile the port framework.jar by typing the following command:
Code:
apktool b framework.jar.out
OK! you are good to go. Now either put this in a small flashable.zip for sake of time. or put it in your WORKING_FOLDER and rebuild the whole zip. Flash it and you shouldn't see the AssetManager.smali error any more.

But wait! You didn't think you would get you Port booting? did you? Well, if you did you were to be happy too fast! You are going to face this kind of errors again and again.. Then sometime you'll see you rom booting and will be the happiest guy

Anyways, when you see other similar errors just apply the same technique to them. The technique of "patching"!
Porting ARMv7 to v6 might throw up some other errors except smali files. If something happens and you can't fix feel free to post a log here I'll do my best to solve it. If I cant, then I hope some others, more experienced people can contribute..

UNDERSTANDING LOGS AND DEBUGGING
This section is a slightly modified version of the "understanding logs and debugging" section of Lens_flare's guide on MIUI porting(make sure you thank him too!) to better fit our purpose.. (I've got his permission)

I've put his word under this show/hide button for a cleaner thread

Most likely people are going to forum and just posting logcat (that might contain common error). My goal is show you - logcat is not you should fear to see!
First of all, let's assume something:
  • adb - powerful tool, in our case the must have thing to make a log. Article on android devs most likely describes all the moments about adb power: http://developer.android.com/tools/help/adb.html
  • logcat/log - one of the android advantages that allows you to debug what's going on with your system. by "make log" I will assume issuing
    Code:
    adb logcat >log.txt
    command, last argument - log.txt is a text file with log system provided to you (you could use any name).
  • debug/debugging - process of analyzing code which helps to eliminate bugs (that's why de-bug)
You could also use ddms instead, it has a nice GUI. You can find the logcat at the right bottom of the ddms window..

Some people experiencing problems with log, most common are:
-no/corrupted/wrong usb drivers on PC
-Windows most likely is about new usb subsystems etc, so advice is the only one - try on ubuntu (not working without udev rules)
-somewhat corrupted/inconsistent usb port
Note: if your log only consists of:
Code:
link system/bin/sh failed: no such file or directory
or something like that, you should contact a CM dev, else, you are most likely know what happened ;]
Alright when we got a log, it consist of many many lines that are looping if your system not boots. That's why it is sometimes called bootloop. System may repeat a error eternal time it lives, so log might be huge.
To parse what's going on there are some advice:
keywords:
search in log you got some keywords, that might be useful on debugging boot issue;
most common keywords are:
  • "E/" - error
  • "E/dalvikvm" - possibly crucial system error
  • "No such file or directory" - says it all
  • "couldn't" - android likes that, mostly shows faulty things.
  • "fail"/"failed" - mostly crucial error
  • "W/"/"warning" - says it all, but not always warm could be a boot failure cause
  • "exception"(especially NullPointerException) - points you that something went wrong in framework or application work
I/ tags could be also useful at debugging, but most helpful are errors and warnings.
Most common constructs:
"couldn't find native method", the most common reason of a bootloop.
For instance:
Code:
E/dalvikvm(  100): ERROR: couldn't find native method
E/dalvikvm(  100): Requested: Landroid/view/GLES20Canvas;.nStartTileRendering:(IIIII)V
E/JNIHelp (  100): RegisterNatives failed for 'android/view/GLES20Canvas', aborting
Let's parse that construct to extract parts we will fix.
First of all. smali path might be extracted from that line:
Code:
E/JNIHelp (  100): RegisterNatives failed for 'android/view/GLES20Canvas', aborting
->
Code:
android/view/GLES20Canvas
that's it, smali we are looking for is GLES20Canvas.smali. But.. android/view.. where it is? Answer comes from android source, it took some time to analyze frameworks.. Just let's assume: all that starting with "android" in path belongs to framework,jar.
What if path doesn't contain "android" at the beginning?
Again the answer is in source. Paths like"org/" are belong to framework.jar.
"com/android/server" - services.jar (there is the same folder at framework.jar but most likely you don't need to touch it).
another place we could be mixed up:
"com/android/internal" - framework.jar
"com/android/internal/policy/impl/" - android.policy.jar
for framework.jar path ends up on internal, which represents telephony folder. policy/impl is the only android.policy.jar folder.
Other frameworks are actually not used in port as they contain core android functionality which is common.
Note about smali you found:
  • it might be not smali you are looking for, most likely when code points you to android functionality and widgets (control elements) like combobox or listview, it's a sign to think twice what have you done on your system to port it
  • it might be tree of smali, to ease of use, always replace smali with its tree, and only if error becomes worse, think about single smali or about diff )
from
Code:
E/dalvikvm(  100): Requested: Landroid/view/GLES20Canvas;.nStartTileRendering:(IIIII)V
we could extract a method which is missing - nStartTileRendering. In some cases only that method should be added and nothing more.
" Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1)"
Hope all of you heared about C language. That error is a form of C "exceptional case"(in other words - exception).
You will see if it happen:
Code:
F/libc    ( 2698): Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1)
I/DEBUG   (  130): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG   (  130): Build fingerprint: 'tmous/htc_doubleshot/doubleshot:4.0.3/IML
74K/275847.101:user/release-keys'
I/DEBUG   (  130): pid: 2698, tid: 2698  >>> zygote <<<
I/DEBUG   (  130): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadbaa
d
I/DEBUG   (  130):  r0 deadbaad  r1 00000001  r2 a0000000  r3 00000000
I/DEBUG   (  130):  r4 00000000  r5 00000027  r6 4086fbfd  r7 00000036
I/DEBUG   (  130):  r8 40253f04  r9 40233a7e  10 0000904c  fp 00009062
I/DEBUG   (  130):  ip 4028b240  sp befcfa60  lr 401043c1  pc 40100adc  cpsr 600
00030
I/DEBUG   (  130):  d0  2f64696f72646e61  d1  2f746e65746e6f63
I/DEBUG   (  130):  d2  657373412f736572  d3  726567616e614d74
I/DEBUG   (  130):  d4  0000d4cc0000d4b1  d5  0000d4e80000d4cd
yaa.. ENORMOUS code block, build fingerprint, fatal signal and stack trace.. welcome to hell
One little thing: error is right above that block, don't even try to parse its contents, ignore it.
"Unable to extract+optimize DEX from '/system/framework/framework.jar'" and other WTF cases
examples:
Code:
D/dalvikvm( 103): DexOpt: --- BEGIN 'framework.jar' (bootstrap=1) ---
E/dalvikvm( 172): Duplicate class definition: 'Landroid/media/MediaRecorder;'
E/dalvikvm( 172): Trouble with item 2900 @ offset 0x17a86c
E/dalvikvm( 172): Cross-item verify of section type 0006 failed
E/dalvikvm( 172): ERROR: Byte swap + verify failed
E/dalvikvm( 172): Optimization failed
W/dalvikvm( 103): DexOpt: --- END 'framework.jar' --- status=0xff00, process failed
E/dalvikvm( 103): Unable to extract+optimize DEX from '/system/framework/framework.jar'
D/dalvikvm( 103): Unable to process classpath element '/system/framework/framework.jar'
E/JNIHelp ( 103): Native registration unable to find class 'android/debug/JNITest', aborting
Code:
05-30 14:15:15.970: E/NetworkLocationRealOs(2304): no android ID; can't access encrypted cache
05-30 14:15:15.970: E/NetworkLocationRealOs(2304): java.io.IOException: no android ID; can't access encrypted cache
Code:
1012: 	07-03 03:28:21.350: E/System(1538): ************ Failure starting core service
07-03 03:28:21.350: E/System(1538): java.lang.NullPointerException
07-03 03:28:21.350: E/System(1538): at com.android.server.pm.PackageManagerService.grantPermissionsLPw(PackageManagerService.java:4299)
07-03 03:28:21.350: E/System(1538): at com.android.server.pm.PackageManagerService.updatePermissionsLPw(PackageManagerService.java:4247)
07-03 03:28:21.350: E/System(1538): at com.android.server.pm.PackageManagerService.<init>(PackageManagerService.java:1170)
07-03 03:28:21.350: E/System(1538): at com.android.server.pm.PackageManagerService.main(PackageManagerService.java:858)
07-03 03:28:21.350: E/System(1538): at com.android.server.ServerThread.run(SystemServer.java:167)
07-03 03:28:21.350: I/SystemServer(1538): Input Method Service
07-03 03:28:21.360: W/SystemServer(1538): ***********************************************
1021: 	07-03 03:28:21.370: A/SystemServer(1538): BOOT FAILURE starting Input Manager Service
1022: 	07-03 03:28:21.370: A/SystemServer(1538): java.lang.NullPointerException
1023: 	07-03 03:28:21.370: A/SystemServer(1538): at android.app.PendingIntent.getBroadcast(PendingIntent.java:293)
1024: 	07-03 03:28:21.370: A/SystemServer(1538): at com.android.server.InputMethodManagerService.<init>(InputMethodManagerService.java:548)
1025: 	07-03 03:28:21.370: A/SystemServer(1538): at com.android.server.ServerThread.run(SystemServer.java:271)
1026: 	07-03 03:28:21.400: E/AndroidRuntime(1538): Error reporting WTF
1027: 	07-03 03:28:21.400: E/AndroidRuntime(1538): java.lang.NullPointerException
1028: 	07-03 03:28:21.400: E/AndroidRuntime(1538): at com.android.internal.os.RuntimeInit.wtf(RuntimeInit.java:345)
1029: 	07-03 03:28:21.400: E/AndroidRuntime(1538): at android.util.Log$1.onTerribleFailure(Log.java:103)
1030: 	07-03 03:28:21.400: E/AndroidRuntime(1538): at android.util.Log.wtf(Log.java:278)
1031: 	07-03 03:28:21.400: E/AndroidRuntime(1538): at com.android.server.ServerThread.reportWtf(SystemServer.java:77)
1032: 	07-03 03:28:21.400: E/AndroidRuntime(1538): at com.android.server.ServerThread.run(SystemServer.java:274)
mostly likely is about way assembling framework files. Also some of them might be just corrupted by accident. Sometimes these errors caused by wrong smali replacement or wrong diff methodology. Or it might be just banal reason - no place in system or cache partitions.
English []
Most log parts are in mere, not technician English,log might be read as little book with bright characters. Find what you are looking for and fix it..
Source code is your best friend in porting
I'd recommend to have an android source code [from internet or on your local PC] to port something that outstands of rules I listed. For example CM frameworks source could be found here: https://github.com/CyanogenMod/android_frameworks_base .
Any log line represents a line of code in source, that one could search and debug from there. Each smali represents a java source code or its part(- subclass which is signed by $), each java is in frameworks folder on source (mostly frameworks/base). Log line is a message, which formed with C rules about these rules, so you have to avoid ciphers or guess how could code represent that message. You may search guessed line in source to locate java file, or locate it manually according to smali location and my advice and search in it.


I WISH YOU A SUCCESSFUL AND HAPPY PORTING PROCESS!!
The Following 24 Users Say Thank You to Hikari For This Useful Post: [ View ] Gift Hikari Ad-Free
 
 
13th October 2012, 05:28 PM |#2  
AiphNday's Avatar
Senior Member
Flag Bandung
Thanks Meter: 89
 
More
wow,i've been looking for this for longtime..
gonna try it now..


Sent from my GT-S5660 using Tapatalk 2
13th October 2012, 05:32 PM |#3  
Hikari's Avatar
OP Senior Member
Flag Sarajevo
Thanks Meter: 401
 
More
Quote:
Originally Posted by AiphNday

wow,i've been looking for this for longtime..
gonna try it now..


Sent from my GT-S5660 using Tapatalk 2

Good Luck!
The Following User Says Thank You to Hikari For This Useful Post: [ View ] Gift Hikari Ad-Free
13th October 2012, 05:34 PM |#4  
AiphNday's Avatar
Senior Member
Flag Bandung
Thanks Meter: 89
 
More
Quote:
Originally Posted by XiproX

Good Luck!

thanks..
you dont mind if i send you a PM to ask for help dont you??


Sent from my GT-S5660 using Tapatalk 2
13th October 2012, 05:51 PM |#5  
Hikari's Avatar
OP Senior Member
Flag Sarajevo
Thanks Meter: 401
 
More
Quote:
Originally Posted by AiphNday

thanks..
you dont mind if i send you a PM to ask for help dont you??


Sent from my GT-S5660 using Tapatalk 2

Well, its better to ask here. Some other people having the same issue might benefit from your question and its answer...
13th October 2012, 05:57 PM |#6  
AiphNday's Avatar
Senior Member
Flag Bandung
Thanks Meter: 89
 
More
Quote:
Originally Posted by XiproX

Well, its better to ask here. Some other people having the same issue might benefit from your question and its answer...

sure,i'll do that..


Sent from my GT-S5660 using Tapatalk 2
13th October 2012, 06:57 PM |#7  
Peteragent5's Avatar
Senior Member
Flag Richmond
Thanks Meter: 2,046
 
Donate to Me
More
Info 2
Do not use dsixda's Kitchen to port. Use it for anything else except porting.
It's best to do your ports Manually, or make a tool yourself to do it automatically for you.
That way, you'll know what your doing and how to fix the upcoming errors.

Try not to use apktool to decompile JARs. Because inside JARs are classes.dex
You want to rename the classes.dex to anything you want, then decompile it using smali/baksmali:
Code:
java -jar baksmali-1.4.0.jar -a 10 classes.dex -o classes_output
The -a switch determines the api level. See more here

Try not to refer the technique as "patching", instead, call it "diffing". It's just more common

P.S Nice job on the Guide. Could be a little more detailed..
The Following 4 Users Say Thank You to Peteragent5 For This Useful Post: [ View ] Gift Peteragent5 Ad-Free
13th October 2012, 07:55 PM |#8  
AiphNday's Avatar
Senior Member
Flag Bandung
Thanks Meter: 89
 
More
Quote:
Originally Posted by Peteragent5

Do not use dsixda's Kitchen to port. Use it for anything else except porting.
It's best to do your ports Manually, or make a tool yourself to do it automatically for you.
That way, you'll know what your doing and how to fix the upcoming errors.

Try not to use apktool to decompile JARs. Because inside JARs are classes.dex
You want to rename the classes.dex to anything you want, then decompile it using smali/baksmali:

Code:
java -jar baksmali-1.4.0.jar -a 10 classes.dex -o classes_output
The -a switch determines the api level. See more here

Try not to refer the technique as "patching", instead, call it "diffing". It's just more common

P.S Nice job on the Guide. Could be a little more detailed..

wait,i dont get it..
classes.dex was inside the framework.jar right??
so i have to decompile the jar first to get the classes.dex,or just simply take the classes.dex inside the jar using 7zip then decompile the classes.dex with smali/baksmali??

Sent from my GT-S5660 using Tapatalk 2
13th October 2012, 07:58 PM |#9  
Peteragent5's Avatar
Senior Member
Flag Richmond
Thanks Meter: 2,046
 
Donate to Me
More
Quote:
Originally Posted by AiphNday

wait,i dont get it..
classes.dex was inside the framework.jar right??
so i have to decompile the jar first to get the classes.dex,or just simply take the classes.dex inside the jar using 7zip then decompile the classes.dex with smali/baksmali??

Sent from my GT-S5660 using Tapatalk 2

classes.dex is what make the JAR file.

Do not decompile the JAR

Just simply extract the classes.dex inside the JAR with any Archiver, then decompile it using baksmali

After recompiling, you should sign the JAR file.
The Following User Says Thank You to Peteragent5 For This Useful Post: [ View ] Gift Peteragent5 Ad-Free
13th October 2012, 08:01 PM |#10  
Hikari's Avatar
OP Senior Member
Flag Sarajevo
Thanks Meter: 401
 
More
Quote:
Originally Posted by Peteragent5

Do not use dsixda's Kitchen to port. Use it for anything else except porting.
It's best to do your ports Manually, or make a tool yourself to do it automatically for you.
That way, you'll know what your doing and how to fix the upcoming errors.

Try not to use apktool to decompile JARs. Because inside JARs are classes.dex
You want to rename the classes.dex to anything you want, then decompile it using smali/baksmali:

Code:
java -jar baksmali-1.4.0.jar -a 10 classes.dex -o classes_output
The -a switch determines the api level. See more here

Try not to refer the technique as "patching", instead, call it "diffing". It's just more common

P.S Nice job on the Guide. Could be a little more detailed..

Well, thanks! I don't have a huge experience at porting. but you know many people want to know how to port ARMv7 -> v6.. and there wasnt any tutorial for it.. I decided to write this as a beginning. Im open to any kind improvements.
13th October 2012, 08:10 PM |#11  
Peteragent5's Avatar
Senior Member
Flag Richmond
Thanks Meter: 2,046
 
Donate to Me
More
BTW, has anyone found a file comparison tool to exclude specific values like: .line foo

Please let me know! It'll help a lot in my porting, as well as with everyone else's
Post Reply Subscribe to Thread

Guest Quick Reply (no urls or BBcode)
Message:
Previous Thread Next Thread
Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes