编译系统的方法有很多种,使用Docker 或者是使用jenkins编译,方法千万种.网上有很多的方法,这里就不再说了篇文章主要是针对本地编译.

最近学习了脚本,也尝试写了一个Android系统编译的脚本,重点分析一下脚本,算是对之前学习脚本的一个小小的总结.

1.一套Android源码

2.Ubuntu环境 以及JDK环境

正常本地编译步骤

1.source build/envsetup.sh2.lunch xxx3.make -j8 2>&1 |tee build.log (make就可以,这样写两个目的:1.多核编译 2.输出编译的log)

为了偷懒,也为了自己学的脚本有用武之地,写了一个 脚本进行编译,放到源码根目录使用方法如下:

./androidbuild.sh  all/systemimg/bootimg userdebug/user./androidbuild.sh  all/systemimg/bootimg userdebug/user clean

androidbuild.sh 内容如下:

主要逻辑还是用的版本编译步骤,只是简化成了脚本

TARGET="msm8953_64" 这个需要改变成你想要的版本前缀

#!/bin/bash##############################编译Android 系统脚本####################################### 设置编译环境变量export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64export JRE_HOME=${JAVA_HOME}/jreexport CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/libexport PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin:$PATH#设置所在目录export ROOT_PATH=$(pwd)#设置编译的版本  TARGET="msm8953_64"#查看CUP 处理个数 最大允许4核cpu_count=`cat /proc/cpuinfo |grep processor|wc -l`if [ "$cpu_count" -gt "4" ];thencpu_count=4fi# 设置编译环缓存文件setup_ccache() {    export CCACHE_DIR=../.ccache    export USE_CCACHE=1}#删除编译缓存delete_ccache() {    prebuilts/misc/linux-x86/ccache/ccache -C    rm -rf $CCACHE_DIR}create_ccache() {    echo -e "\nINFO: Setting CCACHE with 10 GB\n"    setup_ccache    delete_ccache    prebuilts/misc/linux-x86/ccache/ccache -M 10G}# 校验使用脚本输入的参数变量if [ $# -eq 0 ]; then    echo -e "ERROR: Missing argument: build param\n"echo -e "eg:[Donot make clean] ./androidbuild.sh all/systemimg/bootimg userdebug/user"echo -e "eg:[make clean]       ./androidbuild.sh all/systemimg/bootimg userdebug/user clean"    exit 1fi# 校验使用脚本输入的参数变量if [ $# -gt 3 ]; then    echo -e "\nERROR: Extra inputs. \n"    exit 1fi#创建文件保存编译logif [ -z $LOG_FILE ]; then    LOG_FILE=$TARGET-$2echo $LOG_FILEfi#环境预热 也就是普通编译的第一步source ./build/envsetup.sh#设置 lunch 的目标版本if [ "$2" == "eng" -o "$2" == "userdebug" -o "$2" == "user" ]; thenlunch $TARGET-$2elseecho -e "Error: Wrong inputs. please input eng/userdebug/user"exit 1fi#是否清除上一次的编译缓存 进行重新编译if [ "$3" == "clean" ]; then    echo -e "\nINFO: Notice make clean!!!!!!!!\n"for time in {10..1}doecho -e "\nINFO: Make Clean in $time ..."sleep 1done    # 执行 clean操作make cleanelse    # 如果不是 删除上次生成好的编译文件rm -rf out/target/product/msm8953_64/system/rm -rf out/target/product/msm8953_64/kernelrm -rf out/target/product/msm8953_64/*.ziprm -rf out/target/product/msm8953_64/obj/PACKAGING/target_files_intermediates/*rm -rf out/target/product/msm8953_64/*.imgrm -rf out/target/product/msm8953_64/*.binrm -rf out/target/product/msm8953_64/*.txtfi# 执行 更新api 主要针对对framework进行了修改的操作,不然系统识别不到你的新更改make update-api -j$cpu_count# 分为三个编译 主要使用的是make命令# 编译镜像if [ "$1" == "systemimg" ]; then    echo -e "\nINFO: Build systemimage for $TARGET\n"    make systemimage -j$cpu_count  | tee $LOG_FILE.log# 编译bootelif [ "$1" == "bootimg" ]; then    echo -e "\nINFO: Build bootimage for $TARGET\n"    make bootimage -j$cpu_count | tee $LOG_FILE.log# 编译全部elif [ "$1" == "all" ]; then    echo -e "\nINFO: Build all image and otapackage for $TARGET\n"    make -j$cpu_count  | tee $LOG_FILE-img.log    make otapackage -j$cpu_count  | tee $LOG_FILE-ota.logelseecho -e "Error: Wrong inputs. please input all/ota/systemimg/bootimg"exit 1fi# 上一条命令执行后退出的状态  正常退出返回 0 非正常退出返回 1if [ ! $? -eq 0 ]; then    echo "make error"    exit -1fi#后面为编译完成后的操作############################保存编译文件的存放文件夹###################################yourdate=`date +%Y_%m_%d`echo $yourdatelocal_backuppath=$ROOT_PATH"/IMAGES_"$yourdateecho $local_backuppathmkdir -p $local_backuppath###########################将编译好的文件拷贝到上面的文件夹########################################cp out/target/product/msm8953_64/$TARGET*.zip $local_backuppathcp out/target/product/msm8953_64/*.img $local_backuppathcp out/target/product/msm8953_64/obj/PACKAGING/target_files_intermediates/$TARGET*.zip  $local_backuppathecho "######## 拷贝完成 ########"if false; then############################保存编译的app 到 APPVERSION.txt   仅仅是用于查看 apk 列表########################################APKPATH=$ROOT_PATH"/out/target/product/msm8953_64/system/app"echo "print log to APPVERSION.txt"app_lists=`find $APKPATH | grep ".apk" | grep -vE "Bluetooth|CertInstaller|HTMLViewer|KeyChain|Wallpapers|MDummyAPK|MTv|UserDictionaryProvider|PacProcessor"`APPVERSION=$local_backuppath/AppVersion.txt# 如果 AppVersion.txt 存在则为上次编译的文件 执行删除操作if [ -f $APPVERSION ];thenrm $APPVERSIONfiPROPPATH=$ROOT_PATH"/out/target/product/msm8953_64/system/build.prop"#用等号分割 获取 ro.build.date.utc 版本utc=`cat $PROPPATH | grep "ro.build.date.utc" | awk -F "=" '{print $2}'`# 用等号分割 获取 ro.build.description版本description=`cat $PROPPATH | grep "ro.build.description=" | awk -F "=" '{print $2}'`# 将以上信息存储到 AppVersion.txtecho ">>>>>>>" > $APPVERSIONecho "utc="$utc >> $APPVERSIONecho "description="$description >> $APPVERSIONecho "<<<<<<<" >> $APPVERSIONfor app in $app_listsdo    #    echo $app    info=`out/host/linux-x86/bin/aapt dump badging $app  | grep -E "package: name=|application: label="`    apkName=`echo $app | awk -F"/" '{print $NF}'`    appName=`echo $info | grep "application: label=" | awk -F"label=" '{print $NF}' | awk -F"'" '{print $2}'`    packageName=`echo $info | grep "package: name=" | awk -F"'" '{print $2}'`versionCode=`echo $info | grep "versionCode=" | awk -F"'" '{print $4}'`    versionName=`echo $info | grep "versionName=" | awk -F"'" '{print $6}'`# 将本地编译好的 APP 信息写入 AppVersion.txt 仅仅是用于查看    echo "apkName="$apkName >> $APPVERSION    echo "appName="$appName >> $APPVERSION    echo "packageName="$packageName >> $APPVERSION    echo "versionCode="$versionCode >> $APPVERSION    echo "versionName="$versionName >> $APPVERSION    echo "-----------------------------\n"  >> $APPVERSIONdonefi

可以根据自己意愿进行修改

更多相关文章

  1. 浅入浅出 Android(安卓)安全:第六章 Android(安卓)安全的其它话题
  2. Mac OS X下用Eclipse浏览和编译Android源代码
  3. Android工程目录介绍
  4. Android(安卓)Process 'command 'C:\Users\Win\AppData\Loca
  5. Android中的soundpool小结
  6. android js脚本续
  7. Android源码repo init及repo sync小记
  8. Android中项目中各个文件夹的含义和用途详解
  9. Android(安卓)之 数据存储方式

随机推荐

  1. Android(安卓)Notification 例子
  2. Android高德地图如何禁止地图在拖动时发
  3. Android应用程序启动过程源代码分析(4)
  4. android 返回 弹出对话框 确认退出
  5. Android实现左右滑动页面
  6. android socket通信 创建线程接受 客户端
  7. android 图片倒影处理
  8. Android仿IOS UIAlertView对话框
  9. Android单元测试与日志输出
  10. Android(安卓)读取本地(SD卡)图片