转自 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)

转载:全志一些具体工作相关推荐

  1. 转载:身体器官工作表一览,睡觉别太晚了

    我们做IT的要时刻注意自己的身体呀!!! 转 身体器官工作表一览,睡觉别太晚了 任何试图更改生物钟的行为,都将给身体留下莫名其妙的疾病,20.30年之后再后悔,已经来不及了. 一.晚上9-11点为免疫 ...

  2. 好文转载—程序员在工作中会追求什么?

    1. 做软件产品.我希望我参与编写的程序成为公司的主要业务.这就排除了 IT 维护工作,因为这种工作只是间接地支持了真正的业务(不管它是什么).我也希望参与系统核心部分的工作,越重要的越好.如果我做的 ...

  3. 【转载】网易将军令工作原理

    最近开始玩梦幻手游,为了领以前端游的返利必须输入将军令,那个已经一年没用了,输入了几次都提示错误(后来证实是系统繁忙而已),我以为是将军令时间不对了,所以用了下官网的修复功能.也对将军令修复原理有了兴 ...

  4. 转载:在阿里工作四个月经历的总结

    来阿里也已经四个多月了,这段时间你学了很多东西,简单说起来,就是一个走出舒适区的过程,从一开始的新手入门,到逐渐熟悉业务和技术,再到慢慢的适应环境,胜任工作. 总体来说,这几个月还是学到了很多东西,感 ...

  5. 【转载】8年工作的总结

    仅作备份~原文地址在:link 版权声明:本文为陈小房博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 原文链接:https://blog.csdn.net/q ...

  6. 【转载】SpringMVC的工作原理

    声明: 转载文章署名及贴出原文链接 -------------------------------------------- 知乎-杀戮苍生 原文地址:https://zhuanlan.zhihu.c ...

  7. java 网页应用 原理_【转载】Web应用工作原理

    问题描述: Web应用工作原理 问题解决: 前言 什么是web应用程序?web应用程序又是如何进行工作的呢?什么是动态网页技术?又有 哪些动态网页技术呢?这次这篇文章需要探求总结的. Web应用 我们 ...

  8. 转载-关系型数据库如何工作

    关系型数据库如何工作 转自:https://blog.csdn.net/qq_34795226/article/details/106279976,其原文连接:http://coding-geek.c ...

  9. Spring MVC工作原理

    转载自  Spring MVC工作原理 Spring MVC框架介绍 Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面. Spring M ...

  10. 转载的--------待整理

    Launcher 总结:1.launcher的布局太居中,要想两边拉伸<\packages\apps\Launcher2\res\values\dimens.xml><dimen n ...

最新文章

  1. 五大自动化测试的 Python 框架
  2. python实现冒泡排序算法的非递归版本_python排序算法速度比较:快速排序,归并排序,冒泡排序...
  3. Thymelaf中使用select进行消息的回显
  4. 使用react、antd组件报错TypeError: _this.formRef.current.validateFields is not a function
  5. SpringIOC容器-对象依赖
  6. Codeforces Round #346 (Div. 2)
  7. python怎么读取csv文件-Python如何读取csv文件
  8. 如何利用webpack4.0搭建一个vue项目
  9. 云存储20181101-16讲
  10. SQL删除字段重复内容且保留唯一一条数据
  11. C语言实现socket网络编程及多线程编程
  12. 三菱plc与计算机无协议通讯,三菱PLC编程口协议与专用协议的区别
  13. MATLAB人脸识别系统
  14. CGAL license说明
  15. 【软考系统架构设计师】2014年下系统架构师案例分析历年真题
  16. Java项目实战:实现淡旺季飞机票打折
  17. Spring Boot系列——日志配置
  18. MQ,如何做到削峰填谷
  19. C语言程序写99乘法表,如何用C语言编程序:九九乘法表
  20. BAT、网易面试经验收集

热门文章

  1. windows安装和配置阿帕奇+PHP服务器
  2. hook read_chk 导致dex2oat进程 abort
  3. Chromium OS并行运行Linux chroot运行Linux
  4. linux磁盘扩容不影响原数据,linux 升级磁盘后扩容数据盘大小
  5. 基于 HttpClient 4.5 的 HttpClientUtils
  6. windows聚焦 电脑锁屏不显示图片问题
  7. ubuntu中wps字体添加
  8. 对称加密算法和非对称加密算法
  9. 姓名生成---拼音简码(大小写)---拼音全码(大小写)
  10. Selenium 爬取微信公众号文章并保存为pdf与长图片(2022-06-09更新版)