由于安卓系统比较复杂,开发中会发中会碰见各种小问题,在此做一些记录,只要觉得有必要就会添加进来。

1、触屏鼠标模式和触屏模式

开发android4.3高通400平台时,用atmel_max 640T作为触屏,很奇怪的问题,调好驱动后,系统运行的效果,居然跟鼠标一样,相对运动,网上查询资料几乎没有,大家都很懒啊!查到一个相关的文章,不过转载的多,已不知道到底谁写的了。

android4.0与2.3版本的触摸屏驱动调试注意

http://blog.sina.com.cn/s/blog_6a16c0ae0101asot.html

其实只要在你的/system/usr/idc目录下放一个文件为 $(tp_dev_name).idc文件即可,比我的修改记录如下

文件名为:atmel_mxt_ts.idc

内容为:touch.deviceType = touchScreen
touch.orientationAware = 1

即可由鼠标模式变为触屏模式,如果还有X,Y方向问题,可以由厂商固件调试。

2、布局文件idc和kl命名及放在哪

如idc命名及路径:

/system/usr/keylayout/Vendor_XXXX_Product_XXXX_Version_XXXX.kl
/system/usr/keylayout/Vendor_XXXX_Product_XXXX.kl
/system/usr/keylayout/DEVICE_NAME.kl
/data/system/devices/keylayout/Vendor_XXXX_Product_XXXX_Version_XXXX.kl
/data/system/devices/keylayout/Vendor_XXXX_Product_XXXX.kl
/data/system/devices/keylayout/DEVICE_NAME.kl
/system/usr/keylayout/Generic.kl
/data/system/devices/keylayout/Generic.kl

知道查找优先级顺序,用户软件可以访问/data,就可以做成任意按键映射。一般都在在system/usr相应的目录下,keylayout文件夹放按键映射(linux to Android),idc文件夹放输入模式设置。

在源码的frameworks\base\libs\androidfw\InputDevice.cpp的getInputDeviceConfigurationFilePathByName()函数中。

在运行的android设备的shell中执行dumpsys input会显示出所有input设备使用的idc及kl等信息,如下

3、固件升级

一些硬件有时候要升级固件,固件放在哪,怎么命名,怎么升级?

如果你去看Android第一个init程序源码,你会发现放在哪?

在Android源码的system/core/init下的devices.c文件中有放在哪的定义

#define FIRMWARE_DIR1   "/etc/firmware"//实际上是安卓系统的system/etc的link
#define FIRMWARE_DIR2   "/vendor/firmware" //实际上是安卓系统的system/vendor的link
#define FIRMWARE_DIR3   "/firmware/image"

至于如何命名一般都是由驱动决定的,

request_firmware(const struct firmware **firmware_p, const char *name,struct device *device)就是加载用户空间的固件到数据到内核空间,一般固件有2种:完整固件和配置。该函数的name就是文件名,可以是驱动代码写死的固件名,也可以是由用户在驱动属性节点下动态echo进去的,firmware_p是个存放固件原始数据的结构体。这个函数只是加载用户空间到内核空间,没有任何处理,相当于copy,至于怎么校验,怎么升级都是由芯片厂家的协议决定的。那么何时升级?可以内核一启动就升级,也可以在系统起来时动态升级,根据需求加载不同的固件版本,一般在系统都预留了升级节点,比如echo fw_name > update_fw或者echo cfg_name > update_cfg,也可能是echo 1 > update_fw(当然这种情况名字事先定好了)。

4、自定义编译模块

有时候在Android源码加入自己的底层HAL或者apk,但是如何让它编译进系统。此处不得不提Android.mk中的LOCAL_MODULE_TAGS这个参数值一般有3个:eng usr optional,前2个分别代表工程模式,用户模式镜像才会编译进去,而optional就比较特殊了,故名思议它需要在其他地方确认,其他地方是哪?一般就是不同的board类型,比如高通处理器msm8610,msm8974都有可能,在对应board类型的makefile中加入,那么这个类型的板子就会编译该模块。

举例:比如我集成一个叫SysSetting的apk源码到安卓系统中,其中Android.mk就用了optional,如果就这样是永远编译不到系统的,还要在device\qcom\msm8610\msm8610.mk中加入PRODUCT_PACKAGES += SysSetting,那么在编译msm8610的时候就会编译SysSetting.apk到系统中。

5、自定义文件的拷贝

有时候希望系统编译的时候,将一个地方的文件自动的copy到另一个地方(另一个地方一般都是Android系统镜像所在目录),比如编译的时候将某个固件或者配置文件copy到Android系统的system某个目录。

举例:比如在Android源码的device\qcom\msm8610下的msm8610.mk中加入

PRODUCT_COPY_FILES += \
    device/qcom/msm8610/atmel_mxt_ts.idc:system/usr/idc/atmel_mxt_ts.idc

冒号前表示待拷贝文件原路径,冒号后面表示要被拷贝到的路径(默认前缀是out\target\product\$(board))

6、不能传送文件进系统

一般会出现文件系统是只读系统的警告,这个时候如果你是eng镜像(开发者模式),你可以在adb下直接adb remount系统就变为可写的了,这个时候你就能用adb push,adb pull推送文件或者导出文件了;但是如果系统是usr镜像(一般买的手机等Android设备都是usr的),adb remount命令系统都不理你,没办法了?好吧,你就ROOT吧,然后用RE管理器吧!

7、制作开机画面(splash.img)

一开机就是小企鹅,但是给客户的机器是有定制开机logo的,开始从网上找到什么第一屏制作工作,根本就不行,后来才知道在android源码中就有制作工具。我的是高通的源码,在msm8x12/device/qcom/common/display/logo下有个logo_gen.py,这就是工具,在这个目录下直接运行Python ./logo_gen.py xxx.png就会在当前目录下生成xxx.img。

参考文章 :Android——开机卡通,http://www.csdn123.com/html/exception/654/654636_654641_654638.htm

android关机动画,http://blog.csdn.net/zeng622peng/article/details/7334018 author:zeng622peng

android定制化开关机动画、铃音, http://blog.csdn.net/zeng622peng/article/details/7334016

图片动画阶段包括

1.bootloader图片

这个其实就是splash.img,在U-BOOT阶段使用,开机图片,开机第一屏,第一次拿到的一般都是小企鹅。

2.内核图片

参考文章:修改Linux内核启动图片 http://www.linuxde.net/2013/06/13936.html

这个一般android手机不用,原理就是直接刷framebuffer,如果要用的话要开启一些编译选项,还要替换图片资源,在linux源码的drivers/video/logo下,具体见参考文章。

3.init进程启动动画

播放的资源在系统的目录/initlogo.rle,

4.android系统服务启动动画

默认动画就是滚动的“android”字符串,其资源在frameworks/base/core/res/assets/images;当然用户可以自定义,一个bootanimation.zip其中打包了一个图片文件夹part0和一个描述动画动作属性的文件desc.txt,把这个动画压缩包放在/data/local/bootanimation.zip或者/system/media/bootanimation.zip,与上面2段布局文件路径类似,前者优先级高,可通过apk修改动画文件,一般system目录都不能改的。至于关机动画和开关机声音,具体修改见上面参考的文章。

8、内核启动预先处理自定义cmdline字段

由于开发需要,我在LK中增加了一个camera_type字段,值为c200或者c201,便于内核启动时加载处理不同的摄像头驱动,那么加载驱动之前,你就得知道摄像头型号,解决办法就是用__setup(str,fn);这个宏函数是内核提供的,你要看其定义就知道链接时str放在init.data段的,fn放在init.set段,fu的类型为static int __init fn(char *str)。这样一来实际是使.init.setup段变成一张表,Kernel在处理每一个启动参数时,都会来查找这张表,与每一个数据项中的成员str进行比较,如果完全相同,就会调用该数据项的函数指针成员setup_func所指向的函数(该函数是在使用__setup宏定义该变量时传入的函数参数),并将启动参数如root=后面的内容传给该处理函数。比如我用到的__setup("devfunc=", devfunc_setup);而在cmdline中devfunc=S1W1G4,这样的话devfunc_setup函数得到的输入参数为S1W1G4,这样你的驱动就能根据devfunc=传入的值,想怎样就怎样了。

9、实体MENU键能解开锁屏界面及按键唤醒

在开发一个平板项目,测试人员反馈,按POWER键唤醒后,再按以下MENU键,锁屏界面直接就解锁了。然后我就在安卓代码里grep KEY_MENU字段。在frameworks/base/core/res/res/values/config.xml中,有这么一行<bool name="config_disableMenuKeyInLockScreen">false</bool>,这个值为false时,MENU就能解锁屏,true时禁用解锁。另外按键唤醒是如何设定的呢?!在/system/usr/layout下是不是有XXX.kl,如果不是自定义的话,就用默认的Generatic.kl。仔细看key 115   VOLUME_UP  WAKE_DROPPED,key 114 VOLUME_DOWN WAKE_DROPPED,key 102 HOME WAKE,其中的WAKE代表这个键值将唤醒屏幕并且上报给应用,WAKE_DROPPED代表这个键将唤醒屏幕并且不上报给应用。这里有个疑问的地方,经测试如果机器进入深度休眠的话带有WAKE*的键并不能唤醒,如果是浅度休眠(比如充电,播放音乐时,只要CPU没完全停就行)时可以的,我的理解,如果某个键能实现像电源键POWER一样能深度休眠唤醒的功能,还得在底层“注册”这个能硬件唤醒的中断。

10、传感器放置布局layout

传感器(电子罗盘,加速度计),这些都是有坐标系方向的,即使是同样的芯片,在PCB上的方向布局不同,输出的数据肯定会不同,那么这个方向的设定在哪里呢,开始我也不知道,后来不经意的在电子罗盘akm09911调试的时候翻了akm公司提交的git代码,akm有个后台算法程序,这个程序中的layout有1到8共8个值,代表8种布局方式,为什么是8种?正面反面加上每个面的pin_1有四种方向共8种,这个值一般在kernel的DTS中传到驱动来。8种值布局描述如下图:

11、多语言及默认启动语言

build/target/product/full_base.mk下会继承locales_full.mk,locales_full.mk会继承languages_full.mk或者languages_small.mk,其中的PRODUCT_LOCALES代表的就是支持的多语言。

frameworks/base/core/jni/AndroidRuntime.cpp(其中的readLocale()函数)是Android系统运行时真正执行默认语言的代码。该代码优先读取persist.sys.language和persist.sys.country(在build/target/product/core.mk中的PRODUCT_PROPERTY_OVERRIDES中设置),若没有(property_get()为0),就读取ro.product.locale.language和ro.product.locale.region,这2个属性再没有就取默认值en和US。

恢复出厂系统默认使用的是/build.prop中的ro.product.locale.language和ro.product.locale.region分表代码语言和国家。当你设置中修改语言后,会在/data/property/下生成persist.sys.language和persist.sys.country。系统语言和区域生效策略为:优先使用persist属性,没有就使用ro属性,再没有就是en_US。

你如果有root权限,当你默认系统是zh_CN,你进行如下操作后

echo fr > persist.sys.language

echo FR > persist.sys.country

然后重启系统就变成法文了。

12、android.mk集成第三方java包

[plain] view plaincopy
  1. LOCAL_PATH :=$(call my-dir)
  2. include $(CLEAR_VARS)
  3. LOCAL_MODULE_TAGS := optional
  4. LOCAL_JAVA_LIBRARIES := ScannerAPI  telephony-common telephony-msim
  5. LOCAL_STATIC_JAVA_LIBRARIES :=zxing  ScannerAPI android-support-v4 android-support-v13
  6. LOCAL_SRC_FILES :=$(call all-java-files-under, src)
  7. LOCAL_PACKAGE_NAME := SetInput_X
  8. LOCAL_CERTIFICATE := platform
  9. LOCAL_PROGUARD_ENABLED := full
  10. include $(BUILD_PACKAGE)
  11. include $(CLEAR_VARS)
  12. LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES :=zxing:libs/zxing-1.6-core.jar
  13. include $(BUILD_MULTI_PREBUILT)

其中 LOCAL_STATIC_JAVA_LIBRARIES :=zxing  ScannerAPI android-support-v4 android-support-v13中,依赖的包zxing只是个模块名字,真正的包在

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES :=zxing:libs/zxing-1.6-core.jar

13、高通平台Android崩溃抓dump并解析内核信息

有时候因为硬件问题或者编译出的系统有问题,安卓系统就会崩溃然后黑屏,这个时候log肯定也打不出来了,无法知道哪出了问题,那么使用高通工具QPST抓dump就很方便了。

当机器黑屏崩溃后,USB链接插入电脑,打开QPST的eMMC Software Download软件,中间显示的框子中会看到一个Qualcomm USB storage dev相关的设备,等待直到安卓设备重启,这时dump就抓取完成,dump文件抓取完一般放在电脑的

C:\Documents and Settings\All Users\Application Data\Qualcomm\QPST\Sahara\$(USB端口号)\DDRCS0.BIN

其中$(USB端口号)需要在设备管理器中查看,然后在ubuntu环境下执行命令,

"strings DDRCS0.BIN | grep -REns "<.>

.+

" > kdump.txt"

这样kdump.txt就是内核的打印

14、高通平台差分升级/完整升级

高通平台升级可通过无线OTA升级,也可以用sdcard升级,升级包都是一样的,支持完整升级包(包含完整Android系统进行)和差分升级包(必须从A版本升级才能到B版本,差分包就是A版本到B版本的差异补丁包)。

OTA无线升级一般人都知道的,sdcard升级:将待升级包拷贝到sdcard,插到设备上,开机进入recovery模式,选择到“apply update from sdcard”,按power键确认,进入后再选择要升级的包,按power键进行升级,截图如下:

如果有源代码,那么完整升级包在哪,差分升级包怎么做?

高通平台编译后在msm8x12\out\target\product\msm8610\msm8610-ota-eng.zip就是完整升级包,大小200M左右。

差分升级包制作需要2个版本的msm8610-target_files-eng.zip,其在源码路径如下,

msm8x12\out\target\product\msm8610\obj\PACKAGING\target_files_intermediates\msm8610-target_files-eng.zip

制作命令:

ota_from_target_files -p ~/otatool/bin -k ~/otatool/releasekey  -i $(pwd)/A.zip $(pwd)/B.zip $(pwd)/A_TO_B.zip

其中A和B就是上面说的2个版本的msm8610-target_files-eng.zip改名而来,当前目录下的A_TO_B.zip就是差分升级包,大小几M或几十M。

15、签名

一般当你的应用使用到system权限时,就需要签名了,不然你连apk安装都装不上。

应用中manifest使用    android:sharedUserId="android.uid.system"

签名时使用命令java -jar signapk.jar platform.x509.pem platform.pk8 old_name.apk new_name.apk

signapk.jar在msm8x12\out\host\linux-x86\framework目录下

至于platform.x509.pem和platform.pk8他们存在于msm8x12\build\target\product\security目录下

一般总共有四种签名:

testkey普通apk签名使用;在源码中Android.mk中有一个LOCAL_CERTIFICATE字段未指明,默认也是testkey签名

platform该签名的apk使用到了系统核心功能,该进程的UID为system

shared该签名的apk与home、contact共享数据

media该签名的apk是media、download的一环

16、persist目录的使用

persist目录在我们的设备上,是persist分区,然后挂载到/persist目录上,只有system有读写权限,其大小指定来自于device/qcom/msm8610/BoardConfig.mk(一般与vendor下某个地方copy出来的)指定,BOARD_PERSISTIMAGE_PARTITION_SIZE := 5242880,其他的相关分区大小及一些基地址这也有指定。大小如何定呢?msm8x12/vendor/qcom/proprietary/tools/ext4_sparse/rawprogram0.xml是各个镜像分区的起始地址及占的大小的指定,烧写的时候就是根据这个指示来烧写的,比如片段如下

[plain] view plaincopy
  1. <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="system.img" label="system" num_partition_sectors="1638400" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="819200.0" sparse="true" start_byte_hex="0x1c000000" start_sector="917504"/>
  2. <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="persist.img" label="persist" num_partition_sectors="65536" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="32768.0" sparse="true" start_byte_hex="0x4e000000" start_sector="2555904"/>
  3. <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="cache.img" label="cache" num_partition_sectors="65536" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="32768.0" sparse="true" start_byte_hex="0x50000000" start_sector="2621440"/>

生成persist.img的脚本来自于msm8x12\device\qcom\common\generate_extra_images.mk,实际上就是对msm8x12\out\target\product\msm8610\persist文件夹打包(如果要放置用户文件,在你的makefile中将文件拷贝到这个目录就行了),它还生成device tree还有如oem.img等其他镜像。

[plain] view plaincopy
  1. #----------------------------------------------------------------------
  2. # Generate oem image (oem.img)
  3. #----------------------------------------------------------------------
  4. ifneq ($(strip $(TARGET_NO_KERNEL)),true)
  5. TARGET_OUT_OEM := $(PRODUCT_OUT)/oem
  6. INTERNAL_OEMIMAGE_FILES := \
  7. $(filter $(TARGET_OUT_OEM)/%,$(ALL_DEFAULT_INSTALLED_MODULES))
  8. INSTALLED_OEMIMAGE_TARGET := $(PRODUCT_OUT)/oem.img
  9. define build-oemimage-target
  10. $(call pretty,"Target oem fs image: $(INSTALLED_OEMIMAGE_TARGET)")
  11. @mkdir -p $(TARGET_OUT_OEM)
  12. $(hide) $(MKEXTUSERIMG) -s $(TARGET_OUT_OEM) $@ ext4 oem $(BOARD_OEMIMAGE_PARTITION_SIZE)
  13. $(hide) chmod a+r $@
  14. $(hide) $(call assert-max-image-size,$@,$(BOARD_OEMIMAGE_PARTITION_SIZE),yaffs)
  15. endef
  16. $(INSTALLED_OEMIMAGE_TARGET): $(MKEXTUSERIMG) $(MAKE_EXT4FS) $(INTERNAL_OEMIMAGE_FILES)
  17. $(build-oemimage-target)
  18. ALL_DEFAULT_INSTALLED_MODULES += $(INSTALLED_OEMIMAGE_TARGET)
  19. ALL_MODULES.$(LOCAL_MODULE).INSTALLED += $(INSTALLED_OEMIMAGE_TARGET)
  20. endif

msm8x12\device\qcom\msm8610\init.target.rc在fs或者early-fs中进行分区的挂载。

[plain] view plaincopy
  1. on fs
  2. mount_all fstab.qcom
  3. # Keeping following partitions outside fstab file. As user may not have
  4. # these partition flashed on the device. Failure to mount any partition in fstab file
  5. # results in failure to launch late-start class.
  6. wait /dev/block/platform/msm_sdcc.1/by-name/persist
  7. mount ext4 /dev/block/platform/msm_sdcc.1/by-name/persist /persist nosuid nodev barrier=1

在msm8x12\device\qcom\common\rootdir\etc\init.qcom.rc中进行待挂载点创建和权限修改。

[plain] view plaincopy
  1. on init
  2. mkdir /persist 0771 system system
  3. ...
  4. chown system system /persist
  5. chmod 0771 /persist

这样你就可以在内核和android中适当的去使用你的想法了

17、调试gpio

gpio在kernel中再常见不过了,但它的使用也不是想怎么用就怎么用的。好多进去,不request直接就是set_gpio,那么多个地方都这样get/set不就乱了么,也不要在驱动中直接去ioremap然后直接去操作寄存器(三星的2440教程中好多就这么教的),这样也会造成混乱,大多情况在machine中都设置好了gpio_chip,我们要做的就是翻看数据手册要使用的GPIO_pin号以及要配置成的功能,然后使用标准GPIO的API去使用即可。使用也有套路,先request再使用(set/irq等),不再使用了就free掉。使用request加上请求标签有利于调试,比如在我的msm8x12的内核中使用如下代码:

[cpp] view plaincopy
  1. if(gpio_is_valid(pdata->gpio_RSTN))
  2. {
  3. rc = gpio_request(pdata->gpio_RSTN, "akm09911_rest");//调试看到的名字
  4. if(rc){
  5. dev_err(dev, "%s: akm09911 rest gpio request failed.\n", __func__);
  6. }else{
  7. gpio_direction_output(pdata->gpio_RSTN, 1);
  8. mdelay(3);
  9. dev_err(dev, "%s: akm09911 rest gpio:%d request OK!.\n", __func__,pdata->gpio_RSTN);
  10. }
  11. }

那么在内核输入cat  /sys/kernel/debug/gpio得到的信息如下

由上图的红色框可见,正如代码设置一样,标签为"akm09911_rest",输出高。

GPIO相关的常用API如下:

[cpp] view plaincopy
  1. //判断一个IO是否合法:
  2. int gpio_is_valid(int number);
  3. //设置GPIO的方向,如果是输出同时设置电平:
  4. /* set as input or output, returning 0 or negative errno */
  5. int gpio_direction_input(unsigned gpio);
  6. int gpio_direction_output(unsigned gpio, int value);
  7. //获取设置引脚的电平:
  8. /* GPIO INPUT: return zero or nonzero */
  9. int gpio_get_value(unsigned gpio);
  10. /* GPIO OUTPUT */
  11. void gpio_set_value(unsigned gpio, int value);
  12. int gpio_cansleep(unsigned gpio);
  13. /* GPIO INPUT: return zero or nonzero, might sleep */
  14. int gpio_get_value_cansleep(unsigned gpio);
  15. /* GPIO OUTPUT, might sleep */
  16. void gpio_set_value_cansleep(unsigned gpio, int value);
  17. //获取一个GPIO并声明标签:
  18. /* request GPIO, returning 0 or negative errno.
  19. * non-null labels may be useful for diagnostics.
  20. */
  21. int gpio_request(unsigned gpio, const char *label);
  22. /* release previously-claimed GPIO */
  23. void gpio_free(unsigned gpio);
  24. 将GPIO映射为IRQ中断:
  25. /* map GPIO numbers to IRQ numbers */
  26. int gpio_to_irq(unsigned gpio);
  27. /* map IRQ numbers to GPIO numbers (avoid using this) */
  28. int irq_to_gpio(unsigned irq);
  29. 设置GPIO IRQ中断类型:
  30. int irq_set_irq_type(unsigned int irq, unsigned int type)//或者将中断设置和中断处理一起进行
  31. int request_threaded_irq(unsigned int irq, irq_handler_t handler,
  32. irq_handler_t thread_fn, unsigned long irqflags,
  33. const char *devname, void *dev_id)

18、快速获取linux/android的config

adb pull /proc/config.gz f:\
用adb工具将内核配置文件放到WINDOWS的F盘,然后加压就能看见config了。

Android开发小问题集相关推荐

  1. Android studio 实现计算器android 开发小实验

    Android 移动开发实现简单计算器功能 前言 android 开发小实验 android 移动开发实现 简易计算器功能 小白也能轻松上手,复制粘贴就可使用 使用工具 Android Studio ...

  2. Android studio 实现打电话发短信浏览网页功能 android开发小实验

    Android studio 实现打电话发短信浏览网页功能 android开发小实验 目标: android studio 实现打电话 发短信 浏览网站的功能 先在布局里面定义几个按钮 分别为 打电话 ...

  3. 【Android开发小项目】2、猜数字游戏 You win or you suck?

    文章目录 Android开发小项目_2.猜数字游戏 界面Preview 实现方式:拖动Platte 对每个组件进行命名 Java活动代码 注:部分代码解释 parseInt方法简介 新建Wiget对象 ...

  4. Android开发小技巧 | 一句命令搞定截屏

    -- 简书作者 谢恩铭 转载请注明出处 一句命令搞定截屏 在安卓开发中, 我们很多时候都要用到截屏这个功能. 有时是为了演示, 有时是为了报告问题(比如在Bugzilla, Jira, Redmine ...

  5. Android 开发小技巧 | 一句命令搞定截屏

    -- 作者 谢恩铭 转载请注明出处 一句命令搞定截屏 在安卓开发中, 我们很多时候都要用到截屏这个功能. 有时是为了演示, 有时是为了报告问题(比如在Bugzilla, Jira, Redmine等B ...

  6. Android 开发小作:Minofo(2)

    本文作为 Minofo 开发的第二篇文章,详细介绍了 高德地图 API 的使用,包括地图 SDK 和定位 SDK 的用法,实现了 Minofo 的地图模块.另外还介绍了用车面板的实现以及利用 OkHt ...

  7. Android开发-小技巧汇总2

    启动虚拟机时,在 launch options 窗口中 有个 wipe user data ,勾选它,将会让虚拟机 [恢复出厂设置] 2.[如果想让自己的应用程序有多个启动图标:] 为一个应用的 多个 ...

  8. android 开发小工具,Android 开发者必备的八款小工具

    在做Android 开发过程中,会遇到一些小的问题,虽然自己动手也能解决,但是有了一些小工具,解决这些问题就得心应手了,今天就为大家推荐一些Android 开发必备的小工具. Android Pixe ...

  9. Android 开发小技巧(2)

    转自:农民伯伯: http://www.cnblogs.com/over140/ 常用代码 7.1   在当前Activity中启动另外一个Activity startActivity(new Int ...

最新文章

  1. java安全插件_如何安全地实现Java插件安全性?
  2. 分享一套开源微信后台开发源码,简单配置就能使用(附源码)!
  3. (转)c#中const与readonly区别
  4. Cloud一分钟 | 腾讯打造云启商学院,马化腾将担任荣誉院长;阿里巴巴:2018财年云计算收入同比增长101%...
  5. Python中的三个特殊函数
  6. 千月影视双端源码开源版_最新支持双端神器更新,属实有点牛逼!
  7. C++如何防止头文件被二次编译
  8. 攻击需要成本吗_光伏智能温室建设成本高吗?需要哪种钢结构?
  9. [ZigBee] 15、Zigbee协议栈应用(一)——Zigbee协议栈介绍及简单例子(长文,OSAL及Zigbee入门知识)...
  10. H5打包成app的在线工具
  11. JSON简介与解析方法(超级详细)
  12. grammarly怎么安装到word
  13. rockchip rk3566 调试杂记
  14. 自写:二维码签到程序,功能咋能完善一些?
  15. 单反相机的传奇—佳能单反50年辉煌之路(连载十七)
  16. 无法更新运行时文件夹共享状态_关于iPadOS 13.4更新的5件事
  17. Linux下的Curses库的下载与安装
  18. list.isEmpty() CollectionUtils.isEmpty(list)区别?
  19. linux运维前景2018,Linux运维工程师为什么越来越受企业重视?
  20. 金立m3是相当于Android,对这些手机进行深度测评后,原来金立M3的性价比更高

热门文章

  1. 普通类可以抛出异常吗
  2. 032_jdbc-mysql批量操作
  3. 美版iphone更新系统无服务器,大量美版iPhone“伪装”成国行出现在各大平台,遇到一定不要买...
  4. java final关键字_终于明白 Java 为什么要加 final 关键字了!
  5. php中strrpos函数的返回值类型是型_PHP常用函数总结
  6. java实现单向链表
  7. 08day 数据泵(expdb/impdb)—数据导出
  8. 小白学python,零基础学Python难不难?
  9. 打开和关闭mysql服务器_启动和关闭MySQL服务器
  10. java.IO字节流和字符流详解