Mac OSX Android源码编译-环境搭建、源码下载、源码编译、导入Android Studio

2024-08-24 10:18

本文主要是介绍Mac OSX Android源码编译-环境搭建、源码下载、源码编译、导入Android Studio,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

做APP开发差不多一年了,想要进阶的话就得好好研究Android的源码了。在这里记录下我编译时的流程,供各位参考。

    • 环境搭建
      • 创建大小写敏感的磁盘映像
        • 生成镜像文件
        • 设置挂载和卸载命令仅供参考无效可手动输
      • 安装makegitGPG
      • 修改Mac默认的最大可同时打开文件数
    • 源码下载
      • 建立本地仓库
      • 镜像下载
    • 源码编译
      • 编译准备
      • 开始编译
        • 环境准备
        • 设置编译目标lunch aosp_arm-eng
        • 开始编译make -j8或make -j4或make -j16取决于你的CPU的线程数
    • 导入Android Studio
      • 生成idegenjar
      • 生成androidipr和androidiml文件

环境搭建

我用的电脑系统是OSX 10.10.5。
需要准备的工具有:

  • XCODE,用最新版吧
  • MacPorts
  • Java环境
    jdk1.6下载
    jdk1.7下载
    jdk1.8下载
    jdk1.8ForOSX这个是下载更新系统自带的Java版本,目录为/System/Library/Frameworks/JavaVM.framework,终端输入java -version获取的就是这个Java的版本。自己安装的Java目录在/Library/Java/JavaVirtualMachines

这个目前推荐用1.6,具体看下文,用1.8的话容易出问题。

下面开始按步骤搭建环境。

创建大小写敏感的磁盘映像

1.生成镜像文件

方法一

打开终端,复制粘贴

hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 100g ~/android.dmg.sparseimage

这里的100g指的是分区大小,现在的android系统越来越大,现在Android7.1是20G,不过如果.repo也放进去的话,就要70G了,这里设置大一点。
如果提示需要权限,就输入sudo -s,然后输入密码直接以root用户操作。

方法二
打开磁盘工具,文件,新建映像,如图所示。
这里写图片描述
之后在设定的位置处就能看见创建的磁盘了,双击磁盘映像,就可以在侧边栏看见磁盘。

如果后期需要修改映像大小,可使用:

hdiutil resize -size <new-size-you-want>g ~/android.dmg.sparseimage

命令。

2.设置挂载和卸载命令(仅供参考,无效可手动输)

由于mac下很多重要文件都是隐藏的,所以建议大家首先把隐藏的文件显示出来,在终端里获取权限后输入以下命令。

defaults write com.apple.finder AppleShowAllFiles TRUE && killall Finder

打开用户/你的用户名文件夹,看下有没有“.bash_profile”这个文件,这个文件是OSX系统下的环境变量,如果没有,则新建一个。

  1. 打开终端,输入cd然后把用户/你的用户名文件夹拖到终端,输入touch .bash_profile,创建文件。
  2. open -e .bash_profile编辑文件,编辑完后保存。
  3. source .bash_profile,更新环境变量。

在.bash_profile文件中加入

# mount the android file image
function mountAndroid { hdiutil attach ~/android.dmg.sparseimage -mountpoint /Volumes/android; }
# unmount the android file image
function umountAndroid() { hdiutil detach /Volumes/android; }

在终端输入mountAndroidumountAndroid看能否挂载和卸载安卓分区,如果不能,打开用户/你的用户名文件夹,找到android.dmg.sparseimage,制作替身,放到桌面,以后挂载只需要打开替身即可。

安装make,git,GPG

  1. 首先要安装macport,可以进官网看安装指南,也可以直接安装上面给的安装包,也可以直接下macport,解压,输入cd,将目录拖入命令行,然后输入以下命令
cd MacPorts-2.3.4/
./configure
make
sudo make install
  1. 打开用户/你的用户名文件夹下的“.bash_profile”文件,看是否有export PATH="/opt/local/bin:/opt/local/sbin:$PATH",没有就加上。修改完“.bash_profile”文件后需要在终端输入source .bash_profile命令,是修改立即生效。
  2. 打开终端,输入如下命令
POSIXLY_CORRECT=1 sudo port install gmake libsdl git gnupg

待其自动下载安装完成。如果提示gmake not found,就输入sudo port -d sync,如果提示port not found,就检查环境变量是否设置成功。

修改Mac默认的最大可同时打开文件数

打开用户/你的用户名文件夹下的“.bash_profile”文件,加入ulimit -S -n 1024,这样编译时同时编译的文件数可以更多。

源码下载

1.建立本地仓库

mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

一起复制粘贴到终端执行。
第一句在用户/你的用户名文件夹下建立了一个bin目录。
第二句将bin目录添加至环境变量,需要打开“.bash_profile”文件检查下有没有添加成功。
第三句安装repo工具。
第四句将repo的权限改为可执行。

2.镜像下载

源码下载用国内的镜像会快很多。
1. 用清华大学的镜像源(https://mirrors.tuna.tsinghua.edu.cn/),务必使用迅雷下载,地址:https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar
2. 将下载好的文件解压到刚才建立的bin目录中,解压后bin目录结构为”bin/aosp/.repo”。打开menifest目录,右键点击default.xml,制作替身,将替身拷贝到.repo文件夹中,重命名为menifest.xml。
3. 打开终端,输入cd,拖入aosp目录。执行命令:

repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-7.1.1_r28

结尾是版本号,对照版本列表修改。
4. 输入repo sync -j1 -f --force-sync,不是repo sync,repo sync会出现Exited sync due to fetch errors错误。
常见问题:

  • error.GitError: manifests rev-list (‘^c4e4db1a85b9bea00b9fe8c6a18f9d3357adab0c’, ‘HEAD’, ‘–’): fatal: Not a git repository (or any of the parent directories): .git

    删除.repo/menifest文件夹下的.git文件夹,不行再删.repo下的menifest.git文件夹。

  • Cannot get https://gerrit.googlesource.com/git-repo/clone.bundle

编辑 ~/bin/repo,把 REPO_URL 一行替换成:

REPO_URL = ‘https://mirrors.tuna.tsinghua.edu.cn/git/git-repo’

  • 更方便的方式(download.sh)
#!/bin/bash
PATH=~/bin:$PATH
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-7.0.0_r14
repo sync
while [ $? = 1 ]; doecho "================sync failed, re-sync again ====="sleep 3repo sync -j1 -f --force-sync
done

源码编译

编译准备

android.dmg.sparsefile分区新建文件夹aosp,将bin/aosp.repo以外的所有文件都拷贝到android.dmg.sparsefile分区中的aosp文件夹中。
注意

android源码编译的Java版本要和/Volumes/untitled/aosp/build/core中的main.mk中的设置Java版本的地方对应,如果mk文件中是1.6就要用1.6,是1.8就要用1.8。

# Check for the correct version of java
java_version := $(shell java -version 2>&1 | head -n 1 | grep '^java .*[ "]1\.6[\. "$$]')
ifneq ($(shell java -version 2>&1 | grep -i openjdk),)
java_version :=
endif
ifeq ($(strip $(java_version)),)
$(info ************************************************************)
$(info You are attempting to build with the incorrect version)
$(info of java.)
$(info $(space))
$(info Your version is: $(shell java -version 2>&1 | head -n 1).)
$(info The correct version is: Java SE 1.6.)
$(info $(space))
$(info Please follow the machine setup instructions at)
$(info $(space)$(space)$(space)$(space)http://source.android.com/source/download.html)
$(info ************************************************************)
$(error stop)
endif

jdk设置可以参考:

  1. 打开“.bash_profile”文件,open ~/.bash_profile
  2. 设置jdk版本和别名,修改成自己的JDK目录名。
export JAVA_6_HOME=/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
export JAVA_7_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home
export JAVA_8_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_101.jdk/Contents/Homeexport JAVA_HOME=$JAVA_6_HOME
alias jdk8='export JAVA_HOME=$JAVA_8_HOME'
alias jdk7='export JAVA_HOME=$JAVA_7_HOME'
alias jdk6='export JAVA_HOME=$JAVA_6_HOME’

保存后执行source ~/.bash_profile
终端输入jdk6、jdk7、jdk8 即可切换jdk版本。

开始编译

1.环境准备

终端输入source build/envsetup.sh

2.设置编译目标lunch aosp_arm-eng
3.开始编译make -j8make -j4make -j16,取决于你的CPU的线程数。

编译完成后可看见aosp目录有out文件夹,aosp/out/host/darwin-x86/framework文件夹中有一些jar包生成。

常见问题
1.XCODE的SDK版本问题

Please install the 10.5 SDK on this machine at /Developer/SDKs/MacOSX10.5.sdk
external/qemu/Makefile.android:82: *** Aborting the build..  Stop.

打开Android分区的aosp目录,进入aosp/external/qemu,打开Makefile.android,找到并改成如下代码:

``` ifeq ($(filter 10.5 10.5.%,$(DARWIN_VERSION)),)# We are on Snow Leopard or aboveLEOPARD_SDK := /Applications/Xcode-beta.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdkifeq ($(strip $(wildcard $(LEOPARD_SDK))),)$(info  Please install the 10.11 SDK on this machine at $(LEOPARD_SDK))$(error Aborting the build.)endifMY_CFLAGS += -isysroot $(LEOPARD_SDK) -mmacosx-version-min=10.11 -DMACOSX_DEPLOYMENT_TARGET=10.11MY_LDLIBS += -isysroot $(LEOPARD_SDK) -Wl,-syslibroot,$(LEOPARD_SDK) -mmacosx-version-min=10.11endif  

/Applications/Xcode-beta.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk是我的XCODE应用程序包里的内容,根据自己的版本改即可。

2.内存溢出

Try increasing heap size with java option '-Xmx<size>'.

修改Jack的配置文件prebuilts/sdk/tools/jack-admin,将

JACK_SERVER_COMMAND="java -XX:MaxJavaStackTraceDepth=-1 -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -cp $LAUNCHER_JAR $LAUNCHER_NAME"

修改为

JACK_SERVER_COMMAND="java -XX:MaxJavaStackTraceDepth=-1 -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -Xmx4096m -cp $LAUNCHER_JAR $LAUNCHER_NAME"

然后在终端输入

./prebuilts/sdk/tools/jack-admin stop-server

重新编译时会重新启动jack server。

继续编译。

3.文件没找到

fatal error: 'linux/netfilter/xt_DSCP.h' file not found

在目录external/iptables/extensions/../include/Linux/netfilter中创建文件xt_DSCP.h

 /* based on ipt_FTOS.c (C) 2000 by Matthew G. Marsh <mgm@paktronix.com>* This software is distributed under GNU GPL v2, 1991** See RFC2474 for a description of the DSCP field within the IP Header.** xt_DSCP.h,v 1.7 2002/03/14 12:03:13 laforge Exp
*/
#ifndef _XT_DSCP_TARGET_H
#define _XT_DSCP_TARGET_H
#include <linux/netfilter/xt_dscp.h>
#include <linux/types.h>/* target info */
struct xt_DSCP_info {__u8 dscp;
};struct xt_tos_target_info {__u8 tos_value;__u8 tos_mask;
};#endif /* _XT_DSCP_TARGET_H */

导入Android Studio

生成idegen.jar

接着上一步,终端中当前位置在Android分区上的aosp目录。
确认下aosp/out/host/darwin-x86/framework文件夹中没有idegen.jar,输入命令:mmm development/tools/idegen,可看见文件夹中生成了这个jar包。

生成android.ipr和android.iml文件

输入命令development/tools/idegen/idegen.sh,执行完成可看到aosp目录生成了这两个文件。使用Android Studio打开android.ipr即可导入源码工程。

Android Studio查看源码的相关配置请看我的下一篇文章:Android Studio查看android源码。

最后,祝大家都编译成功,也可以加群( 301919302 )讨论Android技术哦。

转载请注明出处:http://write.blog.csdn.net/mdeditor#!postId=52212584。

这篇关于Mac OSX Android源码编译-环境搭建、源码下载、源码编译、导入Android Studio的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1102199

相关文章

Android开发中gradle下载缓慢的问题级解决方法

《Android开发中gradle下载缓慢的问题级解决方法》本文介绍了解决Android开发中Gradle下载缓慢问题的几种方法,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、网络环境优化二、Gradle版本与配置优化三、其他优化措施针对android开发中Gradle下载缓慢的问

python 3.8 的anaconda下载方法

《python3.8的anaconda下载方法》本文详细介绍了如何下载和安装带有Python3.8的Anaconda发行版,包括Anaconda简介、下载步骤、安装指南以及验证安装结果,此外,还介... 目录python3.8 版本的 Anaconda 下载与安装指南一、Anaconda 简介二、下载 An

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干

Java下载文件中文文件名乱码的解决方案(文件名包含很多%)

《Java下载文件中文文件名乱码的解决方案(文件名包含很多%)》Java下载文件时,文件名中文乱码问题通常是由于编码不正确导致的,使用`URLEncoder.encode(filepath,UTF-8... 目录Java下载文件中文文件名乱码问题一般情况下,大家都是这样为了解决这个问题最终解决总结Java下

本地搭建DeepSeek-R1、WebUI的完整过程及访问

《本地搭建DeepSeek-R1、WebUI的完整过程及访问》:本文主要介绍本地搭建DeepSeek-R1、WebUI的完整过程及访问的相关资料,DeepSeek-R1是一个开源的人工智能平台,主... 目录背景       搭建准备基础概念搭建过程访问对话测试总结背景       最近几年,人工智能技术

在Mysql环境下对数据进行增删改查的操作方法

《在Mysql环境下对数据进行增删改查的操作方法》本文介绍了在MySQL环境下对数据进行增删改查的基本操作,包括插入数据、修改数据、删除数据、数据查询(基本查询、连接查询、聚合函数查询、子查询)等,并... 目录一、插入数据:二、修改数据:三、删除数据:1、delete from 表名;2、truncate

C++实现获取本机MAC地址与IP地址

《C++实现获取本机MAC地址与IP地址》这篇文章主要为大家详细介绍了C++实现获取本机MAC地址与IP地址的两种方式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 实际工作中,项目上常常需要获取本机的IP地址和MAC地址,在此使用两种方案获取1.MFC中获取IP和MAC地址获取

C/C++通过IP获取局域网网卡MAC地址

《C/C++通过IP获取局域网网卡MAC地址》这篇文章主要为大家详细介绍了C++如何通过Win32API函数SendARP从IP地址获取局域网内网卡的MAC地址,感兴趣的小伙伴可以跟随小编一起学习一下... C/C++通过IP获取局域网网卡MAC地址通过win32 SendARP获取MAC地址代码#i