知识点记录1

1.lockscreen(第一层锁屏界面)
1.1 已经属于phone statusbar的一部分,整个页面属于StatusBarWindowView(super_status_bar.xml)
1.2 常规锁屏即为滑动锁屏界面,一般滑动即可解锁,称之为notification keyguard;这个类型的keyguard已经和statusbar融为一体了,可以通过PhoneStatusBar.java的对象直接进行控制;

2. unlockscreen(第二层解锁界面)
2.1 也可称为 Bouncer安全锁屏;比如密码、图案、PIM码、PUK码等锁屏方式的锁屏界面,通过KeyguardBouncer.java来开始控制show()和hide();

3. 显示锁屏
StatusBarKeyguardViewManager.showBouncerOrKeyguard() keyguard 即 notification keyguard; bouncer 即 Bouncer安全锁屏;

4. StatusBarWindowManager.java负责所有的status bar窗口状态的逻辑管理

5. Launcher 文件夹加载显示图标是背景加图片绘制,见launcher3/FolderIcon.dispatchDraw();

6. Dialer 拨号盘里面输入*#*#xx#*#*问题
通过Dialer里SpecialCharSequenceMgr.handleSecretCode(),可调出一些测试页面在Settings里面,
如*#*#4636#*#*通过发送广播SECRET_CODE_ACTION,Settings TestingSettingsBroadcastReceiver 接收调用TestingSettingsActivity。

7. 亮屏过程中涉及到两条关键的线程,分别是PowerManager Notifier Thread 与DisplayManager Thread。
7.1 PowerManager Notifier Thread:power按键事件传到PowerManagerService.java中以后会分为两条线路进行事件处理,
一条就是我们上面流程图上标注的,这条Thread(Notifier.java)主要负责亮屏或者灭屏广播的发送,以及锁屏界面的加载。

7.2 DisplayManager Thread:这条Thread会传送到DisplayManagerService.java中去,会负责进行屏幕状态的设置以及屏幕的熄灭与点亮(真正的屏幕操作者),
此外跟屏幕相关的一些可见性操作都是这条Thread(DisplayPowerController.java)进行处理,例如屏幕亮度的变化、屏幕亮度的设置、屏幕的显示时机等

8. android build 编译 添加/去除一些特定模块
./build/core/main.mk:763: product_MODULES := $(filter-out $(product_SKIP_MODULES),$(product_MODULES))
./vendor/wb_custom/wb_config.mk:40:product_SKIP_MODULES += Contacts \
添加:在指定的项目下mk文件添加 PRODUCT_PACKAGES += Model(eg.FileManager),如device/公司名/项目名/项目名.mk 或任意继承(inherit-product)的*.mk(device.mk)
也可自建一个MK文件如 vendor/wb_custom/wb_config.mk,然后添加 -include vendor/wb_custom/wb_config.mk(-include:表示如果存在)
到任意继承(inherit-product)的*.mk(device.mk),如/device/mediatek/common/device.mk
去除:1.先在build/core/main.mk定义一个宏: product_MODULES := $(filter-out $(product_SKIP_MODULES),$(product_MODULES))
2. 重复添加的步骤,如去除 product_MODULES += Model(eg.FileManager)(多个需加反斜杠"\"), 如 product_SKIP_MODULES += Contacts \
FMRadio \

9. Andorid.mk 解析
LOCAL_PATH: 这个变量用于给出当前文件的路径。
必须在 Android.mk 的开头定义,可以这样使用:LOCAL_PATH := $(call my-dir)
如当前目录下有个文件夹名称 src,则可以这样写 $(call src),那么就会得到 src 目录的完整路径
这个变量不会被$(CLEAR_VARS)清除,因此每个 Android.mk 只需要定义一次(即使在一个文件中定义了几个模块的情况下)
LOCAL_MODULE 指定 拷贝后的apk的名字(全名),这个变量里可以有路径,但路径也会被拷贝,创建,如果 是在编译整个Android的源码,这个apk必须已经添加到了PRODUCT_PACKAGES 变量里,否则 不会拷贝到,相应的位置,
LOCAL_MODULE_PATH 指定拷贝的路径,如果路径不存在自己创建
LOCAL_SRC_FILES 指定 源apk
LOCAL_CERTIFICATE := PRESIGNED 表示 这个apk已经签过名了,系统不需要再次 签名;
LOCAL_MODULE_CLASS 指定文件类型,apk文件用APPS, 并且 会检查 是否是apk文件,动态库so文件用SHARED_LIBRARIES ,bin文件用EXECUTABLES,其他文件 用ETC
LOCAL_BUILT_MODULE_STEM 编译目标要生成的文件名,如果我们定义了 LOCAL_BUILT_STEM值就是


10 . 预装第三方APP(Android.mk)
###############################################################################
# MXPlayerCodec
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := MXPlayerCodec
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_TAGS := optional
LOCAL_BUILT_MODULE_STEM := package.apk
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
#LOCAL_PRIVILEGED_MODULE :=
LOCAL_CERTIFICATE := PRESIGNED
#LOCAL_OVERRIDES_PACKAGES :=
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
#LOCAL_REQUIRED_MODULES :=
#LOCAL_PREBUILT_JNI_LIBS := \
(如有依赖库, 可将APK里面的lib解压出来到和apk同级的目录,然后引用,eg. lib/x86/*.so \, 如SO库文件较多,可使用脚本
eg. JNI_LIBS :=
ifeq ($(LOCAL_MODULE_TARGET_ARCH), arm)
$(foreach FILE,$(shell find $(LOCAL_PATH)/lib/armeabi-v7a -name *.so), $(eval JNI_LIBS += $(FILE)))
else ifeq ($(LOCAL_MODULE_TARGET_ARCH), x86)
$(foreach FILE,$(shell find $(LOCAL_PATH)/lib/x86 -name *.so), $(eval JNI_LIBS += $(FILE)))
endif
LOCAL_PREBUILT_JNI_LIBS := $(subst $(LOCAL_PATH),,$(JNI_LIBS))
)
include $(BUILD_PREBUILT)


11. 设置一些系统设置的默认值在frameworks\base\packages\SettingsProvider\res\values\defaults.xml 或 frameworks/base/core/res/res/values/config.xml

12. 修改一些硬件(设备)相关的参数(eg. vibrator, hdmi, etc)可以去kernel-3.18/arch/arm/configs/项目名_defconfig 和 device/厂商名/产品名/ProjectConfig.mk 里去试试

posted @ 2017-07-31 09:12  Jokeyyu  阅读(272)  评论(0编辑  收藏  举报