2015年10月16日星期五

Windows 10操作感好多了

稍微用了一下,发现好多了.
两个手指一起滑动可以按照想象的方向滚动屏幕了,以前是和直感相反,和智能手机以及Mac的都相反。

两个手指同时点击,就可以相当于鼠标右键点击弹出菜单了。这点肯定是和Mac学的,不知道会不会被告侵犯专利。

去掉了全屏幕的开始菜单画面了。
Edge浏览器全面向Chrome学习靠拢了,从界面到DeveloperTool。

但是浏览器还是哪里不对头,例如 这个网页,在别的Chrome/Firefox/Safari都能正常显示,可是IE11和Edge都怪怪的。
https://github.com/koush/UniversalAdbDriver/blob/master/usb_driver/android_winusb.inf

另外,Sleep还是比较慢,至少超过五秒。

2015年10月15日星期四

build-android-in-OS-X-Yosemite-Xcode-7

我的Mac必须升级到Xcode 7, 升了以后,Android(AOSP)编译不了了。Android的编译系统真烂啊。这次涉及到N个问题,例如libstdc++和libc++,Xcode的include/c++/v1不见了... 。 在不改变AOSP的*.mk的前提下,折腾出了一套方法。


build-android-in-OS-X-Yosemite-Xcode-7

build whole android (AOSP) in Mac OS X Yosemite + Xcode 7.0.1(v10.5 SDK)

My environment:

Mac OX X 10.10.5(14F27)
Xcode 7.0.1(7A1001)
jdk1.7.0_80
jdk1.8.0_51 (Default)
First of course, download AOSP by official instructions except that i use android-5.1.1_r14 branch instead of android-4.0.1_r1.
Then what i did especically are:

1. To avoid check error of OS X SDK version, run following command first:

export build_mac_version=`sw_vers -productVersion`  #for me, result is 10.10.5
export mac_sdk_version=10.9  #this is the biggest version AOSP build system support
export mac_sdk_root=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk
export gcc_darwin_version=11

2. To skip disk case sensitive check and java version check, create a file TOP_AOSP_DIR/out/versions_checked.mk with contents:

VERSIONS_CHECKED := 5
BUILD_EMULATOR ?= false
AOSP要求输出所在的文件系统区分大小写,这真是无稽之谈,我不相信有什么工具故意生成大小写不同的两个文件。而且java版本检查做的很笨,envsetup.sh里都能够正确的检测出了1.7了,为何这里就傻乎乎的非要执行1.8的java,还给我抱错!索性跳过去。

3. To avoid error of some header files not found, create a symbol link MacOSX10.11.sdk/...c++/v1 => xctoolchain/...c++/v1:

sudo ln -s /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1 /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/c++/v1
这个是我用-v选项打印出include path list后发现的。Xcode 7就自动的使用了toolchain的那个c++/v1。这个v1似乎是C++11的意思。一开始我把v1指向和他同级别的4.2.1目录,结果在ld链接时发生很多std:string的符号找不到,查呀查,发现需要用libstdc++而不是默认的libc++。后来发现Xcode根本就不用这个4.2.1目录里的东西,而是toolchain那边的,这才发现4.2.1里都是GNU的C++头文件,而v1里的都是LLVM工程里C++头文件。

4. AOSP's prebuild compiler for host side can not handle some latest header file of OS X SDK, i have no way, so modify following two files:

$mac_sdk_root/System/Library/Frameworks/CoreGraphics.framework/Versions/A/Headers/CGFont.h:

53c53,54
< static const CGFontIndex kCGGlyphMax = kCGFontIndexMax;
---
> //static const CGFontIndex kCGGlyphMax = kCGFontIndexMax;
> static const CGFontIndex kCGGlyphMax = ((1 << 16) - 2);

$mac_sdk_root/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/FSEvents.framework/Versions/A/Headers/FSEvents.h:

489a490
> #if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_9
495a497
> #endif
就是在489行插入#if,495行插入#endif。这个改动使得10.10以下无效,10.10开始才有效,本来里面的内容就是这个前提的,所以不影响Xcode的使用。


OK, now you can make, as a tip, you can add "showcommands" option to make, and even combine more like following commands to save output with timestamp prefix to log file.
make -j4 -k showcommands 2>&1 | (while read line; do echo `date +"%Y-%m-%d %H:%M:%S"` $line; done) | tee out/make.log
Good luck

2015年10月2日星期五

Mac OS X的利器dtrace,能实现process/file monitor,特别便于排错

有时一个程序出错,想搞清楚这个程序新启动了什么,访问了什么文件,在Windows上有Sysinternal的Process Monitor可用,在Mac OS X上可以用dtrace系列的newproc.d和iosnoop等工具,还有dtruss, dapptrace可以用来追踪单个程序里函数和外部lib调用,超强。


例如我想看看为什么Android的make系统出错,
先开启工具追踪瞬间启动的进程命令行,然后做自己想做的事,例如android的mm编译命令
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
sudo newproc.d
####结果############   这是实时显示的
2015 Oct  2 20:35:07 54743 <54052> 64b  make -C /Users/q/Documents/android_src -f build/core/main.mk all_modules
2015 Oct  2 20:35:07 54743 <54052> 64b  /Applications/Xcode.app/Contents/Developer/usr/bin/make -C /Users/q/Documents/android_src -f build/core/main.mk all_modules
2015 Oct  2 20:35:07 54744 <54743> 64b  /bin/bash -c uname -sm
2015 Oct  2 20:35:07 54744 <54743> 64b  uname -sm
2015 Oct  2 20:35:07 54745 <54743> 64b  /bin/bash -c expr 3.81 \>= 3.81
2015 Oct  2 20:35:07 54745 <54743> 64b  expr 3.81 >= 3.81
2015 Oct  2 20:35:07 54746 <54743> 64b  /bin/bash -c pwd
2015 Oct  2 20:35:07 54747 <54743> 64b  /bin/bash -c date +%Y%m%d.%H%M%S
2015 Oct  2 20:35:07 54747 <54743> 64b  date +%Y%m%d.%H%M%S
2015 Oct  2 20:35:07 54748 <54743> 64b  /bin/bash -c uname -sm
2015 Oct  2 20:35:07 54748 <54743> 64b  uname -sm
2015 Oct  2 20:35:07 54749 <54743> 64b  /bin/bash -c echo a | sed -E -e 's/a/b/' 2>/dev/null
2015 Oct  2 20:35:07 54751 <54749> 64b  sed -E -e s/a/b/
2015 Oct  2 20:35:07 54752 <54743> 64b  /bin/bash -c test -d device && find device -maxdepth 6 -name AndroidProducts.mk
2015 Oct  2 20:35:07 54753 <54752> 64b  find device -maxdepth 6 -name AndroidProducts.mk
2015 Oct  2 20:35:07 54754 <54743> 64b  /bin/bash -c test -d vendor && find vendor -maxdepth 6 -name AndroidProducts.mk
2015 Oct  2 20:35:07 54755 <54743> 64b  /bin/bash -c test -d device && find device -maxdepth 4 -path '*/generic/BoardConfig.mk'
2015 Oct  2 20:35:07 54756 <54755> 64b  find device -maxdepth 4 -path */generic/BoardConfig.mk
2015 Oct  2 20:35:07 54757 <54743> 64b  /bin/bash -c test -d vendor && find vendor -maxdepth 4 -path '*/generic/BoardConfig.mk'
2015 Oct  2 20:35:07 54758 <54743> 64b  /bin/bash -c prebuilts/gcc/darwin-x86/arm/arm-linux-androideabi-4.8/bin/arm-linux-androideabi-gcc -fno-exceptions -Wno-multichar -msoft-float (...)
2015 Oct  2 20:35:07 54758 <54743> 64b  prebuilts/gcc/darwin-x86/arm/arm-linux-androideabi-4.8/bin/arm-linux-androideabi-gcc -fno-exceptions -Wno-multichar -msoft-float -ffunction-sections -fdata-sections <...>
2015 Oct  2 20:35:07 54759 <54743> 64b  /bin/bash -c prebuilts/gcc/darwin-x86/arm/arm-linux-androideabi-4.8/bin/arm-linux-androideabi-gcc -fno-exceptions -Wno-multichar -msoft-float (...)
2015 Oct  2 20:35:07 54759 <54743> 64b  prebuilts/gcc/darwin-x86/arm/arm-linux-androideabi-4.8/bin/arm-linux-androideabi-gcc -fno-exceptions -Wno-multichar -msoft-float -ffunction-sections -fdata-sections <...>
2015 Oct  2 20:35:07 54760 <54743> 64b  /bin/bash -c build/core/find-jdk-tools-jar.sh
2015 Oct  2 20:35:07 54760 <54743> 64b  /bin/sh build/core/find-jdk-tools-jar.sh
2015 Oct  2 20:35:07 54761 <54760> 64b  which javac
2015 Oct  2 20:35:07 54762 <54760> 64b  ls -l /usr/bin/javac
2015 Oct  2 20:35:08 54765 <54763> 64b  sed -e s/.* -> //
2015 Oct  2 20:35:08 54767 <54760> 64b  sed -e s:\(.*\)/bin/javac.*:\1/lib/tools.jar:
2015 Oct  2 20:35:08 54768 <54743> 64b  /bin/bash -c java -version 2>&1
2015 Oct  2 20:35:08 54769 <54768> 64b  java -version
2015 Oct  2 20:35:08 54769 <54768> 64b  /usr/bin/java -version
2015 Oct  2 20:35:08 54770 <54743> 64b  /bin/bash -c function sgrax() { while [ -n "$1" ] ; do echo $1 ; shift done } ; ( sgrax  10 11 12 13 14 15 16 17 18 19 20 21 4 5 6 7 8 9 cu (...)
2015 Oct  2 20:35:08 54773 <54771> 64b  sort -g
2015 Oct  2 20:35:08 54774 <54743> 64b  /bin/bash -c python -c "import platform; print(platform.platform())"
2015 Oct  2 20:35:08 54774 <54743> 64b  python -c import platform; print(platform.platform())
2015 Oct  2 20:35:08 54774 <54743> 64b  python -c import platform; print(platform.platform())
2015 Oct  2 20:35:08 54775 <54774> 64b  sh -c uname -p 2> /dev/null
2015 Oct  2 20:35:08 54776 <54775> 64b  uname -p
2015 Oct  2 20:35:08 54777 <54774> 64b  file /usr/bin/python
2015 Oct  2 20:35:08 54778 <54743> 64b  /bin/bash -c mkdir -p /Users/q/Documents/android_out/android_src/target/product/generic/ && echo "PREVIOUS_BUILD_CONFIG := full-eng-{en_US,en (...)
2015 Oct  2 20:35:08 54779 <54778> 64b  mkdir -p /Users/q/Documents/android_out/android_src/target/product/generic/
2015 Oct  2 20:35:08 54780 <54743> 64b  /bin/bash -c mkdir -p /Users/q/Documents/android_out/android_src echo a > /Users/q/Documents/android_out/android_src/casecheck.txt; echo B  (...)
2015 Oct  2 20:35:08 54781 <54780> 64b  mkdir -p /Users/q/Documents/android_out/android_src
2015 Oct  2 20:35:08 54782 <54780> 64b  cat /Users/q/Documents/android_out/android_src/casecheck.txt
2015 Oct  2 20:35:08 54783 <54743> 64b  /bin/bash -c pwd
2015 Oct  2 20:35:08 54784 <54743> 64b  /bin/bash -c unset _JAVA_OPTIONS && java -version 2>&1
2015 Oct  2 20:35:08 54785 <54784> 64b  java -version
2015 Oct  2 20:35:08 54785 <54784> 64b  /usr/bin/java -version
2015 Oct  2 20:35:08 54786 <54743> 64b  /bin/bash -c unset _JAVA_OPTIONS && javac -version 2>&1
2015 Oct  2 20:35:08 54787 <54786> 64b  javac -version
2015 Oct  2 20:35:08 54787 <54786> 64b  /usr/bin/javac -version
2015 Oct  2 20:35:08 54788 <54743> 64b  /bin/bash -c echo 'java version "1.8.0_51" Java(TM) SE Runtime Environment (build 1.8.0_51-b16) Java HotSpot(TM) 64-Bit Server VM (build 25.5 (...)
2015 Oct  2 20:35:08 54790 <54788> 64b  grep ^java .*[ "]1\.7[\. "$]
2015 Oct  2 20:35:08 54791 <54743> 64b  /bin/bash -c echo 'javac 1.8.0_51' grep '[ "]1\.7[\. "$]'
2015 Oct  2 20:35:08 54793 <54791> 64b  grep "]1\.7[\. "$]

同样的,iosnoop用来实时显示文件访问,不帖了。其他的dtruss和dapptrace有心人可以体验。
dtrace内部做得实在令人感动,全系统设置了98万多个静态trace点,
dtrace甚至能够动态把第三方dll(*.dylb)的公开函数都给高速完美的hook了,自动产生出trace,据内部大拿说用的是函数指针表补丁+int3技术,反正速度比windows上的同类型api spy工具快多了,而且稳定,而且没有影响用户空间的内存! 完全在内核做的,所有的api的参数和堆栈都可以自己写script取出。当然,也可以自己调用dtrace api产生独特的trace信息,例如nodejs, chrome, firefox等东西里都有dtrace的身影!
相比之下,而Windows系统的类似的机制ETW(Event Trace for Windows),静态trace点,却只有几万个。ETW也无法这样动态地在第三方dll里插入trace,反正得需要自己在dll调用ETW的api产生trace。基于ETW的xperf等工具也弱多了,不仅不能够实施显示信息,而且不能够显示api名称,也无法写script控制,Windows老大这方面落后了。
dtrace这种东西,练好了就像是练了某某门派的高级内功心法差不多,有底气不慌。

Added 2015/10/16: 后来发现iosnoop对于文件活动的监测不够完全,因为它漏掉了stat之类的文件状态检查api。发现Mac里自带的Instruments工具是最强的,图形界面,实时的,还可以看到顶层api的名称,还可以grep, 而且还可以输出成Dtrace script。