本文搜集网上知识,记录android学习中的一些知识点
logcat:
// java层的logcat我们不谈,看native层:/system/core/include/log/log.h以ALOGV()为例, /* 50 * Normally we strip ALOGV (VERBOSE messages) from release builds. 51 * You can modify this (for example with "#define LOG_NDEBUG 0" 52 * at the top of your source file) to change that behavior. 53 */ #ifndef LOG_NDEBUG #ifdef NDEBUG #define LOG_NDEBUG 1 #else #define LOG_NDEBUG 0 #endif #endif #ifndef ALOGV #if LOG_NDEBUG #define ALOGV(...) ((void)0) #else #define ALOGV(...) ((void)ALOG(LOG_VERBOSE, LOG_TAG, __VA_ARGS__)) #endif #endif // 需设置#define LOG_NDEBUG 0才能输出系统的ALOGV()信息 #define ALOG(priority, tag, ...) LOG_PRI(ANDROID_##priority, tag, __VA_ARGS__) #endif /* * Log macro that allows you to specify a number for the priority. */ #ifndef LOG_PRI #define LOG_PRI(priority, tag, ...) android_printLog(priority, tag, __VA_ARGS__) #endif // 你可以看看从ALOGV一直到__android_log_print, // 而__android_log_print就关联的日志的写文件操作,这里我们先不提 #define android_printLog(prio, tag, fmt...) __android_log_print(prio, tag, fmt) // 接下来我们看看系统中的logcat文件 $ adb shell dmesg > dmesg.txt linux内核启动log,init进程log $ adb logcat -d -v time -b "main" > main.txt Zygote进程log $ adb logcat -d -v time -b "system" > system.txt SystemServer进程的log $ adb logcat -d -v time -b "events" > events .txt // 详情看 Android内核开发:学会分析系统启动log http://ticktick.blog.51cto.com/823160/1662911
// isLoggable(String tag, int level)可以控制log的输出,只有当tag-level大于level才返回true // if (BuildConfig.DEBUG && Log.isLoggable("MainActivity", Log.VERBOSE)) { // Log.v("MainActivity", message); // } // 上面代码只有isLoggable返回true才会执行括号中的Log.v来输出log // ok,那tag-level上面时候定义的呢: adb shell setprop log.tag.<YOUR_LOG_TAG> <LEVEL> <LEVEL>:VERBOSE, DEBUG, INFO, WARN, ERROR, ASSERT
编译错误提示设置:
修改源码目录下的 build/core/config.mk 如下: - TARGET_ERROR_FLAGS := -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point + #TARGET_ERROR_FLAGS := -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point + TARGET_ERROR_FLAGS := 如果是单个模块中的错误就找到报错模块下的Android.mk,把编译标志 Werror去掉就可以。方便起见,我是直接把所有的makefile中的Werror全部去掉了,当然要做好备份。 在Android.mk中添加标志禁用指定的Werror类型也可以: LOCAL_CFLAGS += -Wno-error=format-security http://blog.csdn.net/javensun/article/details/7448250
Android证书验证机制:
// apk的META-INF文件夹包含三个文件: // 1、MANIFEST.MF // 遍历APK包中除了META-INF 文件夹以外的所有文件,利用SHA1算法生成这些文件的消息摘要,然后转化为对应的base64编码。 // MANIFEST.MF存储的是文件的摘要值,保证完整性,防止文件被篡改。weixin的MANIFEST.MF: // Manifest-Version: 1.0 // Created-By: 1.7.0_45 (Oracle Corporation) // Name: r/t/a3k.xml // SHA1-Digest: c6GfCzDzRo75w7HwMzjcPXGi++I= // Name: r/v/a1m.png // SHA1-Digest: Ao27xq4nYyBR5Z0yG07pN0MtlKI= // …… // 2、.SF // xx.SF文件(xx为使用者证书的自定义别名,默认为CERT,即CERT.SF),保存的是MANIFEST.MF的摘要值, 以及MANIFEST.MF中每一个摘要项的摘要值, // 然后转化成对应的base64编码。虽然该文件的后缀名.sf(SignatureFile)看起来是签名文件,但是并没有私钥参与运算,也不保存任何签名内容。 // weixin的COM_TENC.SF: // Signature-Version: 1.0 // SHA1-Digest-Manifest-Main-Attributes: sY6+RQ4DWdnxCfSpiwTT6GRIwA0= // Created-By: 1.7.0_45 (Oracle Corporation) // SHA1-Digest-Manifest: GduDrpyEw/pgWazHpioH6+7MyKo= // // Name: r/t/a3k.xml // SHA1-Digest: b6IQQJD88w4yCVk0QHuy2cySHTE= // Name: r/v/a1m.png // SHA1-Digest: HqlAkc/TpMyeU/jhapu/Pxg1QLQ= // …… // 3、.RSA / .DSA // .RSA / .DSA文件(后缀不同采用的签名算法不同,.RSA使用的是RSA算法, .DSA使用的是数字签名算法DSA,目前APK主要使用的是这两种算法), // 保存的是第二项.SF文件的数字签名,同时还会包括签名采用的数字证书(公钥)。特别说明,当使用多重证书签名时, // 每一个.sf文件必须有一个.RSA/.DSA文件与之对应,也就是说使用证书CERT1签名时有CERT1.SF和CERT1.RSA, // 同时采用证书CERT2签名时又会生成CERT2.SF和CERT2.RSA。 // 小结:MF文件是对apk文件的hash(sha1是hash算法),SF文件是对MF的每项内容进行hash,RSA文件包含证书和私钥对SF内容加密后的结果2项内容 // 故MF和SF只能对apk完整性进行校验,而RSA是对app数字签名进行校验 // (用自定义的私钥重打包也可以通过android的数字签名校验,但可以在app是识别数字是否已被篡改——这是防止apk破解的方法) // 参考资料:http://bbs.pediy.com/showthread.php?t=195148 // FakeId是android签名校验的漏洞,可以我的android cve中找到,里面收集了网上的分析文章和poc