一.环境搭建
- 虚拟机:Ubuntu16.04
- Android源码环境搭建(aosp Ubuntu 16.04)
1.问题处理
- 1.1.VMware Tools的安装,解决ubuntu16.04未撑满全屏问题
- 1.2.安装vim,执行命令:sudo apt-get install vim
- 1.3.虚拟机与Windows系统共享文件夹设置,开机自动挂载
- 在计算机中可以找到相应的文件
- 1.4.openjdk 8 的安装,执行命令:sudo apt-get install openjdk-8-jdk
- 1.5.安装所需的软件软件包
sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev libgl1-mesa-dev libxml2-utils xsltproc unzip
-
1.6.下载源码包
-
1.7.创建aosp文件夹,使用命令:makdir ~/aosp,将下载好的文件移动到aosp中
-
1.8.安装解压工具,命令:sudo apt-get install p7zip
-
1.9.因为内存不足的原因,为保险起见,设置一下交换空间,Linux交换分区的设置-见参考文章的3.1部分
-
1.10.编译
- 进入aosp,打开控制台,输入:. build/envsetup.sh
- 继续:lunch,选择6
- 开始执行:make
-
1.11.启动模拟器出现报错
emulator: ERROR: Can't access ANDROID_PRODUCT_OUT as '/home/jack/aosp/android-8.1.0_r1/out/target/product/generic_x86_64'
You need to build the Android system before launching the emulator
- 依次执行三个步骤
. build/envsetup.sh
lunch #输入需要选择的数字
emulator
- 尝试重新make,在没有关系窗口的情况下执行命令emulator,模拟器正常打开,但是出现了提示:Could not automatically detect an ADB binary. Some emulator functionality will not work until a cust。处理方案:配置模拟器的adb路径即可(见下方2.5);
2.补充
2.1.命令
- find -name <目标>
- 查看进行:ps -A | grep <包名>
- 查看处于前台的Activity的类名
adb shell dumpsys activity activities
2.2.Log方法可以传递三个参数
- 最后一个参数传递Exception,可以查看堆栈信息
2.3.使用logcat命令
- 该命令是Android Sdk的一部分
- 要提前输入adb shell,再来使用logcat
- 查看指定进程的日志信息
//出现以下问题的原因是没有提前输入 adb shell命令
logcat | grep "1787"
未找到 'logcat' 命令,您要输入的是否是:
命令 'lolcat' 来自于包 'lolcat' (universe)
logcat:未找到命令
2.4.vim文件时
- 定位到某一行的方法,先输入shift + :,然后再输入具体的行号;
2.5.adb环境变量
- 启动模拟器提示ADB location,在模拟器的右下角的setting中,设置use detected ADB location为“/home/jack/Android/Sdk/platform-tools/adb”
- 设置adb环境变量
vim ~/.bashrc
export ANDROID_HOME=/home/jack/Android/Sdk
export PATH=$PATH:$ANDROID_HOME/cmdline-tools/13.0
export PATH=$PATH:$ANDROID_HOME/platform-tools
2.6.对framework模块下目录进行git管理
- 管理整个aosp是非常大的,仅对平时使用较多的位置进行仓库管理;
2.7.查看指定目录的大小
- du -sh <文件夹>
3.加载源码到Android studio
3.1.执行命令
. build/envsetup.sh
lunch
make idegen -j4
sudo development/tools/idegen/idegen.sh
注意:-j4根据实际情况进行设置或不设置
- 生成的文件android.iml,android.ipr可能没有权限,通过命令进行设置
3.2.安装应用桌面图标
- 安装Android studio,创建Android studio桌面图标。注意:创建的启动图标,需要通过鼠标右键进行操作,设置权限,允许作为程序执行文件;
- 以打开项目的方式打开android.ipr,根据需要编辑android.iml文件(屏蔽掉不需要加载的源码)-Framework编译并使用Android studio阅读源码指导;
4.效果查看
5.学习方法与注意事项
- 方法:百度法 + 直接看源码(借助日志打印),两者结合;
- 注意点:修改了源码之后,需要进行编译(最好进行整编译)
二.思考
1.Activity的onCreate经过了哪些流程最终被触发的?
- 方法:通过堆栈打印 + 日志(log可以传递三个参数,第三个参数传递Exeption)搜索的方式寻找调用流程
—>SystemServer通过跨进程的方式调用(AMS调用ActivityThread.scheduleLaunchActivity)
—>在ActivityThread.scheduleLaunchActivity中发送LAUNCH_ACTIVITY的消息
—> ActivityThread.handleLaunchActivity—> ActivityThread.performLaunchActivity—>Instrumentation.callActivityOnCreate—>Activity.performOnCreate—>Activity.onCreate
三.内置的系统应用开发
- 3.1.实现系统内置app的步骤(内置app的类型分类:带so与不带so文件)
- a.在package/apps/目录下创建相应的文件夹如:MyApp
- b.将apk文件和指定的mk文件,放入到MyApp文件夹下面
- c.指定的mk文件(不带so)的写法
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
$(warning "MyApp of LOCAL_PATH is $(LOCAL_PATH)")#打印输出
# Module name should match apk name to be installed
LOCAL_MODULE := MyApp#MyApp为目标应用的名字
LOCAL_MODULE_TAGS := optional
#不管是user 还是eng 版本都会编译此app
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := PRESIGNED
include $(BUILD_PREBUILT)
- d.带so文件的Android.mk文件(同时需要将Apk文件解压,将解压后的lib也放在Android.mk的同级目录位置),可参考-android系统添加内置APP(自带.so)
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
$(warning "MyApp of LOCAL_PATH is $(LOCAL_PATH)")
# Module name should match apk name to be installed
LOCAL_MODULE := MyApp_SO
LOCAL_MODULE_TAGS := optional
#不管是user 还是eng 版本都会编译此app
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_PREBUILT_JNI_LIBS := lib/x86_64/libnative-lib.so
#@lib/x86/libtest.so \ //注意前面要用tab键隔开
#@lib/x86/libtest2.so //这是你需要添加的so 如果是 armeabi-v7a 直接替换掉armeabi
LOCAL_CERTIFICATE := platform
#表示app已经签名
include $(BUILD_PREBUILT)
- 3.2.在build/make/target/product/core.mk加入该Module名字
- 进入到build目录下,通过grep命令(查看core.mk的位置):grep “Launcher2” ./ -rn
- 3.3.再进行整体的make既可以
四.参考资料
- Android系统开发实战-从入门到高薪
- 千里马Framework
评论区