android Tips

本文搜集网上知识,记录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
View Code
// 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
View Code

  编译错误提示设置:

修改源码目录下的 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
View Code

   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
View Code

CERT.RSA中的证书详细信

原文地址:https://www.cnblogs.com/vendanner/p/5068835.html