侧边栏壁纸
博主头像
慢行的骑兵博主等级

贪多嚼不烂,欲速则不达

  • 累计撰写 29 篇文章
  • 累计创建 27 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

Android FrameWork探索之旅(一)

慢行的骑兵
2024-04-25 / 0 评论 / 0 点赞 / 750 阅读 / 1,620 字

一.环境搭建

1.问题处理

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.安装应用桌面图标

4.效果查看

Android源码环境搭建

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)

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既可以

四.参考资料

0

评论区