1.简述android源代码的安卓安卓编译过程
2.ç¼è¯åè°è¯çåºå«
3.onnxruntime源码学习-编译与调试 (公网&内网)
4.androidå¼åå¦ä½è°è¯
5.å¦ä½è°è¯Android Framework
6.如何定制android源码的编译选项 & 后期安装?
简述android源代码的编译过程
编译Android源代码是一个相对复杂的过程,涉及多个步骤和工具。源码源码下面我将首先简要概括编译过程,编译编译然后详细解释每个步骤。调试
简要
Android源代码的教程编译过程主要包括获取源代码、设置编译环境、安卓安卓源码熊编程大赛选择编译目标、源码源码开始编译以及处理编译结果等步骤。编译编译
1. 获取源代码:编译Android源代码的调试第一步是从官方渠道获取源代码。通常,教程这可以通过使用Git工具从Android Open Source Project(AOSP)的安卓安卓官方仓库克隆代码来完成。命令示例:`git clone /platform/manifest`。源码源码
2. 设置编译环境:在编译之前,编译编译需要配置合适的调试编译环境。这通常涉及安装特定的教程操作系统(如Ubuntu的某些版本),安装必要的依赖项(如Java开发工具包和Android Debug Bridge),以及配置特定的环境变量等。
3. 选择编译目标:Android支持多种设备和配置,因此编译时需要指定目标。这可以通过选择特定的设备配置文件(如针对Pixel手机的`aosp_arm-eng`)或使用通用配置来完成。选择目标后,编译系统将知道需要构建哪些组件和变种。
4. 开始编译:设置好环境并选择了编译目标后,就可以开始编译过程了。在源代码的submit源码根目录下,可以使用命令`make -jN`来启动编译,其中`N`通常设置为系统核心数的1~2倍,以并行处理编译任务,加快编译速度。编译过程中,系统将根据Makefile文件和其他构建脚本,自动下载所需的预构建二进制文件,并编译源代码。
5. 处理编译结果:编译完成后,将在输出目录(通常是`out/`目录)中生成编译结果。这包括可用于模拟器的系统镜像、可用于实际设备的OTA包或完整的系统镜像等。根据需要,可以进一步处理这些输出文件,如打包、签名等。
在整个编译过程中,还可能遇到各种依赖问题和编译错误,需要根据错误信息进行调试和解决。由于Android源代码庞大且复杂,完整的编译可能需要数小时甚至更长时间,因此耐心和合适的硬件配置也是成功编译的重要因素。
ç¼è¯åè°è¯çåºå«
ããç¼è¯åè°è¯é½æ¯åç¨åºçéè¦ç¯èãå®ä»¬ä¸¤è æä»ä¹åºå«å¢?ä¸é¢ï¼æè·å¤§å®¶å享ä¸ä¸ç¼è¯åè°è¯çåºå«ããã1.ç¼è¯åè°è¯çåºå«
ããç¼è¯æ¯ç¼è¯å¨å¨ä½ ç¨åºæ²¡æè¿è¡çæ¶åå¸®ä½ æ£æ¥é误ã
ããè°è¯æ¯ä½ ç¨è°è¯å¨å¨ç¨åºè¿è¡ä»¥åï¼æ ¹æ®è¿è¡ç¶åµæ¥æ£æ¥é误ã
ããè¿ä¸¤è çä¸å¯éçï¼é¦å å¾ç¼è¯éè¿ï¼ä½ æè½è°è¯åï¼ç¼è¯æ£ç¡®åï¼ä¼çæexeæ件ï¼IDEä¸å¯å¨ç¨åºï¼å¯ä»¥è¿è¡è°è¯ã
ããç¼è¯æ¯ææºä»£ç åæäºè¿å¶objçè¿ç¨(é¾æ¥åæ为å¯æ§è¡æ件)ï¼å½ç¶ä¼å å¸®ä½ æ£æ¥ææ ç®åçè¯æ³é®é¢ï¼è¦ä¸ç¼è¯å¨äººå®¶ä¸è®¤è¯ï¼ä½ èªå·±è¯´çææ é»è¾å°±åç¼è¯å¨æ å ³äºã
ããè°è¯é¦å éè¦çæäºè¿å¶ä»£ç ï¼æ以éè¦é¦å è¿è¡ç¼è¯åé¾æ¥ï¼ç¶åå°æç¹åï¼è°è¯å¨ä¼å¸®ä½ å int 3ä¸æï¼å°±åä½äºã
ããç¼è¯å ³æ³¨è¯æ³é误ï¼è°è¯å ³æ³¨é»è¾é误ãä¹å°±æ¯è¯´ç¼è¯å ³æ³¨çæ¯syntax(è¯æ³)æ¹é¢çé®é¢ï¼è°å¼å ³æ³¨çæ¯semantics(è¯ä¹)æ¹é¢çé®é¢ã
ãã2.ç¼è¯è¯æ³åæ
ããè¯æ³åæçä»»å¡æ¯å¯¹ç±å符ç»æçåè¯è¿è¡å¤çï¼ä»å·¦è³å³é个å符å°å¯¹æºç¨åºè¿è¡æ«æï¼äº§çä¸ä¸ªä¸ªçåè¯ç¬¦å·ï¼æä½ä¸ºå符串çæºç¨åºæ¹é æ为åè¯ç¬¦å·ä¸²çä¸é´ç¨åºãæ§è¡è¯æ³åæçç¨åºç§°ä¸ºè¯æ³åæç¨åºææ«æå¨ã
ããæºç¨åºä¸çåè¯ç¬¦å·ç»æ«æå¨åæï¼ä¸è¬äº§çäºå å¼:åè¯ç§å«;åè¯èªèº«çå¼ãåè¯ç§å«é常ç¨æ´æ°ç¼ç ï¼å¦æä¸ä¸ªç§å«åªå«ä¸ä¸ªåè¯ç¬¦å·ï¼é£ä¹å¯¹è¿ä¸ªåè¯ç¬¦å·ï¼ç§å«ç¼ç å°±å®å ¨ä»£è¡¨å®èªèº«çå¼äºãè¥ä¸ä¸ªç§å«å«æ许å¤ä¸ªåè¯ç¬¦å·ï¼é£ä¹ï¼å¯¹äºå®çæ¯ä¸ªåè¯ç¬¦å·ï¼é¤äºç»åºç§å«ç¼ç 以å¤ï¼è¿åºç»åºèªèº«çå¼ã
ããè¯æ³åæå¨ä¸è¬æ¥è¯´æ两ç§æ¹æ³æé :æå·¥æé åèªå¨çæãæå·¥æé å¯ä½¿ç¨ç¶æå¾è¿è¡å·¥ä½ï¼èªå¨çæ使ç¨ç¡®å®çæéèªå¨æºæ¥å®ç°ã
ãã3.ç¼è¯è¯æ³åæ
ããç¼è¯ç¨åºçè¯æ³åæå¨ä»¥åè¯ç¬¦å·ä½ä¸ºè¾å ¥ï¼åæåè¯ç¬¦å·ä¸²æ¯å¦å½¢æ符åè¯æ³è§åçè¯æ³åä½ï¼å¦è¡¨è¾¾å¼ãèµå¼ã循ç¯çï¼æåçæ¯å¦ææä¸ä¸ªç¬¦åè¦æ±çç¨åºï¼æ该è¯è¨ä½¿ç¨çè¯æ³è§ååææ£æ¥æ¯æ¡è¯å¥æ¯å¦ææ£ç¡®çé»è¾ç»æï¼ç¨åºæ¯æç»çä¸ä¸ªè¯æ³åä½ãç¼è¯ç¨åºçè¯æ³è§åå¯ç¨ä¸ä¸ææ å ³ææ³æ¥å»ç»ã
ããè¯æ³åæçæ¹æ³å为两ç§:èªä¸èä¸åææ³åèªä¸èä¸åææ³ãèªä¸èä¸å°±æ¯ä»ææ³çå¼å§ç¬¦å·åºåï¼åä¸æ¨å¯¼ï¼æ¨åºå¥åãèèªä¸èä¸åææ³éç¨çæ¯ç§»è¿å½çº¦æ³ï¼åºæ¬ææ³æ¯:ç¨ä¸ä¸ªå¯å符å·çå è¿ååºæ ï¼æè¾å ¥ç¬¦å·ä¸ä¸ªä¸ä¸ªå°ç§»è¿æ éï¼å½æ 顶形ææ个产çå¼çä¸ä¸ªåéå¼æ¶ï¼å³ææ 顶çè¿ä¸é¨åå½çº¦æ该产çå¼çå·¦é»ç¬¦å·ã
ãã4.代ç ä¼å
ãã代ç ä¼åæ¯æ对ç¨åºè¿è¡å¤ç§çä»·åæ¢ï¼ä½¿å¾ä»åæ¢åçç¨åºåºåï¼è½çææ´ææçç®æ 代ç ãæè°çä»·ï¼æ¯æä¸æ¹åç¨åºçè¿è¡ç»æãæè°ææï¼ä¸»è¦æç®æ 代ç è¿è¡æ¶é´è¾çï¼ä»¥åå ç¨çåå¨ç©ºé´è¾å°ãè¿ç§åæ¢ç§°ä¸ºä¼åã
ããæ两类ä¼å:ä¸ç±»æ¯å¯¹è¯æ³åæåçä¸é´ä»£ç è¿è¡ä¼åï¼å®ä¸ä¾èµäºå ·ä½ç计ç®æº;å¦ä¸ç±»æ¯å¨çæç®æ 代ç æ¶è¿è¡çï¼å®å¨å¾å¤§ç¨åº¦ä¸ä¾èµäºå ·ä½ç计ç®æºã对äºåä¸ç±»ä¼åï¼æ ¹æ®å®ææ¶åçç¨åºèå´å¯å为å±é¨ä¼åã循ç¯ä¼ååå ¨å±ä¼åä¸ä¸ªä¸åç级å«ã
ãã4.ç¼è¯åºéå¤ç
ããå¦æç¼è¯è¿ç¨ä¸åç°æºç¨åºæé误ï¼ç¼è¯ç¨åºåºæ¥åé误çæ§è´¨åé误çåççå°ç¹ï¼å¹¶ä¸å°é误æé æçå½±åéå¶å¨å°½å¯è½å°çèå´å ï¼ä½¿å¾æºç¨åºçå ¶ä½é¨åè½ç»§ç»è¢«ç¼è¯ä¸å»ï¼æäºç¼è¯ç¨åºè¿è½èªå¨çº æ£é误ï¼è¿äºå·¥ä½ç±é误å¤çç¨åºå®æã
ããéè¦æ³¨æçæ¯ï¼ä¸è¬ä¸ç¼è¯å¨åªåè¯æ³æ£æ¥åæç®åçè¯ä¹æ£æ¥ï¼èä¸æ£æ¥ç¨åºçé»è¾ãé»è¾é误è¦éè¿è°è¯ã
ããææ»ç»ï¼
çå®äºä¸é¢çæ¯è¾ï¼ä½ ç°å¨è¿è½åºå«ç¼è¯ä¸è°è¯å?å ¶å®ï¼åªè¦è®°ä½è¿å¥è¯ï¼“ç¼è¯å ³æ³¨è¯æ³é误ï¼è°è¯å ³æ³¨é»è¾é误ï¼å æç¼è¯ï¼åæè°è¯”ï¼å°±ä¸ä¼å¿äºä¸¤è çåºå«äºã
onnxruntime源码学习-编译与调试 (公网&内网)
在深入学习ONNX Runtime的过程中,我决定从1.版本开始,wacc源码以对比与理解多卡并行技术。为此,我选择了通过`./tools/ci_build/build.py`脚本进行编译,而不是直接执行`build.sh`,因为后者并不直接提供所需的参数。在`build.py:::parse_arguments()`函数中,我找到了可选择的参数,例如运行硬件(CPU/GPU)、调试模式(Debug/Release)以及是否并行编译。我特别使用了`--skip_submodule_sync`,以避免因与公网不通而手动下载“submodule”,即`./cmake/external`文件夹下的依赖组件。这样可以节省每次编译时检查依赖组件更新的时间,提高编译效率。同时,我使用`which nvcc`命令来确定`cuda_home`和`cudnn_home`的值。
我的编译环境配置为gcc8.5.0、cuda.7和cmake3..1,其中cmake版本需要不低于3.,gcc版本则至少为7.0,否则编译过程中会出现错误。在编译环境的配置中,可以通过设置PATH和LD_LIBRARY_PATH来指定可执行程序和动态库的路径。对于手动下载“submodule”的diocp 源码不便,可以通过先在公网编译cpu版本,然后在编译开始阶段由构建脚本自动下载所有依赖组件并拷贝至所需目录来简化流程。
编译顺利完成后,生成的so文件并未自动放入bin目录,这可能是由于在安装步骤后bin目录下才会出现相应的文件。接下来,我进入了调试阶段,使用vscode进行调试,最终成功运行了`build/RelWithDebInfo/onnxruntime_shared_lib_test`可执行文件。
在深入研究ONNX Runtime的编译流程时,我发现了一个更深入的资源,它涵盖了从`build.sh`到`build.py`再到`CmakeList.txt`的编译过程,以及上述流程中涉及的脚本解析。对这个流程感兴趣的读者可以进行更深入的研究。
在编译过程中,我遇到了一些问题,如下载cudnn并进行安装,以及解决找不到`stdlib.h`的问题。对于找不到`stdlib.h`,我通过查阅相关文章和理解编译过程中搜索路径的逻辑,最终找到了解决方案。如果忽略这个问题,我选择在另一台机器上重新编译以解决问题。
在使用vscode调试时,luvit源码我遇到了崩溃问题,这可能是由于vscode、gdb或Debug模式编译出的可执行文件存在潜在问题。通过逐步排除,我最终确定问题可能出在Debug模式编译的可执行文件上。这一系列的探索和解决过程,不仅加深了我对ONNX Runtime的理解,也提高了我的调试和问题解决能力。
androidå¼åå¦ä½è°è¯
è½å¤å¨eclipseä¸è¿è¡è°è¯åºç¨ç¨åºä¹åï¼ä½ å¿ é¡»ä¸ºå®å建ä¸ä¸ªå¯å¨é¡¹ãå¯å¨é¡¹æå®åªä¸ªå·¥ç¨å°è¢«å¯å¨ï¼åªä¸ªactivityå¼å§å·¥ä½ï¼ä»¥å使ç¨åªäºæ¨¡æå¨é项çã
æç §ä»¥ä¸æ¥éª¤ä¸ºEclipseçæ¬çåºç¨ç¨åºå建åéçå¯å¨é¡¹ï¼
æå¼å¯å¨é¡¹ç®¡çå·¥å ·ã
å¨Eclipse 3.3 (Europa)ççæ¬ä¸ï¼é æ éæ© Run > Open RunDialog... or Run > Open Debug Dialog... ã
å¨Eclipse3.4 (Ganymede)çæ¬ä¸ï¼é æ éæ© Run > Run Configurations...or Run > Debug Configurations... ã
å¨å·¦è¾¹çå·¥ç¨ç±»åå表éæ©Android Applicationéæ©ï¼åå»ï¼æè ç¹å»å³é®éæ©newï¼,å建ä¸ä¸ªæ°çå¯å¨é¡¹ã
è¾å ¥å¯å¨é¡¹å称ã
å¨Androidæ ç¾ä¸ï¼æµè§è¦å¼å§çå·¥ç¨åActivity ã
å¨Targetæ ç¾ä¸ï¼è®¾ç½®æ³è¦æ¾ç¤ºçå±å¹åç½ç»å±æ§ï¼ä»¥åå ¶ä»ä»»ä½æ¨¡æå¨å¯å¨é项ã
ä½ å¯ä»¥å¨Commonæ ç¾ä¸è®¾ç½®æ´å¤çé项.
æä¸Applyä¿åå¯å¨é ç½®ï¼æè æä¸RunæDebugï¼ï¼ã
è¿è¡åè°è¯åºç¨ç¨åº
ä¸æ¦ä½ 设å®äºå·¥ç¨åå·¥ç¨å¯å¨é ç½®ï¼ä½ å°±å¯ä»¥æç §ä»¥ä¸ç说æè¿è¡åè°è¯åºç¨ç¨åºäºã
ä»eclipse主èåï¼æ ¹æ®æ åµéæ©Run>Run æè Run>Debugï¼å¼å§è¿è¡æè è°è¯æ´»å¨å¯å¨é¡¹ã
注æï¼è¿éæ´»å¨å¯å¨é¡¹æ¯å¨è¿è¡é 置管çä¸ææè¿ä¸æ¬¡éä¸çé£ä¸ªãå®ä¸ä¸å®å°±æ¯å¨Eclipse Navigation é¢æ¿ä¸éæ©çç¨åºï¼å¦ææçè¯ï¼
设置åä¿®æ¹æ´»å¨å¯å¨é¡¹ï¼å¯ä»¥ä½¿ç¨å¯å¨é¡¹ç®¡çå·¥å ·ãå¦ä½è·å¾å¯å¨é¡¹ç®¡çå·¥å ·å¯ä»¥åèå建ä¸ä¸ªå¯å¨é¡¹
è¿è¡æè°è¯åºç¨ç¨åºå°è§¦å以ä¸å¨ä½:
å¯å¨æ¨¡æå¨ï¼å¦æä»è¿æ²¡æå¼å§è¿è¡ã
ç¼è¯å·¥ç¨ï¼ å¦æå¨ä¸æ¬¡ç¼è¯çåºç¡ä¸ä¿®æ¹è¿ä»£ç ï¼å°éæ°ç¼è¯ãå¨æ¨¡æå¨ä¸å®è£ åºç¨ç¨åºã
Runé项ï¼å¼å§è¿è¡ç¨åºã
Debug å¨"Wait for debugger "模å¼ä¸å¯å¨ç¨åº,ç¶åæå¼è°è¯çªå£å¹¶å°Eclipse Javaè°è¯å¨åç¨åºå ³èã
å©ç¨å ¶ä»IDEsåå·¥å ·å¼åAndroidåºç¨ç¨åº
é常æ们使ç¨å®è£ æADTæ件çeclipse Eclipse with the ADT plugin.æ¥å¼åAndroidç¨åºï¼è¿ä¸ªæ件å°ç¼è¾ï¼buildåè°è¯åè½éæå°IDEä¸ã
ç¶èï¼å¦æä½ æ³å¨å ¶ä»çIDEä¸å¼åç¨åºï¼ä¾å¦IntelliJï¼æè 使ç¨æ²¡æADTæ件çeclipseä¹å¯ä»¥ãSDKæä¾äºå®è£ ï¼ç¼è¯ï¼è°è¯åºç¨ç¨åºæéè¦çå·¥å ·ã
å建ä¸ä¸ªandroidå·¥ç¨
Android SDKå å«ä¸ä¸ªactivityCreatorçç¨åºï¼å®å°ä¸ºå·¥ç¨äº§çå¤ä¸ªstubæ件åä¸ä¸ªbuildæ件ãä½ å¯ä»¥ç¨è¿ä¸ªç¨åºå建ä¸ä¸ªæ°ç Androidå·¥ç¨æè å¨ç°æ代ç ä¸å建工ç¨ï¼å¦SDKä¸å å«çä¾åã对äºLinux åMacç³»ç»ï¼SDKæä¾activityCreator.py,ä¸ä¸ª Pythonèæ¬ï¼Windowsä¸åæ¯activityCreator.batä¸ä¸ªæ¹å¤çèæ¬ãæ 论æ¯åªç§å¹³å°ï¼ç¨æ³æ¯ä¸æ ·çã
æ以ä¸æ¥éª¤è¿è¡activityCreatorå建Androidå·¥ç¨:
å¨å½ä»¤è¡ä¸ï¼åæ¢å°SDKä¸çtools/ç®å½ä¸ï¼ä¸ºä½ çå·¥ç¨æ件æ°å»ºä¸ä¸ªç®å½ãå¦æä½ æ¯å¨ç°æ代ç ä¸å建工ç¨ï¼åæ¢å°ç¨åºçæ ¹ç®å½ä¸ã
è¿è¡activityCreatorãå¨å½ä»¤è¡ä¸ï¼ä½ å¿ é¡»æå®å®å ¨åæ ¼çç±»åä½ä¸ºåæ°ãå¦æä½ æ¯å建ä¸ä¸ªå ¨æ°çå·¥ç¨ï¼è¿ä¸ªç±»ä»£è¡¨çä¸å®ååçstubç±»åèæ¬æ件ãå¦ææ¯å¨ç°æ代ç ä¸å建工ç¨ï¼å¿ é¡»æå®è½¯ä»¶å ä¸å ¶ä¸ä¸ä¸ªActivityç±»çå称ãå½ä»¤é项çèæ¬å æ¬ï¼
--out <folder> 设å®è¾åºç®å½ãé»è®¤æ åµä¸è¾åºç®å½ä¸ºå½åç®å½ãå¦æä½ æ³ä¸ºå·¥ç¨æ件å建ä¸ä¸ªæ°çç®å½ï¼å¯ä»¥ä½¿ç¨è¿ä¸ªé项æ¥æåå®ã
--ide intellij, å¨ä¸ä¸ªæ°ç项ç®ä¸çæIntelliJIDEA å·¥ç¨æ件ã
è¿éæ个ä¾åï¼
~/android_linux_sdk/tools $ ./activityCreator.py --out myprojectyour.package.name.ActivityName
package: your.package.name
out_dir: myproject
activity_name: ActivityName
~/android_linux_sdk/tools $
activityCreatorèæ¬çæ以ä¸æ件åç®å½ï¼ä½æ¯ä¸è½éåå·²ææ件ï¼ï¼
AndroidManifest.xml ç¨åºçæ¸ åæ件ï¼åæ¶ä¸ºå·¥ç¨æå®Activityç±»ã
build.xml ä¸ä¸ªAntæ件ï¼ç¨æ¥ç¼è¯/æå åºç¨ç¨åºã
src/your/package/name/ActivityName.java ä½ æå®çè¾å ¥Activityç±»ã
your_activity.iml, your_activity.ipr, your_activity.iws [only with the-ide intelliJ flag] intelliJå·¥ç¨æ件
res/ èµæºç®å½.
src/ æºä»£ç ç®å½.
bin/ buildèæ¬çè¾åºç®å½.
ç°å¨ä½ å¯ä»¥å°å¼åæ件夹移å°ä»»ä½å°æ¹ï¼ä½æ¯è®°ä½ï¼å¿ 须使ç¨tool/æ件夹ä¸çadbç¨åºå°æ件åéå°æ¨¡æå¨ä¸ãå æ¤ä½ éè¦å¨ä½ å·¥ä½ç¯å¢åtools/æ件夹ä¹é´æ´»å¨ã
å½ç¶ä½ éè¦é¿å 移å¨SDKç®å½ï¼å 为å®å°ææç¼è¯èæ¬ãï¼åéæ°buildä¹åéè¦æå¨æ´æ°SDKçæ å°è·¯å¾ï¼
ç¼è¯ androidåºç¨ç¨åº
使ç¨activityCreatorçæçAntæ件build.xmlæ¥ç¼è¯ç¨åº
å¦æä½ æ²¡æï¼ä½ å¯ä»¥éè¿Apache Ant home pageå¾å°Antæ件ãå®è£ å®ï¼å¹¶ç¡®å®å®å¨ä½ çå¯æ§è¡æ件路å¾ä¸ã
å¼å«Antä¹åï¼ä½ é声æJAVA_HOMEç¯å¢åéï¼å¹¶å°å®è®¾ç½®ä¸ºJDKçå®è£ è·¯å¾ã
注 æï¼å¨windowsä¸ï¼JDKé»è®¤çå®è£ è·¯å¾ä¸º"ProgramFiles"ï¼è¿ä¸ªè·¯å¾å°ä¼å¼èµ·Ant失败ï¼å 为路å¾ä¸é´æç©ºæ ¼ã解å³è¿ä¸ªé®é¢ï¼ä½ å¯ä»¥åè¿æ ·æå®ç¯å¢åé JAVA_HOMEï¼JAVA_HOME=c:\Prora~1\Java\ ç¶èç®åç解å³æ¹æ³æ¯å°JDKå®è£ å¨æ²¡æç©ºæ ¼çç®å½ä¸ãä¾å¦ï¼c:\java\jdk1.6.0_.ã
å¦æä½ è¿æ²¡æè¿ä¹åå¤å¥½ï¼æç §ä¸é¢å建ä¸ä¸ªæ°çå·¥ç¨çä»ç»å»ºç«ä¸ä¸ªå·¥ç¨ã
ç°å¨ä½ å¯ä»¥ä¸ºä½ çå·¥ç¨è¿è¡Antç¼è¯æ件ï¼åªéå¨build.xmlåæ件夹ä¸è¾å ¥antå³å¯ãæ¯æ¬¡ä¿®æ¹åæ件ææ¯èµæºï¼é½éè¦éæ°è¿è¡antï¼å®å°æææ°ççåºç¨ç¨åºæå 以便deploy.
è¿è¡Androidç¨åº
è¿è¡ä¸ä¸ªç¼è¯å¥½çç¨åº,ä½ éè¦ç¨adbå·¥å ·å°.apkæ件å è½½å°æ¨¡æå¨ç/data/app/ç®å½ä¸ï¼ç¨æ³å¦ä¸é¢ä»ç»ã
å¯å¨æ¨¡æå¨ï¼å½ä»¤è¡ä¸è¿è¡sdkç®å½ä¸ç/tools/emulatorï¼ã
模æå¨åæ¢å°ä¸»ç»é¢ï¼æ好ä¸è¦å¨ç¨åºè¿è¡çæ¶åå模æå¨å®è£ ç¨åºï¼å¯ä»¥æhomeé®ç¦»å¼åºç¨ç¨åºï¼ã
è¿ è¡adbï¼å®è£ myproject/bin./<appname>.apkæ件ãä¾å¦ï¼å®è£ Lunar Lander 示ä¾ï¼å½ä»¤è¡ä¸ï¼åæ¢å°SDKç®å½ä¸ç/sample/LunarLanderåç®å½ä¸ï¼è¾å ¥../../tools/adbinstall bin/LunarLander.apk
å¨æ¨¡æå¨ä¸ï¼æå¼å¯æ§è¡ç¨åºå表ï¼å·å¨å±å¹ï¼éä¸å¹¶å¯å¨ä½ çåºç¨ç¨åºã
注æï¼å½ä½ 第ä¸æ¬¡å®è£ ä¸ä¸ªActivityæ¶ï¼ä½ å¯è½éè¦å¨å¯å¨é¡¹æ¾ç¤ºä¹åï¼æè å ¶å®ç¨åºè°ç¨å®ä¹åéæ°å¯å¨æ¨¡æå¨ãå 为软件å 管çå·¥å ·é常åªæå¨æ¨¡æå¨å¯å¨æ¶æè½å®å ¨ç审æ¥manifestsã
为ç¨åºéå è°è¯å¨
è¿ä¸èæ们ä»ç»å¦ä½å¨å±å¹ä¸æ¾ç¤ºè°è¯ä¿¡æ¯ï¼ä¾å¦CPU使ç¨çï¼ï¼ä»¥åå¦ä½å°IDEå模æå¨ä¸è¿è¡çç¨åºå ³èèµ·æ¥ã
使ç¨eclipseæ件å¯ä»¥èªå¨ççæè°è¯å¨ãä½ä½ ä¹å¯ä»¥éè¿é ç½®IDESæ¥çå¬è°è¯ç«¯å£å¾å°è°è¯ä¿¡æ¯ã
å¯å¨Dalvik Debug Monitor Server (DDMS) å·¥å · ï¼å®å¨IDEå模æå¨ä¹é´æ®æ¼ç端å£è½¬æ¢æå¡çè§è²ãï¼
设置模æå¨è°è¯é ç½®é项ãä¾å¦ï¼çå°è°è¯ä¿¡æ¯è¢«å è½½åæå¯å¨åºç¨ç¨åºã注æï¼å¾å¤è°è¯é项æ éDDMSä¹å¯ä»¥ä½¿ç¨ï¼ä¾å¦æ¨¡æå¨ä¸æ¾ç¤ºCPUç使ç¨æçï¼æè å±å¹çå·æ°é¢çã
é ç½®IDEï¼ä½¿å¾è°è¯æ¶IDEä¸ç«¯å£å ³è .how to set up Eclipse to debug your project. å å«ä»¥ä¸ä¿¡æ¯ã
é ç½®IDEéå è°è¯ç«¯å£
DDMSå°ä¸ºæ¯ä¸ä¸ªèææºåé ä¸ä¸ªç¹æ®çè°è¯ç«¯å£ï¼è¿ä¸ªç«¯å£å¨æ¨¡æå¨ä¸å¯ä»¥æ¾å°ãä½ å¿ é¡»å°ä½ çIDEä¸æ¤ç«¯å£ï¼èææºä¸ä¿¡æ¯æ ä¸æååºè¿äºç«¯å£ï¼å ³èæè æ¯é»è®¤ç端å£ãè¿æ ·å¯ä»¥ä½¿IDE è¿æ¥å°æ¨¡æå¨ä¸ç¨åºå表ä¸çä»»ä¸ä¸ªç¨åºã
ä½ çIDEéè¦è½å¤å ³è模æå¨ä¸æ£å¨è¿è¡çç¨åºï¼æ¾ç¤ºå®ç线ç¨ï¼å¹¶å è®¸ä½ æèµ·å®ï¼æ£æ¥å®çç¶æï¼è®¾ç½®æç¹ãå¦æä½ å¨å¼å设置é¢æ¿éæ©äºâçå¾ è°è¯âï¼åºç¨ç¨åºå°çå°Eclipseè¿æ¥åæè¿è¡ï¼æä»¥ä½ éè¦å¨è¿æ¥ä¹å设置æç¹ã
ä¿®æ¹æ£å¨è°è¯çç¨åºï¼æè å¨å½åç¨åºè¿è¡æ¶éæ©âçå¾ è°è¯âå°å¼èµ·ç³»ç»ææ»è¿ä¸ªåºç¨ç¨åºãå¦æä½ çç¨åºå¤äºä¸ç§åçç¶æï¼ä½ å¯ä»¥ä½¿ç¨æ¹å¼ææ»å®ï¼æ¹æ³å¾ç®åï¼åªéè¦è®¾ç½®åé©æå¤éæ¡ã
å¦ä½è°è¯Android Framework
ç¨Android Studioè¿è¡æºç è°è¯
å¦ä¸ææè¿°ï¼å¦æéè¦å®ç°æºç è°è¯ï¼å¿ é¡»ç¥é足å¤çè°è¯ä¿¡æ¯ï¼å¨nativeè°è¯ä¸å°±æ¯æè°çãè°è¯ç¬¦å·ããä½æ¯releaseçæ¬çå¨æé¾æ¥åºæè å¯æ§è¡æ件ä¸è¬å¹¶ä¸ä¼å å«æ们éè¦çè°è¯ä¿¡æ¯ï¼å¨Androidç³»ç»ä¸ï¼ /system/lib/* ç®å½ä¸çé£äºç³»ç»so并没æ足å¤çè°è¯ä¿¡æ¯ï¼å æ¤å¦æè¦è¿è¡æºç è°è¯ï¼å¿ é¡»èªå·±ç¼è¯Androidæºä»£ç ï¼æè½è·åè°è¯ä¿¡æ¯ï¼è¿è让è°è¯å¨åå©æ们è°è¯ã
Androidæºç ç¼è¯æ¯ä¸ªéº»ç¦äºå¿ï¼æåè¿ä¸ç¯æç« ä»ç» å¦ä½ä½¿ç¨Dockerè°è¯ ï¼ä½æ¯ï¼Androidçæ¬ä¼å¤ï¼å¦æççéè¦è°è¯å个çæ¬ï¼å¨æ¬å°è¿è¡ç¼è¯å ä¹æ¯ä¸å¯è½çââä¸ä¸ªçæ¬çº¦å G空é´ï¼å¦ææ¯ä¸ªçæ¬é½ç¼è¯ï¼ä½ çMacè¿æ空é´å¯ç¨åï¼å æ¤æ¯è¾æ¨è使ç¨äºæå¡è¿è¡æºç ç¼è¯ï¼æ¯å¦ä½¿ç¨é¿éäºçECSï¼Mçç½éåéå°±è½ä¸è½½å®æºç ï¼ç¼è¯é度è¿å强ï¼4æ ¸8G两个åå°æ¶ãæ¯è¿äº :) å¦æä½ æ²¡æç²¾åç¼è¯Androidæºç ï¼æè¿ä¸ª Demoå·¥ç¨ å¯ä»¥è®©ä½ å°å°é²ï¼éé¢å å«ä¸äºè°è¯çå¿ è¦æ件ï¼å¯ä»¥ä½ä¼ä¸ä¸Nativeè°è¯çæè§ã
å¦ææ们已ç»æ¥æäºè°è¯ç¬¦å·ï¼é£ä¹è¿éè¦ä¿è¯ä½ ç符å·æ件å设å¤ä¸çæ£è¿è¡çå¨æé¾æ¥åºæè å¯æ§è¡æ件æ¯å¯¹åºçï¼ä¸ç¶å°±æ¯é¸¡åé¸è®²äºãæç®åçåæ³å°±æ¯ä½¿ç¨æ¨¡æå¨ãæ们ç¼è¯å®æºç ä¹åï¼ä¸ä¸ªä¸»è¦çç¼è¯äº§ç©å°±æ¯ system.img ï¼è¿ä¸ª system.img ä¼å¨å¯å¨ä¹åæè½½å°è®¾å¤ç /system ååºï¼èsystemååºå å«äºAndroidç³»ç»è¿è¡æ¶çç»å¤§é¨åå¯æ§è¡æ件åå¨æé¾æ¥åºï¼èè¿äºæ件就æ¯æ们çç¼è¯è¾åºï¼æ£å¥½å¯ä»¥ä¸ç¼è¯å¾å°çè°è¯ç¬¦å·è¿è¡é åè°è¯ã模æå¨æä¸ä¸ª -system é项ç¨æ¥æå®æ¨¡æå¨ä½¿ç¨ç system.imgæ件ï¼äºæ¯è¿ä¸ªé®é¢ä¹è§£å³äºã
æåä¸ä¸ªé®é¢å°±æ¯ï¼æ¢ç¶æ¯æºç è°è¯ï¼å½ç¶éè¦æºç äºï¼æ们å¯ä»¥å¨ AOSP ä¸ä¸è½½éè¦çæºç å³å¯ï¼éè¦æ³¨æçæ¯ï¼å¨checkåæ¯çæ¶åï¼å¿ é¡»ä¿è¯ä½ çåæ¯åç¼è¯æºç æ¶åçåæ¯æ¯ä¸è´çã
如何定制android源码的编译选项 & 后期安装?
Android编译过程比较长,配置起来也很麻烦。现仅就工作遇到的问题做个总结。所用硬件平台为amlogic stvm3。---------------------------------------------------------------------------关于版本号:文件build/core/version_defaults.mk用来检查一些跟版本相关的变量是否定义;如果未定义,则使用默认值。这些变量包括 PLATFORM_VERSION # 如 2.2.5 PLATFORM_SDK_VERSION # 8, 对应2.2.5 PLATFORM_VERSION_CODENAME # REL,即发行版 DEFAULT_APP_TARGET_SDK # 同SDK_VERSION或VERSION_CODENAME BUILD_ID # 默认为UNKNOWN BUILD_NUMBER # 默认eng.$(USER).$(shell date +%Y%m%d.%H%M%S)的形式。 version_defaults.mk首先包含进build_id.mk。用户应当配置build_id.mk,而不应该改动version_defaults.mk文件。然后检查上述变量,如未定义则赋值默认值。---------------------------------------------------------------------------关于调试功能(adb)的开启编译android源码之前总是要先运行build/envsetup.sh,以初始化一些常用命令(实际上是bash的函数,如add_lunch_combo)。其中也从以下文件中引入了一些编译设置: device/${ CHIPSET_VENDOR}/vendorsetup.sh我们这里使用的CHIPSET_VENDOR为amlogic。比如我们有文件device/amlogic/vendorsetup.sh,内容为"产品名-编译类型(flavor)"列表(称为combo),如下: add_lunch_combo m1ref-eng add_lunch_combo m1ref-user add_lunch_combo m2ref-eng add_lunch_combo m2ref-user add_lunch_combo stvm3-eng add_lunch_combo stvm3-user其中,m1ref和stvm3是产品名(作前缀),后面为编译类型。除此前缀外可选的combo值有: eng, user, userdebug, tests。(参考文件build/core/main.mk中对于变量TARGET_BUILD_VARIANT的筛查条件)我们可以修改vendorsetup.sh文件,来改变为特定设备编译的结果。以下是各个编译类型的特点: eng: 工程模式,用于平台级的调试,是默认的编译类型。 待安装的模块tag有: eng, debug, user, development. 安装不带tag的非APK模块; 所安装应用由产品定义文件给出; 默认属性: ro.secure=0, ro.deuggable=1, ro.kernel.android.checkjni=1 adbd默认开启,adb以root身份运行。 user: 即最终用户版; 待安装的应用tag有: user 安装不带tag的非APK模块; 所安装应用由产品定义文件给出; 默认属性有ro.secure=1, ro.debuggable=0; 默认关闭adbd服务(但可通过应用settings来打开,且adb以shell身份运行); userdebug: 与user类似,除了: 支持有限的调试功能; 待安装的应用tag有:debug;
源码编译——Xposed源码编译详解
本文深入解析了基于Android 6.0源码环境,实现Xposed框架的源码编译至定制化全过程,提供一套清晰、系统的操作指南。实验环境选取了Android 6.0系统,旨在探索并解决源码编译过程中遇到的难点,同时也借助于社区中其他大神的宝贵资源,让编译过程更加高效且精准。
致谢部分,首先对定制Xposed框架的世界美景大佬致以诚挚的感谢,其提供框架的特征修改思路和代码实例给予了深度学习的基础,虽然个人能力有限,未能完整复现所有的细节,但通过对比和实践,逐步解决了遇到的问题。特别提及的是肉丝大佬的两篇文章,《来自高纬的对抗:魔改XPOSED过框架检测(上)》和《来自高纬的对抗:魔改XPOSED过框架检测(下)》,这两篇文章是本文深入定制Xposed框架的基础指引,通过它们的学习,许多技术细节和解决方案得以明确。
关于Xposed框架编译和配置的技术细节,参考文章《xposed源码编译与集成》提供了清晰的理论框架,而在《学习篇-xposed框架及高版本替代方案》中,能够找到关于Xposed安装、功能验证以及遇到问题时的解决策略,这两篇文档对理解Xposed框架运行机制、安装流程以及后续的调试工作大有裨益。
在编译流程中,我们首先对Xposed框架中的各个核心组件进行详细的解析和功能定位,包括XposedInstaller、XposedBridge、Xposed、android_art、以及XposedTools。每一步都精心设计,确保实现模块与Android系统环境的无缝对接。接下来,我们进行具体的编译步骤。
首先是XposedBridge源码的下载,直接从GitHub上获取最新且与Android 6.0版本相适配的代码,这里选择下载Xposed_art。其次,通过Android.mk文件,我们可以配置编译环境,明确哪些源文件需要编译、生成的目标文件类型以及依赖的其他库文件。在Android.mk文件中,要确保针对特定的XposedBridge版本进行参数的调整,避免不必要的错误。
后续的编译过程可通过mmm或Android Studio完成。mmm编译更倾向于手动操作,适合熟悉CMakebuild系统的开发者,而Android Studio提供了一站式的IDE解决方案,操作流程更为便捷且直观。无论是采用哪种编译方式,最终的目标是生成XposedBridge.jar文件,这个文件将成为Xposed框架的核心组件,用于在Android系统上运行模块化的功能。
如何调试跟踪AndroidFramework源代码
为了在Eclipse中调试跟踪Android Framework的源代码,需要遵循一系列步骤。以下内容改写并优化了原文的条理和质量,确保语义不变,并保留了原文的条目编号。
1. **环境配置**:
- 确保安装了JDK、Eclipse、Android SDK和ADT插件。
- 针对跟踪调试Android源码,需要有可访问的Android源码编译环境,可以是虚拟机、网络共享或Linux本地环境。
- 确保Android源码是编译过的Eng版本。
2. **基本设置**:
- 将Android源码路径下的`.classpath`文件复制到源码根目录。
- 修改Eclipse的`eclipse.ini`文件以增加Java堆大小。
3. **创建工程**:
- 在Eclipse中创建一个新的Java项目。
- 输入项目名称,选择Android源码路径作为项目位置。
- 完成创建,并注意排除或添加项目中错误的配置包。
4. **调试环境配置**:
- 在Eclipse中设置远程Java应用程序的调试配置。
- 填写名称、项目选择为Android源码项目、端口填写正确的端口号。
- 应用并保存配置。
5. **调试过程**:
- 启动模拟器或连接真机,确保设备在DDMS视图中可见。
- 在目标代码处设置断点。
- 在设备上触发调试进程(如锁屏解锁操作)。
- 使用Eclipse的调试工具来控制程序执行和查看变量值。
6. **错误处理**:
- 如果导入的工程出现错误,可以通过以下方式处理:
- 方法一:编译自己的SDK,替换默认SDK中的`android.jar`。
- 方法二:将编译后的`framework`的`classes.jar`文件添加到Eclipse工程的`build path`中。
7. **注意事项**:
- 本文档适用于Windows、Mac OS和Linux系统。
- 可以调试Java代码,但不能调试Framework中的C/C++代码。
- 确保Android源码已编译,并且是Eng模式。
- 调试前需在目标代码处设置断点,并知道其执行的进程。
通过这些步骤,开发者可以在Eclipse中有效地调试Android Framework的源代码。