android 源码下载
使用清华大学的镜像系统来下载Android 源码,以下路径
https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/
下载 repo 工具[repo 是使用python集成的git 命令]:
mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
curl:是一个下载工具
使用清华大学提供的源码下载初始化包可以快速下载源码 之后repo sync 即可同步代码
wget -c https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar # 下载初始化包
tar xf aosp-latest.tar
cd AOSP # 解压得到的 AOSP 工程目录
# 这时 ls 的话什么也看不到,因为只有一个隐藏的 .repo 目录
repo sync # 正常同步一遍即可得到完整目录
# 或 repo sync -l 仅checkout代码
源码下载后
source ./build/envsetup.sh 加载编译时候的环境变量或者 . ./build/envsetup.sh
lunch number:挑选需要编译的产品
make -j4:用于编译源码,jN这个参数由cpu 核性数和线程数决定
源码编译完成后:可以运行
编译完成后可以通过模拟器运行:emulator
3 给APK 加上系统签名
在devices 或者vender目录添加第三方的APK,然后编写Android.mk 文件
#############################
# App Name:Settings
# Support ndk:None
#############################
LOCAL_PATH := $(my-dir)
############################
# app(Settings.apk)
include $(CLEAR_VARS)
LOCAL_MODULE := Settings
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := platform--->这个很重要表示要加系统签名
# priv-app
LOCAL_PRIVILEGED_MODULE := true
# override package
LOCAL_OVERRIDES_PACKAGES := AsusSettingsSrc
# ODEX
LOCAL_DEX_PREOPT := $(call local_odex_status, $(LOCAL_MODULE))
include $(BUILD_PREBUILT)
############################
GMS全称为GoogleMobile Service,即谷歌移动服务。GMS是Google开发并推动Android的动力,也是Android系统的灵魂所在。
GMS目前提供有Search、Search by Voice、Gmail、Contact Sync、Calendar Sync、Talk、Maps、Street View、YouTube、Android Market(ICS上更改为Play store)服务。当用户使用谷歌服务的时候,谷歌可以把广告嵌入各种谷歌的服务中,比如:用户在使用谷歌地图的时候,就能发现搜索地名关键字的广告。在使用谷歌移动搜索的时候,不用说,当然也是有广告的。谷歌其实是拿用户的注意力来换取广告主的金钱。而且Android智能手机操作系统其实也就是谷歌把自己的服务主动放到了手机上,进一步巩固自己的市场地位。
Android 8.0 编译framework push 手机不生效问题,要使用以下命令
adb push out/target/product/K155655AA1/system/framework system/ --sync
sync 表示如果文件相同就跳过push 该文件
编译system.img:make systemimage
AndroidStudio 导入源码
$ mmm development/tools/idegen/
$ development/tools/idegen/idegen.sh
依次执行完上面的命令,就会在系统根目录下生成如下文件
android.ipr (IntelliJ / Android Studio)
android.iml (IntelliJ / Android Studio)
引用jar 包
需要注意的是,当你要引用的jar包不止一个时,有两个关键的地方需要注意的。
LOCAL_STATIC_JAVA_LIBRARIES := xsocket jackson-mapper logging jackson-core javatar log4j
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := xsocket:lib/xSocket-2.8.14.jar \
jackson-mapper:lib/jackson-mapper-asl-1.6.2.jar \
logging:lib/commons-logging.jar \
jackson-core:lib/jackson-core-asl-1.6.2.jar \
javatar:lib/javatar-2.5.jar \
log4j:lib/log4j-1.2.15.jar
xsocket jackson-mapper logging jackson-core javatar log4j这几个只是名字,可以随便取。LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES后面才是真正其作用的地方。如:
xsocket:lib/xSocket-2.8.14.jar 引用的是lib目录中的xSocket-2.8.14.jar。
添加有源码apk到系统目录下编译
给应用系统签名
说起来简单也不简单。说简单因为就一条命令:
java -jar signapk.jar platform.x509.pem platform.pk8 app-debug.apk ControlCenter_signed.apk
- 文件目录:
signapk.jar: android/out/host/linux-x86/framework/signapk.jar
另外两个文件在 android/build/target/product/security/
除了platform签名以后还有 testkey media shared releasekey。
系统级别的签名使用的是platform来签名(此时使用android:sharedUserId="android.uid.system"才有用)。
但是使用的时候要注意,一定要使用和目标系统匹配的文件来签名。
比如我的源码目中有两组platform签名的文件,我第一次签名搞错了(我没发现有另一组在devices目录下的文件),所有才有了后面两种方法的尝试。
之后我重新尝试另一组签名文件,签名成功后是可以符合期望工作的。
不带源码直接放apk,mm编译
其实这一步也可以叫做“预置不带源码的apk”。
1) 使用这种方法我们要为apk新建一个目录(一般自己的应用预置在packages/apps目录下,三方的可能在Vendor/third-party下),
2) 把apk放到目录下
3) 编写一个对应的Android.mk文件。
这里我们以googel translate.apk的预置为例,并以这个为参考编写我们自己的Android.mk。
下面是Translate目录下的Android.mk部分内容:
# Translate
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# Module name should match apk name to be installed
LOCAL_MODULE := Translate
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_BUILT_MODULE_STEM := package.apk
include $(BUILD_PREBUILT)
这里LOCAL_CERTIFICATE := PRESIGNED,表示保留原签名,如果我们想让apk拥有和系统一样的签名则需要改成
LOCAL_CERTIFICATE := platform
- LOCAL_PRIVILEGED_MODULE := true
-
之后在目录下mm编译。把生成的文件push到手机上就可以用了。
5)目前为止我们只是拿到系统应用的权限,如果需要在整包编译的时候把这个apk也编译进去的话,需要修改对应的编译系统的.mk文件,添加这个模块
带源码mm编译
加入现在已经有一个使用Android Studio编写的app了,我们想要把它的源码放到Android系统目录下编译,该如何做呢?
1) 跟2差不多,还是先建目录已packages/app/目录下面为例,新建一个ControlCenter的目录,
2) 然后把源码全部放进去,然后把AndroidMainfest.xml复制到根目录。
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-subdir-java-files)
#将res移动到这个应用的根目录
#LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
#如果你是Android Studio的res目录
LOCAL_RESOURCE_DIR+= $(LOCAL_PATH)/app/src/main/res
#apk名字
LOCAL_PACKAGE_NAME := ControlCenter
#系统签名
LOCAL_CERTIFICATE := platform
#如果有使用到依赖
LOCAL_STATIC_JAVA_LIBRARIES:= \
android-support-v4
LOCAL_PRIVILEGED_MODULE := true
include $(BUILD_PACKAGE)
注意:这里和上面有个区别,编译apk的时候我们用LOCAL_PACKAGE_NAME定义应用名,预置apk的时候使用LOCAL_MODULE定义模块名
一些Android.mk参数说明:
LOCAL_PATH:= $(call my-dir)
一个Android.mk file首先必须定义好LOCAL_PATH变量。它用于在开发树中查找源文件。
宏函数’my-dir’,由编译系统提供,用于返回当前路径(即包含Android.mk file文件的目录)。
#begin 在加入这个宏之前apk在/system/app下
#LOCAL_PRIVILEGED_MODULE := true
#end 加入后apk在/system/priv-app下
#这个宏控制的是apk可卸载,恢复出厂设置后无法恢复
#LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
#这个宏控制系统给apk签名
LOCAL_CERTIFICATE := PRESIGNED
#这个宏控制的是apk可卸载,恢复出厂设置后可以恢复
LOCAL_MODULE_PATH := $(TARGET_OUT)/vendor/operator/app
Android.mk中可以定义多个编译模块,每个编译模块都是以include $(CLEAR_VARS)开始,以include $(BUILD_XXX)结束(详解参考文末第二个链接)。
LOCAL_MODULE_TAGS := optional
解析:
LOCAL_MODULE_TAGS :=user eng tests optional
user: 指该模块只在user版本下才编译
eng: 指该模块只在eng版本下才编译
tests: 指该模块只在tests版本下才编译
optional:指该模块在所有版本下都编译
取值范围debug eng tests optional samples shell_ash shell_mksh。注意不能取值user,如果要预装,则应定义core.mk。
1. Android.mk文件格式 http://blog.csdn.net/demon_xiaochunjie/article/details/50052509
2. Android.mk简单分析 http://www.cnblogs.com/chenbin7/archive/2013/01/05/2846863.html (讲解了哪些是必选项,哪些是可选项)
3. Android.mk编译APK范例 http://hubingforever.blog.163.com/blog/static/1710405792011656434982/ (编译各种apk的举例)
4. 带有源码的apk预置到系统 http://blog.csdn.net/u013377887/article/details/53870803
1. Android.mk简介 http://hubingforever.blog.163.com/blog/static/171040579201152185542166/
2. Android.mk文件语法规范(Android.mk File)http://blog.csdn.net/smfwuxiao/article/details/8530742 (NDK jni)
3. Android.mk文件语法规范 & 使用模板 http://www.cnblogs.com/jisheng/archive/2012/09/13/2683057.html (这是个译文,也有很多参数的解释)
flash system.img
sudo fastboot flash system system.img