您的位置:首页 > 其它

实现Recovery形式本地化显示文本定制(recovery_l10n工具的使用

2017-03-22 15:51 531 查看

一:阅读recovery代码,理清流程

recovery的多国语言ui的设计代码位于s905\bootable\recovery目录下,其中recovery.cpp文件的main函数是其入口。阅读也正是从此次开始。

1.1 main函数流程

只关心recovery的ui代码。
1:新建Device对象,Device类封装了ui的相关操作

[cpp] view
plain copy

Device* device = make_device();//新建Device 对象

2:获取RecoveryUI对象

[cpp] view
plain copy

ui = device->GetUI();//获取RecoveryUI 对象

gCurrentUI = ui;

3:设置多国语言使用哪种语言

[cpp] view
plain copy

ui->SetLocale(locale);

说明:
当locale的值为en_GB时表示使用英文
当locale的值为zh_CH时表示使用中文

为了方便调试,这里可以直接给locale赋值,比如:

[cpp] view
plain copy

locale = "en_GB";那么,接下来的recovery ui 界面出现的界面图片的文件就是显示英文了。

void ScreenRecoveryUI::SetLocale(const char* new_locale) {

if (new_locale) {

this->locale = new_locale;4:初始化ui,这一步的初始化至关重要,包括加载背景图片,文字显示图片以及进度条。

ui->Init();

}

LoadBitmap用于加载背景图和进度条

LoadLocalizedBitmap加载文字图片

在ui->Init();里面rtl_locale变量是关键,通过判断它来决定加载的是中文还是英文。
rtl_locale的设置:在ui->SetLocale(locale);函数里面
如下:

[cpp] view
plain copy

char* lang = strdup(locale);

for (char* p = lang; *p; ++p) {

if (*p == '_') {

*p = '\0';

break;

}

}

// A bit cheesy: keep an explicit list of supported languages

// that are RTL.

if (strcmp(lang, "ar") == 0 || // Arabic

strcmp(lang, "en") == 0 || // Persian (Farsi)

strcmp(lang, "fa") == 0 || // Persian (Farsi)

strcmp(lang, "he") == 0 || // Hebrew (new language code)

strcmp(lang, "iw") == 0 || // Hebrew (old language code)

strcmp(lang, "ur") == 0) { // Urdu

rtl_locale = true;

}

free(lang);

} else {

new_locale = NULL;

}

5:设置初始背景图为空

[cpp] view
plain copy

ui->SetBackground(RecoveryUI::NONE);

6:由于just_exit被初始化为: bool
just_exit = false;因此进入如下代码片段:

[cpp] view
plain copy

else if (status != INSTALL_SUCCESS || ui->IsTextVisible() || force_stop) {

<span style="white-space:pre"> </span>ui->ShowText(true);

<span style="white-space:pre"> </span>Device::BuiltinAction temp =prompt_and_wait(device, status);

if (temp != Device::NO_ACTION) after = temp;

}

进入prompt_and_wait函数根据status参数,调用ui->SetBackground函数去更新ui界面,界面显示的文字以及进度条。接下来,最重要的就是ui->SetBackground函数的流程了。

1.2 ui->SetBackground函数流程

调用流程
SetBackground
update_screen_locked
draw_screen_locked
draw_background_locked
draw_progress_locked(忽略掉,没用的上)

最终调用的是draw_background_locked来完成背景图以及文字图片的显示;调用draw_progress_locked来更新进度条。

1:draw_background_locked函数
计算背景图的分辨率iconWidth和iconHeight

[cpp] view
plain copy

<span style="white-space:pre"> </span>gr_surface text_surface = backgroundText[icon];

int iconWidth = gr_get_width(surface);

int iconHeight = gr_get_height(surface);

计算背景图x,y坐标的偏移值

[cpp] view
plain copy

iconX = (gr_fb_width() - iconWidth) / 2;

iconY = (gr_fb_height() - iconHeight) / 2;

计算文字图片的x,y坐标的偏移值

[cpp] view
plain copy

int textX = (gr_fb_width() - textWidth) / 2;

int textY = ((gr_fb_height() - (iconHeight+textHeight+40+sh)) / 2) + iconHeight + 40;

调用库函数gr_blit进行图片显示

[cpp] view
plain copy

<span style="white-space:pre"> </span>gr_blit(surface, 0, 0, iconWidth, iconHeight, iconX, iconY);

调用draw_install_overlay_locked来更新进度条(此次更新了进度 条,可以把draw_progress_locked注释掉)

[cpp] view
plain copy

if (icon == INSTALLING_UPDATE || icon == ERASING) {

draw_install_overlay_locked(installingFrame);

}

调用gr_texticon函数来显示图片文字

[cpp] view
plain copy

<span style="white-space:pre"> </span>gr_texticon(textX, textY, text_surface);

2:gr_texticon函数
此函数非常简洁,计算文字显示的X,Y坐标,后面的调试就是调试这里的x和y的值

[cpp] view
plain copy

<span style="white-space:pre"> </span>x += overscan_offset_x ;

<span style="white-space:pre"> </span>y += overscan_offset_y ;

最后调用text_blend来显示文字。

[java] view
plain copy

gr_texticon(textX, textY, text_surface);

1.3 小结

经过上面的几个步骤的分析知道,要修改的地方有:
1:背景图片以及文字图片的加载,也就是void ScreenRecoveryUI::Init()函数的修改。
2:设置SetLocale的值,用来表示ui界面显示的是哪一国家的语言文字。可直接赋值,也可以在cache/recovery/last_locale配置好
3:注释调draw_progress_locked函数
4:在gr_texticon函数里面修改文字的坐标

二:背景图片的制作

代码路径:s905\development\tools\recovery_l10n
需要介绍的文件有:要修改的内容也在里面
1:s905\development\tools\recovery_l10n\res\values-zh-rCN\strings.xml用于显示中文文字,可以修改里面的中文文字为您所需要的,比如:
原始的内容如下图:



直接讲中文文字修改为如下图:



其中”\n”表示将在生成的图片中将文字换行。

2:s905\development\tools\recovery_l10n\res\values\strings.xml系统默认的英文文字。这里的修改也是直接将该文件的英文修改为您想要的。其中”\u2026”表示”……”

3:s905\development\tools\recovery_l10n\res\layout\main.xml布局文件,用于设置字体的大小,对齐方式。

[html] view
plain copy

<TextView android:id="@+id/text"

android:layout_width="wrap_content"//文本高度由内容决定

android:layout_height="wrap_content"//文本宽度由内容决定

android:textColor="#ffffffff"//文本颜色

android:background="#ff000000"//背景图颜色

android:maxWidth="720px"//最大的宽度分辨率

android:gravity="start" //对齐方式为向右对齐

android:textSize="24px" //字体大小为24p

/>

4:此apk的代码文件Main.Java
位置:
s905\development\tools\recovery_l10n\src\com\Android\recovery_l10n
问题:原生的源代码有个bug,导致读取出来的Locale[]数组值全部为空,无法完成图片的制作。修改前后的对比如下



三:修改步骤(显示中文为例)

目标:使用一张背景图片,把多国语言制作生成集成在一张,传递参数决定使用哪国语言,通过此参数与图片信息上的字符串信息进行比较,进而显示该国文字叠加在背景图片中。

1:修改values-zh-rCN\strings.xml,修改四句
例如:




修改为



2:修改s905\development\tools\recovery_l10n\res\values\strings.xml
例如:把



修改为:



3:修改layout\main.xml布局文件
调整字体的大小,对齐方式

[html] view
plain copy

<TextView android:id="@+id/text"

android:layout_width="wrap_content"//文本高度由内容决定

android:layout_height="wrap_content"//文本宽度由内容决定

android:textColor="#ffffffff"//文本颜色

android:background="#ff000000"//背景图颜色

android:maxWidth="720px"//最大的宽度分辨率

android:gravity="start" //对齐方式为向右对齐

android:textSize="24px" //字体大小为24p

/>

4:在recovery.cpp文件里面给locale赋值为

locale = zh_CH;要在ui的初始化之前完成



也可以在系统的cache/recovery/last_locale文件里直接写入



5:修改void ScreenRecoveryUI::Init()
把所有的背景图的初始化加载全部加载为同一张
如下



5:修改SetBackground-->update_screen_locked-->draw_screen_locked
A:把draw_progress_locked注释调



B进入draw_background_locked-->gr_texticon修改文字的x,y坐标
否则文字显示在图片上将会是混乱的



四:操作步骤

1:编译recovery_l10n生成apk包
修改好之后,直接进入源码路径下
s905/development/tools/recovery_l10n执行mm命令



使用mm命令的是有前提的,不多说。
编译成功之后将会生成RecoveryLocalizer.apk,路径如下



同时生成了该apk运行时所依赖的库,路径如下:



可以看到,库和apk是在同一个文件当中,只需要把此文件通过adb工具直接push到系统的system/app目录下,修改权限为“755”。

2:RecoveryLocalizer.apk是使用方法
第一步:使用串口工具登录连接系统,在系统串口终端输入命令
am start -n com.android.recovery_l10n/com.android.recovery_l10n.Main 把RecoveryLocalizer.apk拉起。如图:







第二步:处理图片
图片的格式是.png,执行完第一步之后就会在系统的
/data/data/com.android.recovery_l10n/files/路径下生产一个text-out.png图片,此时的图片还不能够被系统的源代码进行使用,需要进行进一步的处理

把text-out.png图片通过adb工具pull出来,放到Ubuntu环境下执行pngcrush -c 0 text-out.png output.png。前提是安装了pngcrush工具 :sudo
apt-get installpngcrush







第三步:把制作处理好的图片放入到s905\bootable\recovery\res-hdpi\images路径下,替换原来的图片。

第四步:编译recovery,将会在out\target\product\p200路径下生产recovery.img镜像文件。

第五步:更新recovery.img
把recovery.img拷贝到U盘,进入uboot使用usb
start 0;fatload usb 0 xxxxxxx recovery.img;bootm命令进入到recovery。
或者不知道xxxxxxx是多少,直接进入系统使用dd命令
dd if=storage/external_storage/udisk0/recovery.img of=/dev/block/recovery
然后sync
最后reboot recovery 也可以进入到recovery界面









内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐