Android FrameWork探索之旅(一)

一.环境搭建

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.效果查看

在这里插入图片描述

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文件的mk文件
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既可以

四.参考资料

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值