Android开发备忘录

1.Android中颜色的表示

颜色顺序不再是RGBA,而是ARGB

例如,在我们一般的opengl中,我们设置颜色时,是指定一个4元组,分别代表三个颜色分量R,G,B和一个Alpha值A

而在android中则是A,R, G, B

当然,在Android中,如果一个颜色值只有3个字节,那么就表明它不带Alpha值,只有RGB,Alpha值默认为FF.

2.SourceInsight的配置的几个问题

(1)让Si的文档标题显示完整的文件名的方法

英文版 去掉勾选 Options->Preferences->Display下的 “Trim long path names with ellipses”选项即可

中文版 去掉勾选 O选项参数选择->显示->用椭圆修剪长文件名

(2)修改字体

 英文版 Options->Document Options -> Screen Font

(3)TAB键修改

Options->Document Options 右下角的Editing Options,tab width填4,然后勾上expand tabs选择。

3.Eclipse 启动时,报错,workspace in use or cannot be created

这个问题,一般的解决方法是在workspace的目录下有个.metadata目录,这个目录下面有个.lock文件,是由于上次未正常关闭释放workspace的锁而造成的。解决方法就是把这个.lock文件删除掉就行了。
当然还有另外一种原因:workspace的路经不存在。给定一个 workspace的绝对路径,只有当workspace的文件夹名不存在时,Eclipse会自动创建这个workspace文件夹名,但是如果workspace的上一级路径不存在,就会存在这个问题。
原来我曾将workspace所在的文件夹改过名,因为把android拼错了,后来打开就一直有这个问题,也没想到过仔细检查路径。

4.修改Android源码时,使用git管理工具恢复

Android源码一般使用git版本管理工具管理,在研究Android源码时,有时要加上一些打印语句或是作些修改,但是也可能作了些些错误的修改或是记了某些修改导致系统启动不成功或是恢复原状,这时候可以使用 git的命令对代码进行恢复
简单介绍两个命令:
git diff <filename> 比较文件或是文件夹里文件的修改
git checkout file-name 撤销某个文件的修改,将其恢复原状

5.设置Android模拟器使用硬件加速

(1)一般情况,查看 http://developer.android.com/tools/devices/emulator.html#acceleration 的 Using Hardware Acceleration这一节就了解怎么设置了。
(2)如果是使用自己编译的内核源码镜像,而且从命令行启动,那么使用: emulator -gpu on 命令就可以了。

6.在Android源码中打印日志信息

(1)在java源码中:
a)导入日志库:import android.util.Log;

b)在要输出日志的地方直接使用 Log.d("JAVA_DEBUGGING", "Logging from Java!\n");

(2)在ndk源码中:

a)包含日志头文件:#include <android/log.h>

b)由于原始的写日志函数太复杂不太好用,所以自定义相关的宏:

#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, "JNI_DEBUGGING", __VA_ARGS__)
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,   "JNI_DEBUGGING", __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,    "JNI_DEBUGGING", __VA_ARGS__)
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN,    "JNI_DEBUGGING", __VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,   "JNI_DEBUGGING", __VA_ARGS__)
c)在要打印日志的源码所在的Android.mk中添加:LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog

d)在要输出日志的代码处使用:LOGD("Logging from C++!\n"); //其它四种日志方法类似

(3)查看日志的方法

a)如果使用Eclipse调试则使用DDMS显示所有Logcat日志,要查看某种特定Log_Tag的日志,添加一个Filter即可。

b)在命令行启动模拟器时,使用 adb logcat 可得到模拟器的日志信息,要查看特定TAG的日志,则配合grep命令:

adb logcat | grep LOG_TAG

7.在Android的NDK源码中打印堆栈信息

由于Android源码的c++层代码过于复杂,有些想知道一个函数被哪些函数调用或是这个函数在UI中的调用路径,那么可以使用打印系统堆栈的方法

 例如,在frameworks/native/services/surfaceflinger/LayerBase.cpp中,有一个方法 setAlpha,需要查看这个成员函数的调用路径:

a)在源码文件中添加打印堆栈用到的头文件:#include <utils/CallStack.h>

b)修改setAlpha方法:

bool LayerBase::setAlpha(uint8_t alpha) {
    ...
    #define _ARM_
    #ifdef _ARM_
    LOGD("CallStack...");	//by amw
    android::CallStack stack;
    stack.update(1, 100);
    stack.dump("");
    #endif
    ...
}

8.Android模拟器启动失败

Android模拟器启动失败的现象是一直停留在启动画面,进入不了主界面。这种情况是我在研究Android源码时出现的。

初步分析原因是在源码中加打印语句时出现的问题,

当使用Log.d(TAG, "字符串" + 一个数) 这种情况时就会出现。

使用System.out.println("TAG\t字符串" + 一个数) 也会出现这种问题,暂时没有发现解决的方法。

附:可以解决,原因应该是消息字符串不能是字符串和整数或浮点数直接相加,而要先把整数或浮点数转化成字符串,转化成字符器的方法:

Log.d(TAG, "字符串" + Float.toString(浮点数));

而且使用String.valueOf()这种方法转化也是不行的。

9.Android日志查看

Android的Log类产生的日志可以通过以下命令查看:

adb logcat -b radio

而在Android中还有许多由sLog类产生的日志,要查看它们,需用以下命令:

adb logcat -b system

-b 表示日誌存放的緩衝區

主要有三種:main radio 以及system

10.使用修改后的android源码编译Android应用程序

Android应用程序还是用Eclipse写,用它进行布局方面和设计以及代码编写和语法检查,当然,因为的代码中可能使用了新的你自己添加的Android 方法或是属性,在Eclipse中会出现错误,这个只要确认你没有用错,就不用管。

下一步将你的应用程序拷贝到android源码中的 packages/apps/ 目录下,然后packages/apps/下其它工程里拷贝一个Android.mk到你的工程中去,作一些修改,推荐拷贝DeskClock工程下的Android.mk,它本身比较简单,而且要修改的地方少,只要修改LOCAL_PACKAGE_NAME和LOCAL_OVERRIDES_PACKAGES两个环境值就行了,根据你自己的情况作修改。

接下来在你的工程中运行mm模块编译命令。

如果没有什么错误的话,会就生成相应的apk文件。你可以使用adb install命令进行安装。

当然,如果你在模拟器上运行你的程序,那么你接下来可能遇到以下问题。

11.adb install 安装失败

INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES:签名冲突造成的。使用adb install -r  安装也是不行的,最好要把原来的程序卸载掉,然后重新adb install安装。
INSTALL_FAILED_DEXOPT:这个是由于System/APPS下的apk都是经过优化的,dex不会被打包到apk中去,而是优化成odex,仔细观察mm命令的结果也可以看出
Install: out/target/product/generic/system/app/MyDemos.odex
Install: out/target/product/generic/system/app/MyDemos.apk
确实是有apk和odex两个文件。
解决方法是找到未优化过的apk文件,具体位置可能要搜索。例如我的搜索命令为find -name "*.apk.unaligned" | grep MyDemos,当前目标是android源码的顶层目录,MyDemos是我的工程名.找到未优化的apk,然后执行
adb install ./out/target/product/generic/obj/APPS/MyDemos_intermediates/package.apk.unaligned
安装这个未优化的 apk。
INSTALL_FAILED_UID_CHANGED:你以前安装过这个应用程序,到/data/data下删除完这个程序的包名对应的文件夹, 新安装的会另外生成uid,检查原来/data/data下的还是旧的就装不上。
参考:
http://blog.csdn.net/victoryckl/article/details/7858093#comments
http://blog.csdn.net/tedzyc/article/details/7971550

12.Android源码编译方法

第一种方法
自然是标准也是在全面和费时的方法:在源码的顶层目录使用 make命令进行全部编译,也可以根据自己的机器配置,决定开几个进程来加快编译只要带上参数 -jn,参数n表示同时开启的进程数,一般推荐 make -j4
第二种方法
增量编译
先进入到所在库的模块目录内,在有Android.mk的目录内执行mm命令
或是直接使用mmm <模块路径> 来编译此模块
然后使用mkyaffs2image命令直接更新system.img,至于这个命令怎么用,你执行一个make 或是make systemimage后,在输出结果的最末尾,就有这种命令的执行,你可以把这条执行命令写到一个mk.sh中去,然后每次mm命令完后直接运行这个mk.sh就行了。
这个编译方法我觉得如果只是研究android源码启动模拟器是没有问题的,但是,上面一些其它的应用能不能运行就不好说了。
还有一种方法是mm或是mmm命令后,使用make systemimage,这个比较好一点,但是比较费时。它会把android自带的工程也全部编译一遍,如果你用不到这些工作就比较费时了。

13.更改Android源码中的emulator的宽和高

Android源码中自带的emulator比较小,而且带右边的键盘,一般也很少用到,有时候想测试大屏幕的效果,又没有像avd那样直观的设置
可以通过启动emulator时加上参数 
emulator -skin xxx
这条命令会为这个模拟器新指定一个皮肤,不同的皮肤有不同的屏幕大小,至于这个xxx(皮肤名),可以在./development/tools/emulator/skins/这个目录下查看,例如我想使用一个平板电脑的屏幕,而且没有键盘,那么可以使用WXGA800皮肤,命令可以是这样的:
emulator -skin WXGA800

14.使用Eclipse进行Android源码调试

http://source.android.com/source/using-eclipse.html  这个是android官方网站的操作手册,但是有些步骤有问题。
http://wenku.it168.com/d_000085148.shtml   这个是一个中文的带图和文字的操作说明

15.查看Android版本信息

编译的时候从makefile的信息中确实可以看到,另外还可以从git(.repo/manifest.xml)中查询,或者到build/core/version_plaform.mk中去查询plaform_version的定义值。

16.创建和启动Android模拟器

1.查看当前支持版本(在列出的版本中我们需要记住id值,这个值在第2步中使用):

magicyu@magicyu-desktop:~$ android list target

你可以看到几个Available Android targets,比如:Name: Android 1.6,他们有各自的id号。

2. 创建AVD:

magicyu@magicyu-desktop:~$ android create avd -n magicyu -t 2

-n后面接需要创建avd的名字,-t后面接需要创建虚拟器的类型,2即为步骤(1)中得到的类型id号。

3. 查看是否创建成功(如果成功会显示刚才我们创建的avd信息):

magicyu@magicyu-desktop:~$ android list avd

4. 启动模拟器:

magicyu@magicyu-desktop:~$ emulator @magicyu 或者

emulator -avd magicyu

其中@和-avd后接的是你创建过的avd名字

5. 选择启动的皮肤

magicyu@magicyu-desktop:~$ emulator -avd magicyu -skin QVGA

skin后面接所要启动皮肤的类型,所有的类型可以在<SDK>/ platforms/android-1.*/skins目录下找到,*为所指的版本。如在1.6版本的SDK下有HVGA,QVGA, WVGA800,WVGA854几种。按Ctrl+F11,可以直接改变模拟器的横纵摆放。

17.将编译好的本地android库上传到android系统

一般因为android某些目录因为进程占用的关系,不能直接通过adb push将某个库推送到android系统的某个目录。

解决方法是通过重新挂载此目录,指定它的读写属性,这样就能通过adb push上传文件了。

1. adb shell登录进入android系统

2. 输入mount命令,查看android的系统分区,找到要上传的目录所在分区,并查看它的读写属性, 以/system目录为例

#mount | grep system

/dev/block/mmcblk0p1 /system ext4 ro,relatime,user_xattr,acl,barrier=1,data=ordered 0 0

3. 从上面可见, /system目录是只读的,三种方法:

a.  直接运行 adb remount

b.  如果以上不行的话,adb shell登录系统,文件系统remount为读写权限: mount -o rw,remount /system。出于安全考虑,记得完事后remount回只读: mount -o ro,remount /system

c. 和方法2类似,mount -o rw,remount -t ext4 /dev/block/mmcblk0p1 /system

18. 命令行启动android应用程序

am start -n com.android.settings/com.android.settings.Settings &
am start -n com.android.settings/com.android.settings.SoundAndDisplaySettings &
am start -n com.android.music/com.android.music.MediaPlaybackActivity -d file:///a.ogg &

其实就是去文件packages/apps/Settings/AndroidManifest.xml中观看package="com.android.settings", 然后所有activity的名字都可以使用上面的am start -n启动了     
 am start -n  package/package.Activityname  -d Uri &
手机可以adb shell && am --help 查看更加详细的语法


拨电话号码
am start -a android.intent.action.DIAL -d tel:0800000123 & 


直接打该号码(需要将packages/apps/Phone/AndroidManifest.xml中含有"android.intent.action.CALL"的所在activity即"OutgoingCallBroadcaster"包含的ndroid:permission="android.permission.CALL_PHONE"去掉才行)
am start -a android.intent.action.CALL -d tel:0800000123 & 


上网
am start -a android.intent.action.VIEW -d http://www.baidu.com &


发邮件
am start -a android.intent.action.SENDTO -d mailto:[email protected] &


显示地图
am start -a android.intent.action.SENDTO -d  "geo:38.899533,-77.036476" &

19. Android Emulator支持OpenGL ES 2.0

从4.03及以后的版本的Emulator都支持OpenGL ES 2.0.它们的原理是将OpenGL ES 2.0的调用转化成桌面版的OpenGL的调用,这样就可以利用本地图像层进行加速。

设置方法:

1. 打开Android Virtual Device Manager,编辑你的模拟器,找到硬件设置区,增加“GPU Emulation”,设置成true. 或是 找到"Use Host GPU",勾选。

2.在代码中,这里有一个bug: final boolean supportsES2 = configurationInfo.reqGIEsVersion >= 0x20000 不起作用,它总是返回false. 你需要增加"|| Build.FINGERPRING.startWith("generic")" 或是简单的注释掉检查,总是假设模拟器支持OpenGL ES 2.0

http://www.learnopengles.com/android-emulator-now-supports-native-opengl-es2-0/

20. Eclipse打开DDMS时卡死且系统占用100%

包冲突的原因。与libgail库冲突。解决方法是 sudo apt-get purge libgail*;如果有libgail-common,也要删除。注意,用此条语句会同时删除gimp; 如果不想这样的话,直接找到libgail.so 然后改个名字 比如 libgail.so.removed

你可能感兴趣的:(android)