转自 http://blog.sina.com.cn/s/blog_12fa2144a0102vjio.html
dmesg
grep remotect1
===================================================全志新建一个自己的工程和编译============================================================
1.在自己Android目录中:
注意:执行完上述步骤之后,检查一下你工程目录中的package.sh文件,确定你要在lichee\tools\pack\chips\sun8iw3p1\configs\android中使用的名字。
2.在lichee\tools\pack\chips\sun8iw3p1\configs\android中复制一份相同的目录,修改成自己的名字(名字要与上述注意事项的名字相同)。
3.编译(以A23为例子)
1)在lichee下:./build.sh config-->s0.un8iw3p1-->0. Android-->选择你自己的项目名(如不是第一次编译,直接./build.sh)
2)在android中:执行source build/envsetup.sh -->lunch-->选择你自己的项目名-->extract-bsp,然后make
===============================================主要配置和修改============================================================
主要配置sys_config.fex:Y:\a20\lichee\tools\pack\chips\sun7i\configs\android\wing-evb-v20\sys_config.fex
本来A20开发板上自带CSI接口模组gt2005. 但需要将其替换成ov2643.
1.修改: android/device/softwinner/wing-evb-v20/init.sun7i.rc
使其在初始化时insmod ov2643 的driver.
#sam modify it for ov2643
#insmod /system/vendor/modules/gt2005.ko
insmod /system/vendor/modules/ov2643.ko
2. 修改
lichee\tools\pack\chips\sun7i\configs\android\wing-evb-v20\sys_config.fex
[csi0_para]
csi_used = 1
csi_dev_qty = 1
csi_stby_mode = 0
csi_mname = "ov2643"
csi_if = 0
csi_iovdd = ""
csi_avdd = ""
csi_dvdd = ""
csi_vol_iovdd =
csi_vol_dvdd =
csi_vol_avdd =
csi_vflip = 0
csi_hflip = 1
csi_flash_pol = 0
csi_facing = 0
csi_twi_id = 1
csi_twi_addr = 0x60
csi_pck = port:PE00<3>
csi_ck = port:PE01<3>
csi_hsync = port:PE02<3>
csi_vsync = port:PE03<3>
csi_d0 = port:PE04<3>
csi_d1 = port:PE05<3>
csi_d2 = port:PE06<3>
csi_d3 = port:PE07<3>
csi_d4 = port:PE08<3>
csi_d5 = port:PE09<3>
csi_d6 = port:PE10<3>
csi_d7 = port:PE11<3>
csi_reset =port:PH13<1><0>
csi_power_en =port:PH16<1><1>
csi_stby =port:PH18<1><0>
任务2:使MAC地址不重复:
修改:lichee\tools\pack\chips\sun7i\configs\android\default\env.cfg
任务3: 修改开机画面:
请注意:通常意义上的开机画面其实分以下三种:
1. Linux系统启动时的小企鹅。(Android早期版本和当前一些开发板还有用)
2. Android平台初始化时显示的rle图像。
3.Android平台图形系统启动时,显示的一个动画,如果没有特别设定,就是那个不断变化光线位置的ANDROID的动画。
我们着重学习2和3。
3.2: 添加和修改Android平台初始化时显示的rle图像:
/android/system/core/init/init.c
的main()函数中有:
queue_builtin_action(console_init_action,"console_init");
它向init 进程中添加了一个执行Action。名字为:"console_init"。 执行的是:console_init_action()
这里,就是显示开机画面的代码。
#define INIT_IMAGE_FILE "/initlogo.rle"
if( load_argb8888_image(INIT_IMAGE_FILE) ) {
fd = open("/dev/tty0", O_WRONLY);
if (fd >= 0) {
const char*msg;
msg = "\n"
"\n"
"\n"
"\n"
"\n"
"\n"
"\n" // console is 40 cols x 30 lines
"\n"
"\n"
"\n"
"\n"
"\n"
"\n"
"\n"
" A N D R OI D ";
write(fd,msg, strlen(msg));
close(fd);
}
这里,如果有/initlogo.rle,则利用framebuffer把图片显示在屏幕中。否则,打开串口,打印ANDROID.
如何将24bpp或者32bpp bmp图像转化成rle文件格式呢?
A20提供了一个软件:
\lichee\tools\tools_win\LogoGen\LogoGen\BmpConvert.exe
在Windows下,使用它将BMP图像转化为rle文件。
之后把它放到:/android/device/softwinner/wing-evb-v20/目录下。
请注意:此原始图像应与屏幕分辨率相同。当使用720P时,则应该使用1280x720的图片。
3.3:修改Android平台图形系统启动时的动画:
首先分析代码:
/android/frameworks/base/cmds/bootanimation/BootAnimation.cpp
#define USER_BOOTANIMATION_FILE"/data/local/bootanimation.zip"
#define SYSTEM_BOOTANIMATION_FILE"/system/media/bootanimation.zip"
#define SYSTEM_ENCRYPTED_BOOTANIMATION_FILE"/system/media/bootanimation-encrypted.zip"
if ((encryptedAnimation&&
(access(SYSTEM_ENCRYPTED_BOOTANIMATION_FILE,R_OK) == 0) &&
(mZip.open(SYSTEM_ENCRYPTED_BOOTANIMATION_FILE)== NO_ERROR))
((access(USER_BOOTANIMATION_FILE, R_OK) == 0)&&
(mZip.open(USER_BOOTANIMATION_FILE) ==NO_ERROR))
((access(SYSTEM_BOOTANIMATION_FILE, R_OK) == 0)&&
(mZip.open(SYSTEM_BOOTANIMATION_FILE) ==NO_ERROR))) {
mAndroidAnimation =false;
}
这一段明确说明了:如果/data/local/bootanimation.zip,/system/media/bootanimation.zip,/system/media/bootanimation-encrypted.zip这三个文件有任何一个存在且能够正常解压,则mAndroidAnimation=false.
另一处:
if (mAndroidAnimation) {
r = android();
} else{
r = movie();
}
结合上面的代码,说明如果没有以上三个文件,则执行android();
加载:/android/frameworks/base/core/res/assets/images/中的:android-logo-mask.png android-logo-shine.png
这两个文件,一个是镂空的ANDROID字体默认的前景图片,文字部分镂空,大小256×64,一个是斜闪光,是动感效果。
源码里默认是没有那些个.zip动画的,所以总会跳到android字体闪动的画面。
我们通常下载一个别人制作好的文件,放在:
\\android\out\target\product\wing-evb-v20\system\media下。
desc.txt文件很简单:
例1:
480 854 20
p 1 3 part0
p 0 3 part1
480854 20: 图像像素长宽为:480x854. 显示帧数:20帧。
p 13 part0:part0里面的图片(可以是多幅) 每个显示一次,间隔3。
p 03 part1:part1里面的图片显示无数次,间隔为3。
例2:
480 800 7
p 0 0 part0
480 800 7: 图像像素长宽为:480x800. 显示帧数:7帧。
p 0 0 part0:part0里面的图像显示无数次。间隔为0。
4. 预装APK:
预装APK的方式有两种不同方式,一种是作为系统软件安装,用户无法在卸载界面看到它(所以无法卸载)。另一种作为正常软件安装。
4.1:按照正常软件安装:
把APK放到:/android/device/softwinner/wing-common/preinstallapk
编译烧入后。启动后会静默安装。
4.2:按系统软件安装:
把APK放到:/android/device/softwinner/wing-common/apk
如果此APK有library.则需要把它放到:/android/device/softwinner/wing-common/apklib
最终,在Android Rootfs中,这个库会放到 /system/lib/中。
5. 指定缺省Launcher:
6. 配置wifi+bt
a) init.sun7i.rc:Android/device/softwinner/wing-evb-v20/init.sun7i.rc为资源和服务配置的文件
b) BoardConfig.mk:Android/device/softwinner/wing-evb-v20/BoardConfig.mk决定Android要加载哪一款wifi模组,以及是否支持蓝牙。
c) .config:将wifi driver编译成模块,CONFIG_RTL8723AU = m
d) Wing-evb-v20.mk:/android\device\softwinner\wing-evb-v20。决定拷贝文件rtl8723au wifi的firmware到相应的目录,要修改此目录。
e) Ueventd.sun7i.rc:android\device\softwinner\wing-evb-v20。增加设备的节点
f) Config.xml:android\device\softwinner\wing-evb-v20\overlay\frameworks\base\core\res\res\values.要打开蓝牙功能需要在文件中把蓝牙的bneq网口打开修改。
g) Vnd-wing-evb-v10.txt:android\device\softwinner\common\hardware\realtek\bluetooth\libbt-vendor\rtl8723au\include配置蓝牙:
h) bdroid_buildcfg.h:android\device\softwinner\wing-evb-v20\bluetooth。配置打开蓝牙时显示的本机的名字
i) sys_config.fex:lichee\tools\pack\chips\sun7i\configs\android\wing-evb-v20决定选用的wifi模组,以及GPIO pin 的分配
7.配置LCD屏
a) LCD_PWM_EN,LCD_BL_EN,LCD_PWR_EN 这三个函数是通过 GPIO 控制实现电源和背光的开启关闭,IO 的位置及属性定义在 sys_config.fex 文件中。
b) LCD基本配置在driver/video/sun7i/lcd/lcd0_panel_cfg.c中,可调节LCD背光,pwm等参数。
c)
d)
8.摄像头配置
a) Device Drivers --->Multimedia support ---> CSI Driver Config for sunxi ---> 或者Video capture adapters ---> 里面可以配置选上相应的摄像头。
9.启动频率和电压
a) Sys_config.fex文件中target中根据参考手册修改
10.增加蓝牙选项
1)android\frameworks\base\core\res\res\values\config.xml中加
2)Y:\a20-v3.0\a20\android\device\softwinner\wing-k70\wing_k70.mk中增加相应模块
3)Y:\a20-v3.0\a20\android\device\softwinner\wing-k70\init.sun7i.rc中增加相应模块
4)Y:\a20-v3.0\a20\android\device\softwinner\wing-k70\BoardConfig.mk中增加相应模块
11.修改字体以及整体大小
a) Y:\a20\android\out\target\product\wing-k70\recovery\root\default.prop
b) Y:\a20\android\out\target\product\wing-k70\system\build.prop中的fontScale
12.关于按键映射
1)mcu讲数据由串口传至arm,arm由串口程序接收,接收后,使用system函数映射按键system("input keyevent 82");后面的键值由Android映射的按键决定。
2)增加MUTE按键:由于Android本身有静音按键,但是在a20\android\frameworks\base\media\java\android\media\AudioManager.java中却没有映射出来,所以要自己添加程序:
public void handleKeyDown(KeyEvent event, int stream) {
int keyCode = event.getKeyCode();
boolean mute = isStreamMute(AudioManager.STREAM_MUSIC);
switch (keyCode) {
case KeyEvent.KEYCODE_VOLUME_UP:
case KeyEvent.KEYCODE_VOLUME_DOWN:
if (mute) {
setStreamMute(AudioManager.STREAM_MUSIC, false);
int volume = getStreamVolume(AudioManager.STREAM_MUSIC);
if (volume == 0) {
if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {
setStreamMute(AudioManager.STREAM_MUSIC, true);
break;
} else if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
setStreamMute(AudioManager.STREAM_SYSTEM, false);
setStreamMute(AudioManager.STREAM_NOTIFICATION, false);
}
} else {
setStreamMute(AudioManager.STREAM_SYSTEM, false);
setStreamMute(AudioManager.STREAM_NOTIFICATION, false);
adjustStreamVolume(AudioManager.STREAM_MUSIC,
AudioManager.ADJUST_SAME,
AudioManager.FLAG_SHOW_UI);
break;
}
}
int flags = FLAG_SHOW_UI
FLAG_VIBRATE;
if (mUseMasterVolume) {
adjustMasterVolume(
keyCode == KeyEvent.KEYCODE_VOLUME_UP
? ADJUST_RAISE
: ADJUST_LOWER,
flags);
} else {
adjustSuggestedStreamVolume(
keyCode == KeyEvent.KEYCODE_VOLUME_UP
? ADJUST_RAISE
: ADJUST_LOWER,
stream,
flags);
}
if (stream == AudioManager.STREAM_MUSIC) {
int v = getStreamVolume(AudioManager.STREAM_MUSIC);
mute = isStreamMute(AudioManager.STREAM_MUSIC);
if (!mute && (v == 0)) {
setStreamMute(AudioManager.STREAM_SYSTEM, true);
setStreamMute(AudioManager.STREAM_MUSIC, true);
setStreamMute(AudioManager.STREAM_NOTIFICATION, true);
adjustStreamVolume(stream,
AudioManager.ADJUST_SAME,
AudioManager.FLAG_SHOW_UI);
}
}
break;
case KeyEvent.KEYCODE_VOLUME_MUTE:
// TODO: Actually handle MUTE.
mute = !mute;
setStreamMute(AudioManager.STREAM_SYSTEM, mute);
setStreamMute(AudioManager.STREAM_MUSIC, mute);
setStreamMute(AudioManager.STREAM_NOTIFICATION, mute);
adjustStreamVolume(AudioManager.STREAM_MUSIC,
AudioManager.ADJUST_SAME,
AudioManager.FLAG_SHOW_UI);
break;
}
}
加入上述代码,可讲MUTE键映射成功。
13.关于UartTestApp服务(注意权限一定要最高)
1)使用,mmm把seria编译成UartTestApp可行性文件后,在目录out/target/product/wing-k70/system/bin下,在init.rc中加入service UartTestApp /system/bin/UartTestApp
class main
user root
group graphics
2)修改bin目录下的preinstall.sh文件,加上$BUSYBOX chmod 777 /system/bin/UartTestApp
3)如果1)中没有效果,接着在android\device\softwinner\wing-common\preinstall.sh中加上$BUSYBOX chmod 777 /system/bin/UartTestApp
4)然后make
14.gsensor方向
1)修改驱动文件
2)修改out/xxx/xxx/system/user/gsensor.cfg下的文件
15.圆圈与十字架不在同一点
以A23平台为例,是在android\frameworks\base\services\jni下的com_android_server_input_InputManagerService.cpp文件,outSpriteIcon->hotSpotX = pointerIcon.hotSpotX-10;
outSpriteIcon->hotSpotY = pointerIcon.hotSpotY-10;这个位置更改白色圆圈图片的坐标,数值又白点位置决定。
16.A23问题
Nw7723l:有8089和rda两种wifi,
8089:有1024x600和800x480两种分辨率,切换两种分辨时,主要修改:
1)sys_config.fex,看是什么lcd,如RGB和LVDS的
2)Out/xxx/xxx/system/bulid.prop中的ro.sf.lcd_density大小,1024为160,800为120,
3)Sensor方向:--》14
4)修改屏幕的方向。在build.prop文件中ro.sf.rotation=180(800x480)ro.sf.rotation=0(1024x600)
5)修改开机启动画面android\out\target\product\polaris-nw7723lesp\system\media,修改 6)
6) lichee\tools\pack\chips\sun8iw3p1\configs\android\polaris-nw7723lesp中的bootlogo.bmp,根据情况修改。
7)去掉又上角信号图标,找到\android\frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\policy\NetworkController.java
把其中关于stat_sys_signal_null的部分注释掉。
8)去掉解锁屏幕上关于SIM:字样。找到\android\frameworks\base\packages\Keyguard\src\com\android\keyguard\CarrierText.java把setText("SIM1:" + (text != null ? text.toString().toUpperCase() : null));注释掉。
16.关于亮度调节
亮度条减到一定值时屏幕变黑,此时修改亮度最小值:android\device\softwinner\fiber-common\hardware\libhardware\lights\lights.c
static int set_light_backlight(struct light_device_t *dev,
struct light_state_t const *state)
{
struct light_context_t *ctx;
int err = 0;
int brightness = rgb_to_brightness(state);
// add
if( brightness <= 80 )
brightness = 80;
//
pthread_mutex_lock(&g_lock);
unsigned long args[3];
args[0] = 0;
args[1] = brightness;
args[2] = 0;
err = ioctl(fd,DISP_CMD_LCD_SET_BRIGHTNESS,args);
pthread_mutex_unlock(&g_lock);
return err;
}
17.修改主页面添加程序的快捷方式:android\device\softwinner\astar-7723l\overlay\packages\apps\Launcher2\res\xml-sw720dp,或者在device/softewinner/overlay/Launcher中根据需要修改,可参照A23,default_ apace.xml里面的数据,跟A23对比即可。
18.删除右上角信号图标:找到X:\A23\nw7723l\esp8089\android\frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\SignalClusterView.java,找到stat_sys_signal_null,把这一部分代码注释即可。
19.A33移植注意问题
1)lcd_pwm_pol 由0改为1,不然调节亮度会有问题
2)vip_define_sensor_list = 0取消扫描,不然会找不到摄像头
3)[clock] pll configuration选项的pll10 = 297
4)[dram_para]中dram_clk = 480与A23 = 552不同,不降频使用系统会不稳定
5)声音太小在配置文件中找到audio。pa_double_used = 1,原来为0更改为1。添加headset_mic_vol = 3 main_mic_vol = 1
6)修改下拉菜单中的服务问题:修改framework下的GsmServiceStateTracker.java KeyguardTouchDelegate.java KeyguardUpdateMonitor.java NetworkController.java中的文件,修改的时候跟a23的对比修改。
7)找不到camera时,有可能是camera.cfg中的没有相关的信息(在out目录下)。Camera方向不对时,更改camera.cfg中相关的角度。
8)找不到gsensor时,可参照7)。同时,查看android\device\softwinner\polaris-common\hardware\libhardware\libsensors\sensorDetect.cpp下有没有对应sensor的信息,跟原来的可用的对比,在debug模式下查看gsensor信息:input5。修改完成后使用adb push xxx /system/usr下
9)修改虚拟按键位置:竖屏时虚拟按键不能完全显示:平板布局需修改文件。frameworks/base/packages/SystemUI/res/layout-sw600dp/navigation_bar.xml,
如果想注销某个按键,只需作如下修改即可:
- android:layout_width="128dp" android:paddingStart="25dp" android:paddingEnd="25dp"
+ android:layout_width="0dp" android:paddingStart="25dp" android:paddingEnd="25dp"
如果想要按键偏移,可以修改这个值android:layout_width="3300",
10)更换camera时,如0312+0328,首先确保I2C地址是正确的,如果两个I2C地址一样的话在sys_config.fex中有一个设置为不一样的(比如前置随便设置一个),否则只能检测一个,另一个会检测不到,在设置好地址后,挂载模块以后,看打印信息echo 8 > /proc/sys/kernel/printk,查看驱动的信息,如果找不到i2c地址使用test查看哪个i2c地址是正确的,在函数static int sensor_read(struct v4l2_subdev *sd, unsigned char reg, unsigned char *value)中加入
struct i2c_client *client = v4l2_get_subdevdata(sd);
client->addr = I2C_ADDR;
for(i = 0; i < 128 ;i ++)
{
client->addr = i;//I2C_ADDR;
printk("r:sa set is 0x%x\n",i);
ret = cci_read_a8_d8(sd,reg,value);
if(ret == 0)
printk(KERN_ERR "found 0x%x \n",i);
},根据情况而变。如果在sensor_detect中出错,打印查看value的值,更改它。
10)移植rda5991:
a) 调试蓝牙时,如出现mmc uartclk 过高,不在频率范围时,可更改X:\a33\android\external\bluetooth_rda\bt_cfg.h文件中的CUST_BT_SERIAL_BOURATE小一点的波特率
11)去掉蓝牙图标:删除frameworks/native/data/etc/android.hardware.bluetooth.xml文件以及system/etc/permissions/android.hardware.bluetooth.xml,同理增加蓝牙图标时放进去即可。
12)置换默认壁纸android\frameworks\base\core\res\res\drawable-sw600dp-nodpi
13)修改默认亮度:修改frameworks\base\packages\SettingsProvider\res\values\defaults.xml文件中的def_screen_brightness的值
14)A33 lvds RGB切换
a) 修改系统UI方向:RGB:在device\softwinner\astar-7723l\astar_7723l.mk中加入PRODUCT_PROPERTY_OVERRIDES += \ro.sf.rotation=180 ,在build.prop中加入ro.sf.rotation=180 LVDS: = 0
b) 修改bootlogo.bmp以及initlogo.rle:RGB:反向,LVDS:正向
c) 修改gsensor方向:在system/usr/gsensor.cfg中修改lcs RGB:false true LVDS:true false
20.去掉setting中某个选项:
a) 如果只是preference而不是checkboxpreference时,直接注释掉相应的preference即可
b) 如果是checkboxpreference:找到对应的Android:key找到对应的java代码,在相应代码后面加上getPreferenceScreen().removePreference(mBluetoothTether);
如下例子:去掉“手机套餐”以及“蓝牙共享网络”,xml路劲Setting/res/xml/wirless_setting.xml setting/res/tether_prefx.xml java路径:src/com/android/setting/tethersetting.java
Xml:lichee/brandy/u-boot-2011.09/drivers/video_sunxi/sunxi_v2/de_bsp/de/lowlevel_sun8iw5/de_be.c
android:key="enable_bluetooth_tethering"
android:title="@string/bluetooth_tether_checkbox_text"
android:persistent="false" />
Java:
mBluetoothTether = (CheckBoxPreference) findPreference(ENABLE_BLUETOOTH_TETHERING);
getPreferenceScreen().removePreference(mBluetoothTether);
21.去掉窗口小部件中的蓝牙快捷方式:在窗口小部件的xml源码中:Settings/res/layout/widget.xml中,找到蓝牙的加入android:visibility="gone"使其隐藏
22.系统自带的浏览器下载东西时出错退出信息如下failed to find provider info for downloads Unknown URL content://downloads
,查看有没有DownloadProvider(下载)这个服务,如果没有,在priv-app中加入DownloadProvider.apk和在app中加入DownloadProviderUi.apk
23.修改logcat的等级lichee\tools\pack\chips\sun8iw5p1\configs\default\env.cfg中的loglevel,默认是4,数字越大,级别越高。
24.关于Android4.4对外置卡写入限制问题:Android4.4以后对外置卡写入进行了限制,如要写入,需要对frameworks\base\data\etc下的platform.xml或者system/etc/permissions/platform.xml文件中
加入这一行
25.切换成阿拉伯语是systemui出现错误:Keyguard discontent ,其实是虚拟按键没有找到,主要是在切换语言是,使用了不同语言的frameworks\base\packages\SystemUI\res\layout
layout-ldrtl优先级介绍,layout-ldrtl优先级要低于语言级别(layout-ar),因此如果存在layout-ar目录,会首先去查找layout-ar目录下的布局文件,因此建议删除layout-ar等bidi语言目录。layout-ldrtl优先级又高于分辨率等级,优先级归纳如下:
layout-ar(语言级别) > layout-ldrtl > layout-800*540(分辨率),如果layout-ldrtl中的navigation_bar.xml文件中没有相应虚拟按键的id(比如没有volume的按键),则对比另外几个layout,把没有的id添加上
E/AndroidRuntime( 1845): java.lang.NullPointerException
E/AndroidRuntime( 1845): at com.android.systemui.statusbar.phone.NavigationBarView.setDisabledFlags(NavigationBarView.java:395)
E/AndroidRuntime( 1845): at com.android.systemui.statusbar.phone.NavigationBarView.notifyScreenOn(NavigationBarView.java:321)
E/AndroidRuntime( 1845): at com.android.systemui.statusbar.phone.PhoneStatusBar.notifyNavigationBarScreenOn(PhoneStatusBar.java:822)
E/AndroidRuntime( 1845): at com.android.systemui.statusbar.phone.PhoneStatusBar.access$3800(PhoneStatusBar.java:110)
E/AndroidRuntime( 1845): at com.android.systemui.statusbar.phone.PhoneStatusBar$30.onReceive(PhoneStatusBar.java:2485)
E/AndroidRuntime( 1845): at com.android.systemui.statusbar.phone.PhoneStatusBar.makeStatusBarView(PhoneStatusBar.java:639)
E/AndroidRuntime( 1845): at com.android.systemui.statusbar.phone.PhoneStatusBar.addStatusBarWindow(PhoneStatusBar.java:2270)
E/AndroidRuntime( 1845): at com.android.systemui.statusbar.phone.PhoneStatusBar.createAndAddWindows(PhoneStatusBar.java:2244)
E/AndroidRuntime( 1845): at com.android.systemui.statusbar.BaseStatusBar.start(BaseStatusBar.java:253)
E/AndroidRuntime( 1845): at com.android.systemui.statusbar.phone.PhoneStatusBar.start(PhoneStatusBar.java:349)
E/AndroidRuntime( 1845): at com.android.systemui.statusbar.SystemBars.createStatusBarFromConfig(SystemBars.java:106)
E/AndroidRuntime( 1845): at com.android.systemui.statusbar.SystemBars.onNoService(SystemBars.java:58)
E/AndroidRuntime( 1845): at com.android.systemui.statusbar.ServiceMonitor.startService(ServiceMonitor.java:228)
E/AndroidRuntime( 1845): at com.android.systemui.statusbar.ServiceMonitor.access$000(ServiceMonitor.java:49)
E/AndroidRuntime( 1845): at com.android.systemui.statusbar.ServiceMonitor$1.handleMessage(ServiceMonitor.java:73)
E/AndroidRuntime( 1845): at android.os.Handler.dispatchMessage(Handler.java:102)
E/AndroidRuntime( 1845): at android.os.Looper.loop(Looper.java:136)
E/AndroidRuntime( 1845): at android.app.ActivityThread.main(ActivityThread.java:5017)
E/AndroidRuntime( 1845): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 1845): at java.lang.reflect.Method.invoke(Method.java:515)
E/AndroidRuntime( 1845): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
E/AndroidRuntime( 1845): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
E/AndroidRuntime( 1845): at dalvik.system.NativeStart.main(Native Method)
W/ActivityManager( 468): Process com.android.systemui has crashed too many times: killing!
26.修改开机第一屏时的背光亮度:lichee\brandyu-boot-2011.09\drivers\video_sunxi\sunxi_v1\de_bsp\de\ebios\de_be.c中的brightness = brightness>100?100:(brightness<0?0:brightness);以及ichee\brandyu-boot-2011.09\drivers\video_sunxi\sunxi_v2\de_bsp\de\lowlevel_sun8iw5\de_be.c同上。
27.当看视频时把屏幕倒回来看时,点击视频会抖动,修改android/device/softwinner/polaris-common/hardware/libhardware/hwcomposer中的hwc_sunxi.cpp文件中的static int _hwcdev_fe_can_use函数
double fe_clk = 234000000;
int fe_pro_w=0;
int fe_pro_h=0;
int m = 5;
int n = 4; 在后面添加return 0,
return 0;
。。。
28.在容易出现死机重启时,ddr不稳定,尝试修改dram_clk的频率,以及dcdc5_vol的电压,以及LVx_freq的频率
29.移植ap6476注意事项
1)调试wifi
a) 首先确认wifi脚位配置是否正确
b) 查看wifi使用的电压引脚,配置电压,在arch/arm/mach-sunxi/rf/wifi_pm_ap6xxx.c中添加wifi电压相关的信息
type = script_get_item(wifi_para, "ap6xxx_wl_regon", &val);
if (SCIRPT_ITEM_VALUE_TYPE_PIO!=type)
ap6xxx_msg("get ap6xxx ap6xxx_wl_regon gpio failed\n");
else
gpio_p = &val.gpio;
ap6xxx_wl_regon = gpio_p->gpio;
sunxi_ap6xxx_gpio_req(gpio_p);等等相关信息
c)在setting中,看wifi开关是否能打开,如打不开,是上层为配置好,查看X:\softwinner\A33\nw1034\android\device\softwinner\astar-nw1034\中相关mk文件有吗ap6476相关信息,查看framework,与移植包一一对应修改
d)如出现[ 10.706820] [mmc]: sdc1 power_supply is null
[ 10.711567] [mmc]: sdc1 card_power_on ok
[ 10.730037] [mmc]: sdc1 set ios: clk 400000Hz bm PP pm ON vdd 3.3V width 1 timing LEGACY(SDR12) dt B
[ 10.740278] [mmc]: mclk 0xf1c2008c 0x8002000e
[ 10.822362] [mmc]: *** sunxi_mci_dump_errinfo(L773): smc 1 err, cmd 52, RTO !!
[ 10.831311] [mmc]: *** sunxi_mci_dump_errinfo(L773): smc 1 err, cmd 52, RTO !!
[ 10.839453] [mmc]: sdc1 set ios: clk 400000Hz bm PP pm ON vdd 3.3V width 1 timing LEGACY(SDR12) dt B
[ 10.849710] [mmc]: mclk 0xf1c2008c 0x8002000e
[ 10.912002] [mmc]: sdc1 set ios: clk 400000Hz bm PP pm ON vdd 3.3V width 1 timing LEGACY(SDR12) dt B
[ 10.922230] [mmc]: mclk 0xf1c2008c 0x8002000e
[ 10.983926] [mmc]: *** sunxi_mci_dump_errinfo(L773): smc 1 err, cmd 8, RTO !!
Mmc等错误,尝试降低sdio的速率并查看电压是否正常。
2)调试蓝牙
a) 首先确认蓝牙脚位配置是否正确
b) 在正确的情况下查看蓝牙电压是否正确,
出现D/BluetoothAdapterState( 919): CURRENT_STATE=PENDING, MESSAGE = STARTED, isTurningOn=true, isTurningOff=false
I/bluedroid( 919): enable
E/GKI_LINUX( 919): ##### ERROR : GKI_exception: GKI_exception(): Task State Table
E/GKI_LINUX( 919): #####
E/GKI_LINUX( 919): ##### ERROR : GKI_exception: TASK ID [0] task name [(null)] state [0]
E/GKI_LINUX( 919): #####
E/GKI_LINUX( 919): ##### ERROR : GKI_exception: TASK ID [1] task name [BTIF] state [1]
E/GKI_LINUX( 919): #####
E/GKI_LINUX( 919): ##### ERROR : GKI_exception: TASK ID [2] task name [A2DP-MEDIA] state [1]
E/GKI_LINUX( 919): #####
E/GKI_LINUX( 919): ##### ERROR : GKI_exception: GKI_exception 65531 Sending to unknown dest#####
E/GKI_LINUX( 919): ##### ERROR : GKI_exception:
E/GKI_LINUX( 919): ********************************************************************
E/GKI_LINUX( 919): #####
E/GKI_LINUX( 919): ##### ERROR : GKI_exception: * GKI_exception(): 65531 Sending to unknown dest
E/GKI_LINUX( 919): #####
E/GKI_LINUX( 919): ##### ERROR : GKI_exception: **********************************等错误,先查看蓝牙的wake脚位的电压是否正确,如不为高,
查看是否已经在arch/arm/mach-sunxi/rf/bt_pm.c中的rfkill_set_power函数增加wifi_pm_gpio_ctrl("ap6xxx_bt_wake", 1);把wake脚设置为高。
c) 如果出现[ 196.177323] +++++++++++ bt gpio on +++++++
d) [ 196.191878] gpio ap6xxx_bt_regon set io=360 val 1, act val 1
e) [ 196.210244] gpio ap6xxx_bt_wake set io=362 val 1, act val 1
f) [ 196.733337] sw_uart_check_baudset()443 - uart1, select set 5, baud 1000000, uartclk 24000000 beyond rance[31000000, 120000000]
g) [ 196.848732] sw_uart_check_baudset()443 - uart1, select set 5, baud 1000000, uartclk 24000000 beyond rance[31000000, 120000000]
h) [ 196.871298] sw_uart_check_baudset()443 - uart1, select set 5, baud 1000000, uartclk 24000000 beyond rance[31000000, 120000000]
修改串口的速率,根据uartclk 24000000查看lichee/linux-3.4/drivers/tty/serial/sunxi-uart.c中的范围,提高或者降低波特率。在android\hardware\broadcom\libbt\include\vnd_softwinner-ap6476.txt中修改
BLUETOOTH_UART_DEVICE_PORT = "/dev/ttyS2"
FW_PATCHFILE_LOCATION = "/system/vendor/modules/"
LPM_IDLE_TIMEOUT_MULTIPLE = 5
UART_TARGET_BAUD_RATE = 1500000
30.wifi,蓝牙等默认开关位置
android\frameworks\base\packages\SettingsProvider\res\values\defaults.xml
31.A23(5501)增加、删除wifi选项
1)注释或者添加
android:title="@string/header_category_wireless_networks" />
android:id="@+id/wifi_settings"
android:fragment="com.android.settings.wifi.WifiSettings"
android:title="@string/wifi_settings_title"
android:icon="@drawable/ic_settings_wireless" />
2)X:\softwinner\A23\nw5501\nw5501_sources_wifi_0805\android\packages\apps\Settings\src\com\android\settings\Settings.java
a)在 private int[] SETTINGS_FOR_RESTRICTED 中注释或者添加
//R.id.wireless_section,
//R.id.wifi_settings,
B)在private void updateHeaderList(Listtarget)中注释或者添加
else if (id == R.id.wifi_settings) {
// Remove WiFi Settings if WiFi service is not available.
if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI)) {
target.remove(i);
}
}
C)在static int getHeaderType(Header header) 中注释或者添加
else if (header.id == R.id.wifi_settings
header.id == R.id.bluetooth_settings) {
return HEADER_TYPE_SWITCH;
}
D)在 switch (headerType) {中注释或者添加
if (header.id == R.id.wifi_settings) {
mWifiEnabler.setSwitch(holder.switch_);
} else {
mBluetoothEnabler.setSwitch(holder.switch_);
}
3)有wifi的时候出现如下错误
D/audio_hw_primary( 114): out_standby
E/WifiHW ( 378): Supplicant not running, cannot connect
E/WifiHW ( 378): Supplicant not running, cannot connect
E/WifiHW ( 378): Supplicant not running, cannot connect
E/WifiHW ( 378): Supplicant not running, cannot connect
E/WifiHW ( 378): Supplicant not running, cannot connect
E/WifiStateMachine( 378): Failed to setup control channel, restart supplicant
D/WifiHW ( 108): Enter: wifi_get_fw_path function, fw_type=0,
E/WifiStateMachine( 378): Failed to reload STA firmware java.lang.IllegalStateException: command '129 softap fwreload wlan0 STA' failed with '400 129 Softap operation failed (No such device)'
W/CommandListener( 108): Failed to retrieve HW addr for wlan0 (No such device)
D/CommandListener( 108): Setting iface cfg
E/WifiStateMachine( 378): Unable to change interface settings: java.lang.IllegalStateException: command '131 interface setcfg wlan0 0.0.0.0 0 down' failed with '400 131 Failed to set address (No such device)'
E/wpa_supplicant( 3204): nl80211: Could not configure driver to use managed mode
E/wpa_supplicant( 3204): Could not read interface p2p0 flags: No such device
E/wpa_supplicant( 3204): p2p0: Failed to initialize driver interface
E/WifiHW ( 378): Unable to open connection to supplicant on "wlan0": No such file or directory
E/WifiHW ( 378): Supplicant not running, cannot connect
E/WifiHW ( 378): Supplicant not running, cannot connect
E/WifiHW ( 378): Supplicant not running, cannot connect
E/WifiHW ( 378): Supplicant not running, cannot connect
E/WifiHW ( 378): Supplicant not running, cannot connect
E/WifiStateMachine( 378): Failed to setup control channel, restart supplicant
主要是驱动没有找到,查看驱动是否挂载,没有挂载的时候在init.sun8i.rc中加入insmod esp8089.ko
Adb shell基础知识
32.在写一个apk时,Edittext可以指定输入字符
33.
1)在shell中,可以使用am start -n 包名/类名 来打开应用程序如am start -n com.android.settings/.Settings
2)使用svc wifi enable/disabled来打开或者关闭wifi
3)Shell截屏:
adb shell /system/bin/screencap -p /sdcard/screenshot.png
adb pull /sdcard/screenshot.png E:\
34.制作测试软件
在lichee下执行./build.sh config选择平台dragonboard,然后编译lichee,同时更改test_config.fex,加载相应的驱动。
35.去掉电池图标
找到该文件android\frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\policy\BatteryController.java
//add by lc 150210 1line
import android.view.View;
import com.android.systemui.R;
public class BatteryController extends BroadcastReceiver {
private static final String TAG = "StatusBar.BatteryController";
private Context mContext;
private ArrayListmIconViews = new ArrayList();
private ArrayListmLabelViews = new ArrayList();
private ArrayListmChangeCallbacks =
new ArrayList();
public interface BatteryStateChangeCallback {
public void onBatteryLevelChanged(int level, boolean pluggedIn);
}
public BatteryController(Context context) {
mContext = context;
IntentFilter filter = new IntentFilter();
//del 20150210 1line
// filter.addAction(Intent.ACTION_BATTERY_CHANGED);
context.registerReceiver(this, filter);
}
public void addIconView(ImageView v) {
//add lc 20150210 2line
v.setVisibility(View.GONE);
mIconViews.add(v);
}
public void addLabelView(TextView v) {
//add lc 20150210
v.setVisibility(View.GONE);
mLabelViews.add(v);
}
36.一个应用不需要横竖屏选择的时候加入以下:只横屏显示,在AndroidManifest.xml的< p="">
37.只替换内核的时,在shell中,进入system目录:dd if=/boot.img of=/dev/block/nandc
38.设置字体大小比例
因为我修改 ro.sf.lcd_density的值,将它从160修改 为120,所以导致整个系统的字体都变得很小。因此需要将整个字体变大,并且在设置-->显示-->字体大小的4个选项的值都必须变大。我想到的思路是将字体的缩放比例调大一些,下面是我的修改步骤。
1、修改默认字体的大小
Step1: 修改frameworks/base/core/java/android/content/res/Configuration.java
文件中的setToDefaults()方法,将默认的字体缩放比例调为1.35f,即修改fontScale属性
[java]
Public void setToDefaults(){
fontScale=1.35f; //default value is 1
mcc = mnc = 0;
....
}
2、修改设置-->显示-->字体大小的4个选项值
Step2: vim packages/apps/Settings/res/values/arrays.xml和
vim packages/apps/Settings/res/values-sw600dp/arrays.xml
下面就是4个选项对应的值,分别为 小、正常、大、超大
[html]
1.4
dabao1.45
1.5
1.55
Step3: 编译frameworks模块
[html]
mm frameworks/
Step4:
编译packages模块
[html]
mm packages/
39.更改图标大小android\packages\apps\Launcher2\res\values-sw600dp\dimens.xml,找到58dp
,数值越大,图标越大。图标太大时字体会显示不全
40.禁用下拉菜单KeyguardViewMediator.java
03:2禁用状态栏下拉
if (mStatusBarManager == null) {
mStatusBarManager = (StatusBarManager)
getSystemService(Context.STATUS_BAR_SERVICE);
}
禁用if (mStatusBarManager != null) {
mStatusBarManager.disable(StatusBarManager.DISABLE_EXPAND);
}
不禁用if (mStatusBarManager != null) {
mStatusBarManager.disable(StatusBarManager.DISABLE_NONE);
}
41.摄像头插值,在camera.cfg中找到分辨率,改成你要
42.apk反编译问题,jdk最好装1.7以上的,版本太低有些反编译有些apk的时候会出现错误,
Exception in thread "main" java.lang.UnsupportedClassVersionError: brut/apktool/Main : Unsupported major.minor version 51.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(Unknown Source)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$000(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
打包后用apktool反编译再打包都没问题,安装时出现Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]错误,网上查资料原来是签名的问题,解决方案如下。
《一》使用命令行生成签名文件
(1)创建一个用来存放签名文件的文件夹Android_keystore
(2)在命令行窗口中输入命令:(粗体部分)
[java] view plaincopy
1. D:\Android_keystore>keytool -genkey -alias aeo_android.keystore -keyalg RSA -validity 2000 -keystore aeo_abdroid.keystore
[java] view plaincopy
1. 输入密钥库口令:
2. 再次输入新口令:
3. 您的名字与姓氏是什么?
4. [Unknown]: localhost
5. 您的组织单位名称是什么?
6. [Unknown]: btbu
7. 您的组织名称是什么?
8. [Unknown]: btbu
9. 您所在的城市或区域名称是什么?
10. [Unknown]: beijing
11. 您所在的省/市/自治区名称是什么?
12. [Unknown]: beijing
13. 该单位的双字母国家/地区代码是什么?
14. [Unknown]: cn
15. CN=XiaoFeng, OU=btbu, O=btbu, L=beijing, ST=beijing, C=cn是否正确?
16. [否]: y
输入的密钥口令
(如果和密钥库口令相同, 按回车):
这时会在D盘的Android_keystore文件夹下生成aeo_android.keystore文件,就是我们需要的签名文件,(-validity 20000 表示证书的有效天数为20000天)
《二》用生成的签名文件对apk文件进行签名
(1)在Eclipse中用“Export the unsigned apk”工具导出项目,这里保存到D盘的Android_keystore文件夹下,名为testbim.apk
(2)使用jarsigner给 testbim.apk 文件签名,如下所示:
[java] view plaincopy
1. D:\Android_keystore>"C:\Program Files\Java\jdk1.7.0_67\bin\jarsigner.exe" -verbose -keystore aeo_android.keystore -signedjar Launcher2_signed.apk Launcher2.apk aeo_android.keystore
2. 输入密钥库的口令短语:
3. 正在添加: META-INF/MANIFEST.MF
4. 正在添加: META-INF/AEO_ANDR.SF
5. 正在添加: META-INF/AEO_ANDR.RSA
6. 正在签名: res/drawable-hdpi/ic_action_search.png
7. 正在签名: res/drawable-hdpi/ic_launcher.png
8. 正在签名: res/drawable-ldpi/ic_launcher.png
9. 正在签名: res/drawable-mdpi/ic_action_search.png
10. 正在签名: res/drawable-mdpi/ic_launcher.png
11. 正在签名: res/drawable-xhdpi/ic_action_search.png
12. 正在签名: res/drawable-xhdpi/ic_launcher.png
13. 正在签名: res/layout/activity_main.xml
14. 正在签名: res/layout/two.xml
15. 正在签名: res/menu/activity_main.xml
16. 正在签名: AndroidManifest.xml
17. 正在签名: classes.dex
18. 正在签名: resources.arsc
keytool 是个密钥和证书管理工具。jarsigner 工具利用密钥仓库中的信息来产生或校验 Java 存档 (JAR) 文件的数字签名 (JAR 文件将类文件、图象、声音和/或其它数字化数据打包在一个文件中)。
这两个工具都是JDK自带的,所以你当前需要先确保JDK安装正确。并且环境变量设置正确,以便可以以命令行的方式进行处理。
输入密匙的口令短语:
......
通过上面的命令就可以讲未签名的testbim.apk 文件签名为
[java] view plaincopy
1. testbim_signed.apk
(3)最后验证是否签名成功
Android_keystore>"C:\Program Files\Java\jdk1.6.0_30\bin\jarsigner.exe" -verify testbim_signed.apk
如果成功则
输出:
jar 已验证
43.使用adb与机器连接的时候出现错误
adb server is out of date. killing...
ADB server didn't ACK
* failed to start daemon *
是adb server端口被占用了
先执行adb nodaemon server ,查看adb server的端口是多少
C:\Users\xxxx>
cannot bind 'tcp:5037'
再执行下netstat -ano
findstr "5037"
C:\Users\xxxxxx>netstat -ano
findstr "5037"
TCP 127.0.0.1:5037 0.0.0.0:0 LISTENING 4236
TCP 127.0.0.1:5037 127.0.0.1:49422 ESTABLISHED 4236
TCP 127.0.0.1:49422 127.0.0.1:5037 ESTABLISHED 3840
然后执行tskill 4236即可
44.去掉长按图标时Info选项
1) android\packages\apps\Launcher2\src\com\android\launcher2\SearchDropTargetBar.java在这个文件中去点关于info的信息
Line 49: private ButtonDropTarget mInfoDropTarget;
Line 67: dragController.addDragListener(mInfoDropTarget);
Line 69: dragController.addDropTarget(mInfoDropTarget);
Line 72: mInfoDropTarget.setLauncher(launcher);
Line 101: mInfoDropTarget = (ButtonDropTarget) mDropTargetBar.findViewById(R.id.info_target_text);
Line 105: mInfoDropTarget.setSearchDropTargetBar(this);
2) android\packages\apps\Launcher2\res\layout\drop_target_bar.xml中删除以下
xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/DropTargetButtonContainer"
android:layout_weight="1">
style="@style/DropTargetButton"
android:id="@+id/info_target_text"
android:text="@string/info_target_label"
android:drawableStart="@drawable/info_target_selector" />
备注:lichee/brandy/u-boot-2011.09/drivers/video_sunxi/sunxi_v2/de_bsp/de/lowlevel_sun8iw5/de_be.c
X:\softwinner\A33\7729\lichee\brandy\u-boot-2011.09\include\spare_head.h 52 #define SUNXI_UPDATE_NEXT_ACTION_CHARGE (6)