- 浏览: 926228 次
- 性别:
- 来自: 上海
最新评论
-
liu149339750:
我勒个去,搜到你的博客了,关注!
Android make脚本简记 -
ihopethatwell:
楼主,这个修改时间有个问题,退出修改界面就不保存设置的时间了, ...
Android中如何修改系统时间(应用程序获得系统权限) -
flyar520:
你好...我也遇到屏幕半屏刷成黑屏的问题...但是我的时在开机 ...
Android横屏状态下返回到壁纸界面屏幕刷新问题 -
flyar520:
你好...我也遇到屏幕半屏刷成黑屏的问题...但是我的时在开机 ...
Android横屏状态下返回到壁纸界面屏幕刷新问题 -
taowayi:
推荐android一键反编译神器 apkdec
Android apk反编译
开机过程中无线模块的初始化过程;如果sim卡锁开启,或者pin被锁住的时候,会要求输入pin或者puk,但是这个解锁动作必须在系统初始化
完成以后才能进行。(图形系统都还没有初始化怎么输入密码阿?)当系统初始化完成以后会调用
wm.systemReady()来通知大家。这时候该做什么就做什么。
开机过程中无线模块的初始化过程:
rild 调用参考实现 Reference-ril.c (hardware\ril\reference-ril) 中的函数:
const RIL_RadioFunctions *RIL_Init(const struct RIL_Env *env, int argc, char **argv)
ret = pthread_create(&s_tid_mainloop, &attr, mainLoop, NULL);
static void *mainLoop(void *param)
ret = at_open(fd, onUnsolicited);
RIL_requestTimedCallback(initializeCallback, NULL, &TIMEVAL_0);
在 initializeCallback 函数中对猫进行了初始化。
static void initializeCallback(void *param)
{
ATResponse *p_response = NULL;
int err;
setRadioState (RADIO_STATE_OFF);
at_handshake();
/* note: we don't check errors here. Everything important will
be handled in onATTimeout and onATReaderClosed */
/* atchannel is tolerant of echo but it must */
/* have verbose result codes */
at_send_command("ATE0Q0V1", NULL);
/* No auto-answer */
at_send_command("ATS0=0", NULL);
/* Extended errors */
at_send_command("AT+CMEE=1", NULL);
/* Network registration events */
err = at_send_command("AT+CREG=2", &p_response);
/* some handsets -- in tethered mode -- don't support CREG=2 */
if (err < 0 || p_response->success == 0) {
at_send_command("AT+CREG=1", NULL);
}
at_response_free(p_response);
/* GPRS registration events */
at_send_command("AT+CGREG=1", NULL);
/* Call Waiting notifications */
at_send_command("AT+CCWA=1", NULL);
/* Alternating voice/data off */
at_send_command("AT+CMOD=0", NULL);
/* Not muted */
at_send_command("AT+CMUT=0", NULL);
/* +CSSU unsolicited supp service notifications */
at_send_command("AT+CSSN=0,1", NULL);
/* no connected line identification */
at_send_command("AT+COLP=0", NULL);
/* HEX character set */
at_send_command("AT+CSCS=\"HEX\"", NULL);
/* USSD unsolicited */
at_send_command("AT+CUSD=1", NULL);
/* Enable +CGEV GPRS event notifications, but don't buffer */
at_send_command("AT+CGEREP=1,0", NULL);
/* SMS PDU mode */
at_send_command("AT+CMGF=0", NULL);
#ifdef USE_TI_COMMANDS
at_send_command("AT%CPI=3", NULL);
/* TI specific -- notifications when SMS is ready (currently ignored) */
at_send_command("AT%CSTAT=1", NULL);
#endif /* USE_TI_COMMANDS */
/* assume radio is off on error */
if (isRadioOn() > 0) {
setRadioState (RADIO_STATE_SIM_NOT_READY);
}
}
默认状况下假设射频模块是好的,
通过 setRadioState (RADIO_STATE_SIM_NOT_READY) 来触发对无线模块的初始化。
通过 static void onRadioPowerOn() 对无线模块初始化。
首先通过 pollSIMState(NULL); 轮询 sim卡状态 。
static void pollSIMState (void *param)
{
ATResponse *p_response;
int ret;
if (sState != RADIO_STATE_SIM_NOT_READY) {
// no longer valid to poll
return;
}
switch(getSIMStatus()) {
case RIL_SIM_ABSENT:
case RIL_SIM_PIN:
case RIL_SIM_PUK:
case RIL_SIM_NETWORK_PERSONALIZATION:
default:
setRadioState(RADIO_STATE_SIM_LOCKED_OR_ABSENT);
return;
case RIL_SIM_NOT_READY:
RIL_requestTimedCallback (pollSIMState, NULL, &TIMEVAL_SIMPOLL);
return;
case RIL_SIM_READY:
setRadioState(RADIO_STATE_SIM_READY);
return;
}
}
读取sim卡状态的函数是:getSIMStatus()
err = at_send_command_singleline("AT+CPIN?", "+CPIN:", &p_response);
它向猫发送了at命令 AT+CPIN? 来查询无线模块的状态,如果无线模块还没有就绪,那么他隔1秒钟继续调用
sim卡状态轮询函数 pollSIMState,直到获得sim卡状态。
当sim卡状态为就绪,那么通过 setRadioState(RADIO_STATE_SIM_READY) 设置变量 sState 为:
RADIO_STATE_SIM_READY,这时候会调用函数 static void onSIMReady()来进一步初始化无线模块。
发送的at命令有:
at_send_command_singleline("AT+CSMS=1", "+CSMS:", NULL);
at_send_command("AT+CNMI=1,2,2,1,1", NULL);
如果sim卡锁开启,或者pin被锁住的时候,会要求输入pin或者puk,但是这个解锁动作必须在系统初始化完成以后才能
进行。(图形系统都还没有初始化怎么输入密码阿?)当系统初始化完成以后会调用 wm.systemReady()来通知大家。
这时候该做什么就做什么。
wm.systemReady()的调用会触发解锁界面。具体流程如下:
因为有: WindowManagerService wm = null;所以 wm.systemReady()
调用的是 WindowManagerService 中的函数:
public void systemReady() {
mPolicy.systemReady();
}
WindowManagerService 中有:
final WindowManagerPolicy mPolicy = PolicyManager.makeNewWindowManager();
PolicyManager.makeNewWindowManager 调用的是文件 PolicyManager.java 中的函数:
public static WindowManagerPolicy makeNewWindowManager() {
return sPolicy.makeNewWindowManager();
}
sPolicy.makeNewWindowManager 调用的是文件 Policy.java 中的函数:
public PhoneWindowManager makeNewWindowManager() {
return new PhoneWindowManager();
}
因为 PhoneWindowManager 继承自 WindowManagerPolicy
所以 mPolicy.systemReady() 最终调用的是文件 PhoneWindowManager.java 中的函数:
public void systemReady()
mKeyguardMediator.onSystemReady();
doKeyguard();
showLocked();
Message msg = mHandler.obtainMessage(SHOW);
mHandler.sendMessage(msg);
发送 SHOW 的消息。
文件 KeyguardViewMediator.java 中的消息处理函数:
public void handleMessage(Message msg) 对 SHOW 消息进行了处理。
如果 msg.what 等于 SHOW 那么执行:
handleShow();
private void handleShow()
...
mCallback.onKeyguardShow();
mKeyguardViewManager.show();
mShowing = true;
mKeyguardViewManager.show() 调用的是文件 KeyguardViewManager.java 中的函数:
public synchronized void show()
...
mKeyguardView = mKeyguardViewProperties.createKeyguardView(mContext, mUpdateMonitor, this);
...
mKeyguardViewProperties.createKeyguardView 调用的是文件 LockPatternKeyguardViewProperties.java
中的函数:
public KeyguardViewBase createKeyguardView(Context context,
KeyguardUpdateMonitor updateMonitor,
KeyguardWindowController controller) {
return new LockPatternKeyguardView(context, updateMonitor,
mLockPatternUtils, controller);
}
new LockPatternKeyguardView 调用了类 LockPatternKeyguardView 的构造函数:
public LockPatternKeyguardView(
Context context,
KeyguardUpdateMonitor updateMonitor,
LockPatternUtils lockPatternUtils,
KeyguardWindowController controller)
...
mLockScreen = createLockScreen();
addView(mLockScreen);
final UnlockMode unlockMode = getUnlockMode();
mUnlockScreen = createUnlockScreenFor(unlockMode);
mUnlockScreenMode = unlockMode;
addView(mUnlockScreen);
updateScreen(mMode);
执行上面的程序然后弹出解锁界面,getUnlockMode 获得锁类型,通常有三种:
enum UnlockMode {
Pattern, //图案锁
SimPin, //输入pin或者puk
Account //账号锁
}
通过上面的过程我们可以知道,在系统初始化阶段启动rild的时候,rild与猫进行了通信,并对猫进行初始化。
保存了网络的一系列状态。
=========
待机状态下,飞行模式切换流程分析:
飞行模式切换比较复杂,它状态改变时涉及到极大模块状态切换:
GSM模块,蓝牙模块,wifi模块。
飞行模式的enabler层会发送广播消息:ACTION_AIRPLANE_MODE_CHANGED
private void setAirplaneModeOn(boolean enabling) {
mCheckBoxPref.setEnabled(false);
mCheckBoxPref.setSummary(enabling ? R.string.airplane_mode_turning_on
: R.string.airplane_mode_turning_off);
// Change the system setting
Settings.System.putInt(mContext.getContentResolver(), Settings.System.AIRPLANE_MODE_ON,
enabling ? 1 : 0);
// Post the intent
Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
intent.putExtra("state", enabling);
mContext.sendBroadcast(intent);
}
因为GSM ,蓝牙,wifi模块分别注册了对 ACTION_AIRPLANE_MODE_CHANGED 消息的监测,所以收到
该消息后,模块会进行切换。
BluetoothDeviceService.java
开启蓝牙:enable(false);
关闭蓝牙:disable(false);
PhoneApp.java (packages\apps\phone\src\com\android\phone)
设置GSM模块状态 phone.setRadioPower(enabled);
WifiService.java
设置 wifi 状态 setWifiEnabledBlocking(wifiEnabled, false, Process.myUid());
===
GSM模块切换过程分析:
phone.setRadioPower(enabled)调用的是:
文件 GSMPhone.java 中的的函数:
public void setRadioPower(boolean power)
mSST.setRadioPower(power);
因为有 ServiceStateTracker mSST;
mSST.setRadioPower 调用的是文件 ServiceStateTracker.java 中的函数:
public void setRadioPower(boolean power)
mDesiredPowerState = power;
setPowerStateToDesired();
cm.setRadioPower(true, null);
或者
cm.setRadioPower(false, null);
因为有:
CommandsInterface cm;
public final class RIL extends BaseCommands implements CommandsInterface
所以 cm.setRadioPower 调用的是文件 RIL.java 中的函数:
public void setRadioPower(boolean on, Message result)
RILRequest rr = RILRequest.obtain(RIL_REQUEST_RADIO_POWER, result);
rr.mp.writeInt(1);
...
send(rr)
通过 send 向 rild 发送 RIL_REQUEST_RADIO_POWER 请求来开启或者关闭GSM模块。
rild 数据接收流程:
收到 RIL_REQUEST_RADIO_POWER 执行:
requestRadioPower(data, datalen, t);
然后根据条件往无线模块发送模块开启和关闭请求
主要的at命令有:
err = at_send_command("AT+CFUN=0", &p_response);
err = at_send_command("AT+CFUN=1", &p_response);
===
蓝牙模块切换过程分析:
enable(false);
蓝牙开启调用文件 BluetoothDeviceService.java 中的函数:
public synchronized boolean enable(boolean saveSetting)
setBluetoothState(BluetoothDevice.BLUETOOTH_STATE_TURNING_ON);
mEnableThread = new EnableThread(saveSetting);
mEnableThread.start();
----
disable(false)
蓝牙关闭调用文件 中的函数:
public synchronized boolean disable(boolean saveSetting)
setBluetoothState(BluetoothDevice.BLUETOOTH_STATE_TURNING_OFF);
===
wifi模块切换过程分析:
广播 wifi 状态改变的消息:WIFI_STATE_CHANGED_ACTION
setWifiEnabledState(enable ? WIFI_STATE_ENABLING : WIFI_STATE_DISABLING, uid);
更新 wifi 状态:
private void updateWifiState()
如果需要使能开启 wifi 那么会发送:
sendEnableMessage(true, false, mLastEnableUid);
sendStartMessage(strongestLockMode == WifiManager.WIFI_MODE_SCAN_ONLY);
mWifiHandler.sendEmptyMessage(MESSAGE_STOP_WIFI);
消息循环中处理命令消息:
public void handleMessage(Message msg)
如果使能wifi:setWifiEnabledBlocking(true, msg.arg1 == 1, msg.arg2);
开启wifi: mWifiStateTracker.setScanOnlyMode(msg.arg1 != 0);
setWifiEnabledBlocking(false, msg.arg1 == 1, msg.arg2);
断开 mWifiStateTracker.disconnectAndStop();
开启过程步骤:
1> 装载 wifi 驱动: WifiNative.loadDriver()
2> 启动后退 daemo supplicant: WifiNative.startSupplicant()
关闭过程步骤:
1> 停止后退 daemo supplicant:WifiNative.stopSupplicant()
2> 卸载 wifi 驱动: WifiNative.unloadDriver()
如果 wifi 状态默认为开启那么 WifiService 服务的构造函数:
WifiService(Context context, WifiStateTracker tracker)
boolean wifiEnabled = getPersistedWifiEnabled();
setWifiEnabledBlocking(wifiEnabled, false, Process.myUid());
会开启wifi模块。
发表评论
-
Android systrace
2018-09-12 11:13 1044Understanding Systrace Caution: ... -
Android simpleperf
2018-09-12 11:02 1966Introduction of simpleperf What ... -
Android selinux安全策略
2016-06-21 17:16 4119基础知识 SEAndroid在架构和机制上与SELinux完 ... -
Android wifi captive portal 验证
2016-02-23 20:38 5213只要是国内的用户,基本上刷完5.0版本后如果没挂上V P N, ... -
Android CTS windows环境下测试
2015-09-08 11:36 6465Windows下CTS测试步骤 1.获 ... -
Android 之 日期时间 时区同步
2015-05-13 15:47 6380系统设置--日期和时间-- ... -
虚拟按键 振动效果
2015-05-12 11:50 2133[DESCRIPTION] Setting->情景模式- ... -
Android 签名信息读取
2014-08-22 17:32 1388public void getSingInfo() { ... -
Android UiAutomator 自动化测试
2014-07-04 17:39 10028一、一个BUG引发的问题 ... -
Android 多语言 多地区对应表
2014-05-13 17:09 2155Arabic, Egypt (ar_EG) Arabic, ... -
Android emulated sdcard
2013-08-12 21:46 6176如果要添加 emulated sdcard ,需要一下几个 ... -
#if、#ifdef、#if defined之间的区别
2013-05-17 15:19 58482#if的使用说明 #if的后面接的是表达式 #if ( ... -
Android 动态库死机调试方法
2013-03-05 13:54 4884android系统中调试Java非常容易,一般遇到错误都在 ... -
Android sqlite3 详解
2012-09-13 22:13 2427SQLite库包含一个名字叫做sqlite3的命令行,它可以让 ... -
Android 多语言开发
2012-08-16 18:37 2420第一部分 多语言定制的机制 1、ICU4C简介 ICU4 ... -
Android 添加底层核心服务
2012-06-04 10:52 5830为 Android添加底层核 ... -
Android 之响应的系统设置的事件
2012-05-24 18:17 19841、Configuration类专门用于描述手机设备上的配置信 ... -
Android CRT Screen 电视效果
2012-05-17 11:12 2326Android 2.3 对关屏进行了优化,增加了一种类似于 ... -
android编译dex-preopt
2012-05-11 18:48 5454对于android2.3编译时候选择下面的情况,既可以对dex ... -
Android 移动终端camera 防偷*拍设置
2012-04-26 10:35 1902目前市面上的所有移动终端几乎都有camera应用,但andro ...
相关推荐
以下是对如何在Delphi中创建Android开机启动代码的详细讲解。 首先,了解基本概念: 1. **Delphi**:Embarcadero Delphi 是一个集成开发环境(IDE),主要用于编写Windows和移动平台的应用程序,支持Object Pascal...
在Android系统中,开机启动程序源码涉及到一系列复杂的流程和技术,包括系统初始化、服务启动、广播接收器等。本文将深入解析Android系统如何在开机时启动应用程序,并介绍相关的知识点。 一、系统启动流程 1. **...
通过对Android开机启动模式的源码分析,我们深入了解了不同启动场景下的工作原理和技术细节。无论是低电量启动还是USB插入启动,都体现了Android系统在用户体验和资源管理方面的精心设计。希望本文能够帮助开发者更...
Android 11.0 开机启动流程介绍 本文档对 Android 11.0 平台开机启动流程进行了详细的介绍,涵盖了 Android 架构图、系统启动流程、init 启动流程、Zygote 启动流程、System Server 启动流程等关键部分。 Android ...
本文将深入解析Android开机启动的源代码,帮助读者理解这一过程的关键环节。 首先,Android系统的启动始于硬件层面的Bootloader。Bootloader是设备上电后执行的第一段程序,它负责加载kernel(内核)到内存中并启动...
2. 在`onReceive`方法中,判断接收到的Intent的`ACTION`是否为`ACTION_BOOT_COMPLETED`,如果是,则执行相应的启动代码。 三、注册广播接收器 1. 静态注册:在AndroidManifest.xml中添加`<receiver>`标签,声明`...
下面将详细讨论Android开机自启动的相关知识点。 1. **BroadcastReceiver**: 开机自启动的核心是`BroadcastReceiver`,这是一个可以监听系统广播事件的组件。Android系统在启动完成后会发送一个ACTION_BOOT_...
至于“开机启动应用”,Android系统会在启动过程中自动启动设置为开机启动的应用。开发者可以在应用的`AndroidManifest.xml`中为服务或接收器添加`android:enabled="true"`和`android:exported="true"`属性,并在`...
### Android开机启动流程详解 #### 一、概述 在探讨Android设备如何启动并准备好供用户使用的整个过程之前,我们先来简要回顾一下Android启动的基本流程。这一过程大致可以分为以下四个主要阶段: 1. **init进程...
以上就是使用Delphi XE6为Android创建开机启动应用的基本步骤。通过理解Broadcast Receiver的工作原理和AndroidManifest.xml的配置,你可以实现更多类似的自定义行为。在实际开发中,还需要考虑不同Android版本的...
下面将详细讲解Android开机自启动的工作原理、实现方法以及相关注意事项。 一、开机自启动的工作原理 Android系统在启动过程中会发送一系列系统级广播,其中就包括ACTION_BOOT_COMPLETED广播。当这个广播发出时,...
以下是对如何实现Android开机启动Service的详细解释: 1. **BroadcastReceiver**: 在Android中,`BroadcastReceiver`是监听系统广播事件的关键组件。当设备启动完成时,系统会发送一个名为`ACTION_BOOT_COMPLETED...
在Android系统中,实现开机启动服务或应用是一个常见的需求,特别是在开发系统级或者需要后台持续运行的功能时。这个"android 开机启动DEMO"旨在帮助开发者解决如何在Android设备开机时自动启动应用程序的问题。让...
标题中的"Delphi EX10 Android 实现开机自启动"是指使用Embarcadero Delphi XE10(也称为 RAD Studio XE10)开发的Android应用程序,目的是使其能够在设备启动时自动运行。这个过程涉及到Android系统的权限管理和...
这里我们将深入探讨如何实现Android开机启动服务以及后台录音功能。 首先,要创建一个开机启动服务,我们需要在`AndroidManifest.xml`文件中注册一个BroadcastReceiver,这个BroadcastReceiver会在系统发送`BOOT_...
在Android系统中,Service是一种可以在后台长时间运行的组件,它不提供...以上就是关于Android开机自启动Service的实现细节,理解并掌握这些知识点对于开发者来说至关重要,特别是在设计需要在后台持续运行的应用时。
在Android中,开机启动应用主要依赖于BroadcastReceiver,这是一个特殊的组件,能够监听系统或自定义的广播事件。当设备开机完成并启动到用户界面时,系统会发出ACTION_BOOT_COMPLETED广播。我们需要创建一个...
android开机自动运行APP实现方式其实很简单。在android系统运行时,会发出“android.intent.action.BOOT_COMPLETED”这个系统广播,因此我们监听它,并进行打开APP的操作即可。现在大多数的android手机系统都默认...