高通Android源码下载记录
简介
android源码一般最初是由Google发布,但是高通作为移动芯片厂商,占据了全球大部分手机芯片市场份额;所以,一般在Google发布Android源码后,高通都会根据自己的芯片如8950等进行适配,对android源码进行改造适配移植,形成自己的android源码以及ROM,可以说凡是用到高通芯片的手机厂商,一般都是基于高通的android源码进行修改的;
高通Android源码下载
同android原版源码下载一样,也是用repo方式下载,下载流程也一样,不同的是下载域名不一样
下载repo工具
git clone git://codeaurora.org/tools/repo.git
把里面的repo文件拷贝到~/bin/repo路径下,并添加执行权限:
sudo chmod +x ~/bin/repo
替换repo的下载源,因为repo默认的源是git://android.git.kernel.org/tools/repo.git,此地址比较慢,把REPO_URL替换为以下:
REPO_URL='git://codeaurora.org/tools/repo.git'
下载具体的Android版本
repo init -u git://codeaurora.org/platform/manifest.git -b release -m
LA.UM.6.6.r1-10100-89xx.0.xml --repo-url=git://codeaurora.org/tools/repo.git
--repo-branch=caf-stable
-m 后就是紧跟的Android版本信息,可以在高通源码版本列表选择你需要的版本;这里可能会遇到问题,提示找不到公钥public key:
gpg: Can't check signature: No public key
解决办法把–repo-url及其以后的命令删除掉后,在执行一次即可!
最后,执行
repo sync
就下载下来了!
重点来了,请注意! 就算你按照上面的步骤下载下来后,编译仍然失败的!为什么呢?因为还差部分私有文件和补丁,这部分代码个人是拿不到的,必须要找合作商要
mm单编应用失败问题
问题描述:
ninja: error: ‘out/target/common/obj/JAVA_LIBRARIES/sdk_v26_intermediates/classes.dex.toc’, needed by ‘out/target/common/obj/APPS/_intermediates/with-local/classes.dex’, missing and no known rule to make it
10:48:28 ninja failed with: exit status 1
问题大意是说sdk_v26_intermediates目录下为了生成classes.dex.toc这个文件,需要APPS/_intermediates/with-local/classes.dex的dex文件,没有规则来创建他们
解决办法
问题原因是我们制定的sdk版本26这个class.dex.toc需要重新生成,我们需要手动生成一个,这个就参考网上的办法Android: How to generate classes.dex.toc files?
另一个解决办法,是由于我们制定的SDK版本与Android源码版本不一致导致的,所以需要重新生成,这个解决办法就是制定SDK版本为current即可,因为当前版本已经在编译系统时生成了,就不需要再次生成了
为APK系统签名失败
Exception in thread "main" java.lang.ExceptionInInitializerError
at org.conscrypt.OpenSSLBIOInputStream.<init>(OpenSSLBIOInputStream.java:34)
at org.conscrypt.OpenSSLX509Certificate.fromX509PemInputStream(OpenSSLX509Certificate.java:129)
at org.conscrypt.OpenSSLX509CertificateFactory$1.fromX509PemInputStream(OpenSSLX509CertificateFactory.java:226)
at org.conscrypt.OpenSSLX509CertificateFactory$1.fromX509PemInputStream(OpenSSLX509CertificateFactory.java:222)
at org.conscrypt.OpenSSLX509CertificateFactory$Parser.generateItem(OpenSSLX509CertificateFactory.java:100)
at org.conscrypt.OpenSSLX509CertificateFactory.engineGenerateCertificate(OpenSSLX509CertificateFactory.java:278)
at java.security.cert.CertificateFactory.generateCertificate(CertificateFactory.java:339)
at com.android.signapk.SignApk.readPublicKey(SignApk.java:184)
at com.android.signapk.SignApk.main(SignApk.java:1007)
Caused by: java.lang.IllegalArgumentException: Failed to load any of the given libraries: [conscrypt_openjdk_jni-linux-x86_64, conscrypt_openjdk_jni-linux-x86_64-fedora, conscrypt_openjdk_jni]
at org.conscrypt.NativeLibraryLoader.loadFirstAvailable(NativeLibraryLoader.java:176)
at org.conscrypt.NativeCryptoJni.init(NativeCryptoJni.java:49)
at org.conscrypt.NativeCrypto.<clinit>(NativeCrypto.java:53)
... 9 more
从错误提示来看加载conscrypt_openjdk_jni-linux-x86_64, conscrypt_openjdk_jni-linux-x86_64-fedora, conscrypt_openjdk_jni这三个库时失败,所以需要提供上面三个任意一个库即可;那这个库在哪里呢?使用find搜索编译后的目录就找到了:
find /源码根目录/out/host/ -iname libconscrypt_openjdk_jni.so
搜出来有很多个,不一定每个都能签名成功,涉及到库底层位数的问题,可以一个一个试,签名即可!
以下是我写的一个签名工具:
#!/bin/bash
# android app系统签名,使用工具来源于msm8953_810_LA301下的工具源码
# $1 未签名apk
# $2 签名后的apk名称
echo "Android App系统签名工具"
if [ ! $1 ] || [ ! $2 ]; then
echo "usage: \n参数一 未签名apk 参数二 签名后apk名称\n"
echo "输入参数为空,错误!"
exit 1;
fi
# 已把把相关的jar包和库都放到../third/目录下
java -Djava.library.path=../third/ -jar ~/Library/third/signapk.jar ~/Library/third/platform.x509.pem ~/Library/third/platform.pk8 $1 $2
源码中添加aidl服务
添加aidl级别的系统服务,按照Android源码添加aidl服务进行操作,主要是编写
- 编写aidl接口
- 编写aidl的服务service
- 编写aidl的客户端manager
- 系统启动时将service加入到binder服务列表
最后,不要忘了给这个服务添加权限,在一些servie文件中;其中上面文章没有提到的,在编写完aidl服务后,我们需要执行make update-api命令