目录
网上几乎99.99%都是旧教程(我没查到一个新的),现在下载网址变了。
亲测有效!我的是高通SA8155P芯片。不管什么芯片流程都是一样的。
1. 场景
首先看下我们所面临的问题是否类似:已获取高通某一模块的闭源代码,也就是vendor里某一模块。然后你想修改,这时候就需要编译so验证。那么得有个基础工程吧,也就是opensource代码。
如果场景一样,那么按照下面流程就可以~
2. 下载高通OpenSource代码
Android for MSM项目允许用户构建一个基于Android的平台,其中包含针对高通芯片组的其他增强功能。
现在服务器已经变更了,太老旧的版本已经不再维护,你也找不到。所以如果没有对应版本找个相近的版本也应该是ok的。
新服务器:现在可行的方式是在CodeLinaro下载,以前是codeaurora,应该已经不维护了,大坑啊。下面给出网址:
Android for MSM Project | CodeLinaro Wiki
网站里解释得很清楚,主要下载命令如下:
repo init --depth=1 -u https://git.codelinaro.org/clo/la/platform/manifest.git -b release -m [manifest] --repo-url=https://git.codelinaro.org/clo/tools/repo.git --repo-branch=qc-stable
repo sync -j8 -c --no-tags
[manifest]从Android releases | CodeLinaro Wiki这里取,注意,要与你获取的vendor闭源模块版本一致(或相近)。只修改manifest就可以。
-c, --current-branch fetch only current branch from server.
--no-tags don't fetch tags.
-j 线程数,这个应该你们都懂
这两项是为了节省下载空间。
不懂 repo 的小伙伴我来给你们讲:
repo用法及原理详解,干了啥干了啥_alibli的博客-CSDN博客
如果下载过程中报各种错误,请检查你的代理服务器啥的。
3. 编译
把你要编译的高通vendor闭源模块拷贝到OpenSource对应目录下,一般是vendor/qcom/,然后运行下面几条命令:
根目录下执行:
source build/envsetup.sh
这个会include一些文件,并且配置编译环境。
然后,选择要编译的系统类型:
lunch
最后,单编译模块:
mmm [vendor模块路径]
vendor模块路径里要有Android.mk文件,这个就是编译用的。
关于m\mm\mmm\mma\mmma这个自己查吧。
最后产物在根目录的out目录里。
4. 修改代码
编译成功的情况下,你要开始修改代码重新编译了。
需要注意几点:
第一,如果你要看日志,请把日志开关打开,一般在Android.mk中和源代码中。有时高通会把打印日志的开关注释但保留。比如源代码中:
//#define LOG_NDEBUG 0
Android.mk中:
#LOCAL_CFLAGS += -DENABLE_LOGV
当然具体你的模块里怎么写的,可能有点区别,还是要认真研究一下。
第二,系统内原so和你自己编的so理论上应该是版本相近,如果遇到找不到symbols等问题,在linux系统中
nm -D [涉及的].so
看下符合表是否一样。
5. 问题记录
1. 报错日志
(native:platform) should not link to lib*** (native:vendor)
(native:platform) can not link to lib*** (native:vendor)
原因:
LOCAL_PROPRIETARY_MODULE是Android vendor module 必须具有的属性,此属性声明将 vendor module放入vendor分区(vendor native),未声明该属性的module将放在system分区(platform native),且这两个分区是不能进行链接的,所以编译会报两个LOCAL_MODULE无法链接的错误。
解决方法:
报错位置对应 Android.mk 添加 LOCAL_PROPRIETARY_MODULE := true