על עברית ואנדרואיד – אבולוציה

"תיקוני עברית" תיקוני עברית" – בואו תקראו קצת ותתרשמו.

גם אם לא תבינו את המונחים, מומלץ שלא לזנוח, ולקרוא עד הסוף, רק בכדי להתרשם ולהבין, שנעשתה ונעשית כאן עבודה לא פשוטה ולא קלה, להכיר את שמות/ניקים העוסקים במלאכת קודש זו, ולהוקיר להם על פועלם. אפשר גם בתגובות לפוסט זה. 🙂

מכיון שאני לא מצוי בפרטים הטכניים, אני פשוט מעתיק את הסיקור של classicaldude – רון רגב, בפורום השפים ובפורום המפתחים.

"

ארבע רמות של הצגת טקסט
1. רוב הטקסט במערכת מעוצב ע"י ספריית הג'אווה StaticLayout. מפתחי אנדרואיד כללו אלגוריתמים בסיסיים לדו-כיווניות בספריה זו, שגרמו לכך שעברית הוצגה בד"כ נכון, אבל מספרים בתוך פיסקה עברית הוצגו גם כן מימין לשמאל. גם סימני פיסוק התנהגו בצורה לא הגיונית. כיוון יישור הפיסקה נקבע ע"י ספריית Layout, ובמקור נקבע שכיווניות הפיסקה תהיה לפי התו הראשון בה (מה שגרם לבלאגן שלם בכל תוכנת הודעות עם שמות משתמשים באנגלית וטקסט עברי). במעבר בין 2.1 ל-2.2 המפתחים שיחקו עם הגדרות הפונקציות ב-StaticLayout ובדרך בניית הספריה, ולמעשה הרעו את המצב עוד יותר.

בעיית המספרים תוקנה לראשונה ע"י אומרי באומר. הוא ניסה למסור את קוד המקור שלו לגוגל, והם דחו אותו. קיינוג'ן לא דחה אותו, וכך, לפני שנה בערך, התחילה מסורת התמיכה המשופרת של CM בהצגת עברית. בשלב מאוחר יותר ערן מזרחי (erasmux שלנו) ואני ישבנו על כל בעיות הפיסוק שנשארו ב-StaticLayout והבאנו את הצגת הטקסט לרמה מקבילה, פחות או יותר, לזו של מחשב אישי. יישור הפיסקה נקבע כך שאפילו תו עברי אחד בפיסקה יגרום לכולה להיות מיושרת לימין, מה שעובד באחוז מכריע מהמקרים.

2. ישנן אפליקציות, כמו ג'ימייל למשל, שלא משתמשות ב-StaticLayout, אלא באופן ישיר בפונקציית drawText שנמצאת בספריית Canvas. שם מפתחי אנדרואיד לא כללו שום תמיכה בדו כיווניות, ולכן נושאי האי מיילים בג'ימייל מוצגים הפוך. כמה מפתחים מפרוייקט Arabic Android החלו למצוא פתרונות לבעיה, ומיד סגרו את הקוד וניסו להרוויח על זה כסף. אלה גם לא היו פתרונות שלמים. דודי כהן (dudyk) לקח את העניין לידיים, ויצר יש-מאין אלגוריתם לדו-כיווניות בספריית Canvas. גם עבודתו הגיעה ל-CM, ומאז הכותרות בג'ימייל ישרות. עם זאת, האלגוריתם של דודי גרם לכמה בעיות עם סימני פיסוק, ותוקן ע"י erasmux. מאז גירסה 6.1 של CM גם האפליקציות שקוראות באופן ישיר ל-drawText מציגות עברית נכון.

3. אפליקציות גרפיות במהותן, כמו תוכנת הניווט של גוגל, משתמשות בעיקר בספריית Paint, שגם בה לא היתה כל תמיכה לטקסט דו-כיווני. דודי הוסיף גם את זה, ובדרך-אגב שיתף פעולה עם מפתחים ערבים והשיג תמיכה להצגה נכונה של ערבית, בה קיימת בעיה של צורך בעיצוב-מחדש של אותיות בהתאם לאותיות השכנות.

4. למעשה, אין שום סיבה שמפתח יעצב את מימשק המשתמש של האפליקציה שלו באיזושהי שפה פרט לג'אווה. אבל בכמה מקרים מפתחים החליטו, מסיבות כאלה או אחרות, שהם רוצים שהקוד שלהם יהיה native – כלומר, לא ירוץ על המכונה הוירטואלית שהיא רוב סביבת העבודה של אנדרואיד, אלא ירוץ באופן ישיר על הקוד הבסיסי של מערכת ההפעלה. לדוגמה: כותרות האירועים בתצוגה יומית של לוח השנה, מזג האוויר בגירסת לוח השנה של HTC, ותגיות בג'ימייל. כמובן – גם כאן לא היתה תמיכה בדו-כיווניות. דודי יצר קריאה לאלגוריתם הדו-כיווני שיצר, באופן שכל אפליקציה שמנסה לעצב טקסט באופן ישיר עם קוד native תופנה דרך מערכת ה-JNI (ראשי תיבות של Java Native Interface) לאותו אלגוריתם.

וכאן דודי יצר בעיה. באביב שעבר גיליתי את התגלית הלא-עד-כדי-כך-מדהימה שאפשר להשתמש בכלים baksmali ו-smali כדי להעביר ספריות ג'אווה מקומפלות מקובץ framework.jar אחד לקובץ אחר. כלומר, כדי לתקן את העברית בספריות הג'אווה של רומים של יצרנים היינו צריכים לקמפל את קוד המקור ולשתול את הספריות הספציפיות האלה. היות שהיצרנים לא שינו את הקוד של גוגל, זה עבד.

אבל אצל דודי התיקון ל-native היה בחלק של הקוד שנכתב בשפת C, שאותו אי אפשר להנדס לאחור באותה קלות שאפשר עם ג'אווה. זה היתרון של CM – כל הקוד פתוח, ואפשר לשנות הכל. השינוי שדודי עשה לקוד ה-native נכלל בקובץ libandroid_runtime.so, אותו כל יצרן טלפון משנה, ואשר את הקוד שלו הם לא משחררים.

כאן נכנס שוב erasmux לתמונה, והפריד את תיקוני הג'אווה מתיקוני ה-native. אני יצרתי את הסקריפט לתיקון framework.jar בהתבסס על עבודתו של erasmux, וזה פתר לרומים של יצרנים את בעיות 1 עד 3, אבל לא את בעיה 4.

אני ישבתי לי, קימפלתי את libandroid_runtime.so מקוד המקור בגירסה המקורית ובגירסה המתוקנת, והשוויתי בינהם ב-hex editor. ההבדל בין הקבצים היה בבייט אחד. זה לא עזר הרבה, כי לא מצאתי את הידיים ואת הרגליים בפירוק ה-hex של הקובץ של HTC, למשל. אני פסנתרן, לא מתכנת… למזלי הרב, הסבתי את תשומת ליבו של mena לעניין זה, והוא מצא מיד כיצד לתקן את הקובץ של HTC כך שיכלול את אותו שינוי של בייט. הוא שלח לי את הקובץ, ואני חיפשתי בקוד של CM (שבשלב זה כלל אלגוריתמים של dudyk, של erasmux וקצת שלי) את ספריות הג'אווה המתאימות לקובץ החדש. התוצאה היתה התיקון שפירסמתי לפני כמה ימים, המעלה את תמיכת העברית של רום הסנס של מודאקו עבור HTC דיזייר לרמה של CM6.1. כלומר – אין יותר בעיות של עברית בלוח השנה, בג'י מייל, בגלריה, ב-swype, בנגן המוסיקה או במקומות אחרים.

הבעיה היחידה שטרם נפתרה ברום הסנס היא שמילים מנוקדות בהודעות מייל או בדפי אינטרנט יגרמו לכל השורה שלהן להיות מוצגת הפוך. ברומים מאורנג' למכשירים אחרים, למשל, בעיה זו נפתרה – אבל ברמת קוד native, אותו כבר הרבה יותר קשה לייבא למכשירים אחרים. בשלב זה אתייחס לבעיה זו כזניחה, למרות שאני משוכנע שגם לה יהיה פתרון בקרוב.

בין אנדרואיד 2.2 ל-2.3 לא חלו שום שינויים בקוד עיצוב הטקסט באף אחת מהרמות המוזכרות".

אני התרשמתי, ויותר מזה, הבנתי שהמלאכה לא קלה, ומגיעה הערכה רבה לעוסקים בה.

מודעות פרסומת

11 תגובות ל-“על עברית ואנדרואיד – אבולוציה

  1. כל הכבוד, אמנם לא כבשנו שוב את החרמון אבל זו בהחלט גאווה ישראלית!!!!!!!!!!!

  2. ישר כח גדול,
    אבל כמה אירוני זה שקוראים אחת הכתבה דרך המכשיר הסלולרי,
    העברית והאנגלית יוצאות מחורבשות…

  3. כל הכבוד!

    אגב, מילים מנוקדות זאת בעיה לא כל כך זניחה. זה מעצבן לקרוא כתבה שבאמצע שורה אחת הפוכה בגלל איזה קמץ. בקשר ל-2.3, לא הצלחתי עדיין לתקן את העברית ב-stock calendar בתצוגה של יום. זה אני, או שבאמת יש שינוי בין הגרסאות?

    עוד משהו קטן: לא קיינוג'ן אלא סייאנוג'ן (על שם הצבע cyan סייאן).

  4. כל הכבוד לכל העוסקים במלאכה.
    אתם פורצי דרך אמיתיים.
    לא ברור לי למה גוגל דחו את הפתרונות שלכם…

  5. צודק לגבי ההגיה של סייאנוג'ן. אבל זה סוג של גז, למרות הדמיון לשמו של הצבע. לא משנה, בכל מקרה חברים – תודה על העידוד.

  6. תגידו? ניסיתם להעלות ת'ראד עם הסבר על התיקון לXDA? בשביל שעוד מפתחים מלבד CYAN יכללו את זה ברומים שלהם?

  7. הרומים היחידים שמפתחיהם ישקלו לכלול את התיקון הם רומים שמבוססים על קוד פתוח, אשר מתוחזק באופן שמאפשר לכל הקהילה לתרום לו. CM הוא המוביל בתחום, ויש מעטים ביותר כאלה. רוב הרומים מבוססים על רומים שהוציאו יצרניות המכשירים, להם אין קוד פתוח. בשביל מתחזקי רומים כאלה כלילת תיקון עברי משמעה תיקון ידני של קבצים בכל גירסה שיוצאת. אין להם מוטיבציה גדולה לעשות את זה, ובין כה וכה המפתחים שלנו כאן עושים את זה.

    לגבי התקנת עברית בתשלום – בהחלט יש מתנדבים. צריך רק לבדוק וליצור קשר בפורומים.

  8. היי,
    אני חדש בכל התחום של אנדרואיד וקניתי עכשיו את הנקסוס אס מארה"ב.
    האם יש חברה/מישהו שמתקין רום עם תיקוני עברית בתשלום?

  9. אמרתי בעבר, ואני אגיד שוב – כל הכבוד רון, ערן, וכולכם!
    עבודה מופתית.

  10. כל הכבוד על ההשקעה !

    תיקוני העברית המלאים עובדים גם ברום – Redux-Rc2.1 בצורה מושלמת !

    תודה רבה

להשאיר תגובה

הזינו את פרטיכם בטופס, או לחצו על אחד מהאייקונים כדי להשתמש בחשבון קיים:

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s