Android 源码编译

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到系统目录下编译

给应用系统签名

说起来简单也不简单。说简单因为就一条命令:

  1. java -jar signapk.jar platform.x509.pem platform.pk8 app-debug.apk ControlCenter_signed.apk
  2. 文件目录:
    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拥有和系统一样的签名则需要改成

  1. LOCAL_CERTIFICATE := platform
  2. LOCAL_PRIVILEGED_MODULE := true
  3. 之后在目录下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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值