06 กรกฎาคม 2553

ลองแก้ปัญหากดลิ้งค์ภาษาไทยใน Android 2.1 ไม่ได้

หลังจากได้ Samsung Galaxy S มาเล่นอาทิตย์กว่าๆ ก็เจอปัญหาเรื่องการกดลิ้งค์ที่เป็นภาษาไทยใน browser คือมันจะขึ้นกรอบไม่ตรงกับลิ้งค์ ทำให้ถ้าจะไปลิ้งค์นั้นจะลำบากมาก หรือไปไม่ได้เลย

เท่าที่ลองหาดูใน google ก็เจอว่ามันเป็นปัญหาของ webkit ซึ่งจากที่ไปดูใน source code ของ android ก็เห็นว่าใน froyo มี commit แก้ไขไปแล้ว แต่ทีนี้ Galaxy S ของเรามันดันเป็น eclair อยู่ แล้ว Samsung ก็ยังไม่มีทีท่าว่าจะออก firmware fix มาซะที ดังนั้นเรามาแก้เอาเองดีกว่า!!! :)

อ่านดูตามเว็บบอร์ดเห็น android ยี่ห้ออื่นเค้ามีวิธีแก้โดยไป compile webkit ใหม่แล้วเอาไฟล์ libwebcore.so ไปทับของเดิมใน /system/lib แล้วก็รีบูต... ท่าทางง่ายดี หุหุหุ

เริ่มต้นก็ไปโหลด source code ของ android มาก่อน โดยทำตามหน้านี้ http://source.android.com/source/download.html อย่าลืมว่าต้องลง required packages ให้ครบ

mkdir mydroid
cd mydroid
repo init -u git://android.git.kernel.org/platform/manifest.git -b android-2.1_r1
repo sync

อันนี้คือใช้ tag android-2.1_r1 ไม่รู้ว่าตรงหรือเปล่า เห็นมี 2.1 หลาย tag เหมือนกัน
จากนั้นก็แก้ไฟล์ ใน external/webkit/WebCore/platform/graphics/android/FontAndroid.cpp ด้วย patch นี้

--- a/WebCore/platform/graphics/android/FontAndroid.cpp
+++ b/WebCore/platform/graphics/android/FontAndroid.cpp
@@ -188,7 +188,7 @@ FloatRect Font::selectionRectForComplexText(const TextRun& run,
SkScalar spacing = paint.getFontMetrics(&metrics);

return FloatRect(point.x(),
- point.y() - floorf(SkScalarToFloat(-metrics.fAscent)),
+ point.y(),
roundf(SkScalarToFloat(width)),
roundf(SkScalarToFloat(spacing)));
}

แล้วก็ compile กันเลย!!

make

....ผล.....
compile ผ่านโลด ใช้เวลาประมาณชั่วโมงครึ่งบน Thinkpad คู่ใจ ได้ไฟล์ libwebcore.so ตามต้องการอยู่ใน out/target/product/generic/system/lib ก็เลยจัดการ copy ไปทับของเดิมในน้อง S แล้วก็ reboot ซะ

adb push out/target/product/generic/system/lib/libwebcore.so /sdcard
adb shell
su
cd /sdcard
cp /system/lib/libwebcore.so libwebcore.so-bak
cat libwebcore.so > /system/lib/libwebcore.so
reboot

ลองรัน browser ดูปรากฎว่าขึ้น...เฮ... แต่พอกดช่องใส่ URL เท่านั้นแหละ... ค้างไปซักแป๊บนึงแล้วก็ force close .... :~(

ไม่เป็นไร ไม่เป็นไร... ลองคุ้ยดูกันใหม่...คุ้ยไป คุ้ยมา (ใช้ readelf, objdump ช่วย) เจอว่าอันที่ compile ไปนั้นมัน target ไปที่ architecture arm5 (armv5te) แต่ไฟล์ที่อยู่ในน้อง S มันเป็น arm7 (armv7-a) ก็เลยจัดการเปลี่ยน architecture ซะโดยเปลี่ยนค่า TARGET_ARCH_VARIANT ในไฟล์ build/core/combo/linux-arm.mk b/core/combo/linux-arm.mk จาก armv5te เป็น armv7-a แล้วก็

make clean
make

รอ...รอ...รอ...อีกชั่วโมงครึ่ง...
.....ผล.....
เหมือนเดิมเด๊ะ :~( เปิด browser ได้แต่พอคลิกที่ช่องใส่ URL เท่านั้นแหละ เจอ force close เลย .. ทีนี้ก็เลยกด *#9900# เพื่ิิอ save log ออกมาดู

เท่าที่อ่านเข้าใจว่าเป็นเพราะ samsung มีการโม webkit ไปเยอะพอสมควร แล้วดันไม่ใส่มาให้ในไฟล์ opensource ที่โหลดได้จาก opensource.samsung.com ทีนี้ก็เลยจนปัญญาที่จะแก้ต่อ....เฮ้อออออ