Build CyanogenMod 12 for Nexus 5

工作之后好久不写博客了,这里都要长草了。。。

之前写过一篇 Build CyanogenMod 10.2 for Nexus 4,现在手机换成 Nexus 5 了,系统也升级到 CM 12 了,写一篇 How to 总结一下。

1. 你还是要准备一台机器(虚拟机也行),装上 Ubuntu,Ubuntu 14 LTS 是个不错的选择,LTS 会有很长时间的软件更新支持。硬盘分的大一些,100GB 起步吧,内存 3G 起,其他随意。

2. 系统装好之后,按照 CM 官方的指导 How To Build CyanogenMod Android for Google Nexus 5 (“hammerhead”) 安装必要的软件。需要注意的是,编译 CM 12 需要 OpenJDK 7,所以安装时,将 openjdk-6-jdk openjdk-6-jre 换成 openjdk-7-jdk openjdk-7-jre,另外 Ubuntu 14 已经没有 ia32-libs 这个包了,需要安装 lib32z1 lib32ncurses5 lib32bz2-1.0 作为 32 位兼容运行时。

3. 之后就可以按照手册准备 repo,使用 repo init -u https://github.com/CyanogenMod/android.git -b cm-12.0 初始化 repo。

4. repo sync

5. breakfast hammerhead

6. 这里建议在 breakfast 之后再 repo sync 一次

7. Nexus 5 的私有库在这里有 https://github.com/TheMuppets/proprietary_vendor_lge,可以将其添加到本地 repo,打开同步好的源码目录,进入 .repo/local_manifests 目录,在其中创建 lge.xml,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<manifest>
  <project name="TheMuppets/proprietary_vendor_lge.git" path="vendor/lge" remote="github" />
</manifest>

之后再 repo sync 一次。

8. 到这里源码同步完成,可以 brunch hammerhead 啦。

需要注意的是,请使用多种方法科学上网。

Notepad++ plugin local exploit

前段时间,在用 npp 分析一个 html 文件时,准备把其中的混合在一起的 js 分离出来,在 js 前后换行时 npp 崩溃了,感觉是哪里 bug 了,重试了几次都能很稳定的重现。本着张银奎老师的精神,上调试器。用 windbg 附加到 npp 进程,重现这个 crash 后,停到调试器内,看了下栈。

很明显栈溢出了,返回地址都是文本中的字符,溢出发生在 NotepadSharp.dll 也就是 Notepad# 插件中。Npp 上的插件基本都是开源的,那就把代码搞下来,用 VS 编译了个 debug 版,放进去再次触发崩溃,发现 PluginDefinition.cpp 的 void Newline() 函数中

继续阅读

Build CyanogenMod 10.2 for Nexus 4

一直想尝试着自己编译 CM,毕竟如果想修改系统 Apk,就有可能需要编译整个系统。于是在开了一台 Ubuntu x86_64 虚拟机(这是一个大坑,等会儿说)作为编译机器,参考的主要是 CM 官方 wiki:http://wiki.cyanogenmod.org/w/Build_for_mako?setlang=en。根据 wiki 指示准备好基础环境后,开始 repo sync,总共下载了 6GB 多的工程代码。总的来说,一直到 wiki 的 “Start the build” 一节,都没有问题,照着做就好了。不过当执行 brunch mako 之后,坑就一个个冒出来了。

第一个坑是磁盘空间,一开始给虚拟机分配的磁盘小了些,明显不足以完成整个编译,于是又加了个 40GB 的虚拟磁盘,并且在该磁盘上编译。40GB 似乎够了,不过最后的事实证明其实 40GB 几乎不够,最终完成编译后只剩 400MB 了!所以编译 Android 还是分配一个大一点的磁盘吧。

第二个坑就是 x86_64,ARM 处理器目前还是 32 位的,包括编译使用的 repo 好像也是 32 位的,所以首先需要安装 32 位 c/c++ 运行库。之后真正的坑在于 JDK,wiki 中没有明确说明 JDK 应该安装 32 位还是 64 位的,我一开始想 java 部分应该和架构没什么关系,就装了个 64 位 JDK,结果开始使用 javadoc 编译 Droiddoc 时,make 出错了,显示错误 45,一开始在论坛上查了一下,说是应该使用 Oracle JDK,于是尝试安装了 64 位的 Oracle JDK,结果还是一样出错。后来仔细看了论坛,发现其实问题是 64 位 JDK。也不知道为什么,64 位 JDK 的 javadoc 就是会导致编译错误,但是之前的 jar 包都编译正常。通过 apt-get 安装了 32 位 Open JDK 后,问题解决了。

第三个坑是内存,一开始只给虚拟机分配了 1GB 内存,结果在编译 framework 时,malloc.c 中的 assert 出错了。。。关机,调整到 2GB,编译终于继续下去了。

第四个坑是 CM 加入的 Focal,在编译 external/Focal 中的链接库时总是出错,论坛上说 Focal 不太稳定,可以不编译。好吧,暴力一点,直接把 external/Focal 和 apps/Focal 删掉了,编译继续。

最终花了一个下午+半个晚上(不包括 repo sync 的时间,这个根据网速会有所不同,可以自己算算下载 6GB 需要多久),终于编译出来了。好了,能编译了,下一步就是准备尝试修改了。

 

用 WinDbg 调试符号不全的程序

其实也就是记录一下用 WinDbg 调试 fHash 的一次过程,这个 bug 是由于没好好看文档造成的,我需要让 fHash 知道当前运行的操作系统是 32 位还是 64 位的,之后好去选择正确的 shell extension 文件。查文档看到了这个函数 IsWow64Process ,之后错误的以为 kernel32 中有这个函数就是 64 位操作系统,结果就已这个逻辑写下了错误的 64 位系统判断函数,和错误文件读取逻辑。


tstring tstrExeDirPath(pszExeFullPath);
tstring::size_type idx = tstrExeDirPath.rfind(_T("\\"));
tstrExeDirPath = tstrExeDirPath.substr(0, idx);

tstring tstrShlExtDll = tstrExeDirPath;
tstrShlExtDll.append(_T("\\fHashShlExt"));
if(IsWindows64())
    tstrShlExtDll.append(_T("64"));
tstrShlExtDll.append(_T(".dll"));

WIN32_FIND_DATA ffData;
HANDLE hFind = FindFirstFile(tstrShlExtDll.c_str(), &ffData);

bool bRet = (hFind != INVALID_HANDLE_VALUE);

if(bRet)
{
#if defined(UNICODE) || defined(_UNICODE)
    wcscpy_s(pszShlDllPath, MAX_PATH, tstrShlExtDll.c_str());
#else
    strcpy_s(pszShlDllPath, MAX_PATH, tstrShlExtDll.c_str());
#endif

   FindClose(hFind);
}

return bRet;

结果很自然,在 32 位的 Windows XP 上没有执行正确。但是测试环境没有 VisualStudio,而且用的是 Release 编译,也没有带着符号文件,这怎么调试呢。Windows XP 上装有 WinDbg,那么就用它来调试。

继续阅读

JSMinNpp 1.13 Released

What’s New in JSMinNpp 1.13:

  • Performance improved (JSFormat will be about 2X faster).
  • Linked editor with Json Viewer: Clicking a data node in Viewer, editor will navigate to corresponding line.
  • Added a logo.

Download links:
https://jstoolnpp.googlecode.com/files/JSMinNPP.1.13.uni.zip
http://sourceforge.net/projects/jsminnpp/files/Uni/JSMinNPP.1.13.uni.zip/download

CMFileManager for ICS Standalone

CyanogenMod 10 中自带了一个 CMFileManager 的文件管理器,很好用,可以提升到 root 权限进行操作,有类似 Windows 资源管理器的路径导航栏,界面也很简洁、漂亮。这两天给它改了改,移植到 CM 9 之上,并且成为一个可独立安装的 APK 包,不再需要放到 /system/app/ 中。

CyanogenMod 10 has a file manager app called “CMFileManager”, which is simple and easy to use and can run as ‘root’. It has holo style UI. Now, I’ve make a standalone installation package of CMFileManager, you do not need to put it into /system/app/ anymore.

继续阅读

找工作第二阶段

按照第一阶段的老样子,所有公司都会以其所在地和业务的描述来代替。

10月份,找工作进入第二阶段。开场就面了上海某聊天软件的游戏后台,每次放完假之后的第一场面试状态都很差,算法题写错了,然后就挂了。之后去了上海的美国在线交易和结算平台,笔试通过的有点出乎意料,可能其他人的数学题目答的更差吧。。。面试搞了一整个下午,面完之后感到特别的疲惫,中间还包括一个英文面。总体感觉还行,不过消息要慢慢等。月底最后去了国内的最大搜索公司,面了完了3面,不过最后还是呵呵了,面完之后我基本宣布找工作结束,某人的四海一家也暂时不用请了:>。到了快月底,之前的那个面试终于打电话来,说通过了,不过还要去上海面试。好吧,去上海的最后机会了,试试看,这个要到下个月的最后一次总结才能知道答案了,某人的四海一家还有一点点希望。如果挂了,那么就去上个月拿到的安全软件公司了。

still PS:上面经过转义的公司名你应该没猜错。