blob: eb510dd90f06ae87af5283529fae213b5ab9dd6a [file] [log] [blame]
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
<title>Android - Porting Guide</title>
<script src="http://www.google.com/uds/api?file=uds.js&amp;v=1.0&amp;key=internal-codesite" type="text/javascript"></script>
<script src="http://code.google.com/js/jquery.js" type="text/javascript"></script>
<script type="text/javascript">var _tocPath_ = 'http://code.google.com/android/_toc.ezt';</script>
<script src="http://code.google.com/js/codesite.pack.01312008.js" type="text/javascript"></script>
<script language="JavaScript">
function resizeHeight() {
if(document.getElementById && !(document.all)) {
height= document.getElementById('doxygen').contentDocument.body.scrollHeight + 20;
document.getElementById('doxygen').style.height = height;
}
else if(document.all) {
height= document.frames('doxygen').document.body.scrollHeight + 20;
document.all.doxygen.style.height = height;
}
}
</script>
<link href="http://code.google.com/css/codesite.pack.01312008.css" type="text/css" rel="stylesheet">
</link>
<!--[if IE]><link rel="stylesheet" type="text/css" href="/css/iehacks.css" /><![endif]-->
<script src="http://code.google.com/android/assets/search_autocomplete.js"></script>
<link rel="stylesheet" type="text/css" href="http://code.google.com/css/semantic_headers.css" />
<link rel="stylesheet" type="text/css" href="http://code.google.com/android/assets/style.css" />
<script>
jQuery(document).ready(function() {
jQuery("pre").addClass("prettyprint");
});
</script>
<style type="text/css">
<!--
h1,h2,h3 {
color: #000000;
}
-->
</style>
</head>
<body class="gc-documentation">
<div id="gc-container">
<a name="top"></a>
<div id="skipto"> </div>
<div id="langpref">
<!--<a class="dropdown" href="/">English</a> <span>|</span> <a href="/more/">Site Directory</a> -->
</div>
<div id="gc-header">
<div id="logo"><a href="http://code.google.com/android/index.html"><img src="http://code.google.com/android/images/logo_android.gif" alt="Android"/></a></div>
<div id="search" style="inline">
<div id="searchForm" class="searchForm" style="height: 44px;">
<!--previously form was here-->
</div>
<!-- end searchForm -->
<noscript>
<style type="text/css">
.searchForm {
display : none !important;
}
.searchForm2 {
display : inline !important;
}
</style>
</noscript>
<div id="searchForm2" class="searchForm2" style="display:none">
<form id="searchbox_001456098540849067467:6whlsytkdqg" action="http://www.google.com/cse">
<input type="hidden" name="cx" value="001456098540849067467:6whlsytkdqg" />
<input type="hidden" name="cof" value="FORID:0" />
<input type="text" name="q" maxlength="2048" size="41" autocomplete="off" title="Google Code Search"/>
<input type="submit" name="sa" value="Search" title="Search"/>
<br/>
<div class="greytext">e.g. "ajax apis" or "open source"</div>
</form>
</div>
<!-- end searchForm2 -->
</div>
<!-- end search -->
</div>
<!-- end gc-header -->
<div id="searchControl" class="search-control"></div>
<!--[if IE]><iframe id="backiFrame" name="backiFrame" src='/dummy.html' style="display:none"></iframe><![endif]-->
<div id="codesiteContent">
<a name="gc-topnav-anchor"></a>
<div id="gc-topnav">
<h1>Android Platform Development Kit</h1>
<ul class="gc-topnav-tabs">
<li id="sdk_link"> <a href="http://code.google.com/android/index.html" title="Android Software Development Kit">SDK</a> </li>
<li id="docs_link"> <a href="index.html" title="Official Android documentation">Docs</a> </li>
<li id="faq_link"> <a href="http://code.google.com/android/kb/index.html" title="Answers to frequently asked questions about Android">FAQ</a> </li>
<li> <a href="http://android-developers.blogspot.com/" title="Official Android blog">Blog</a> </li>
<li> <a href="http://code.google.com/android/groups.html" title="Android developer forum">Group</a> </li>
<li> <a href="http://code.google.com/android/terms.html" title="Android terms of service">Terms</a> </li>
<li> <a href="mailto:android-pdk-feedback@google.com?subject=PDK%20Feedback&body=(filed%20from:%20power_management.html%20v0.6%20-%2025%20November%202008)%0D%0A%0D%0ASUMMARY:%0D%0A%0D%0A%0D%0A%0D%0ASTEPS%20TO%20REPRODUCE:%0D%0A%0D%0A%0D%0A%0D%0AADDITIONAL%20NOTES:">Report a Problem</a> </li>
</ul>
</div>
<!-- end gc-topnav -->
<div class="g-section g-tpl-180">
<a name="gc-toc"></a>
<div class="g-unit g-first" id="gc-toc">
<ul>
<li>
<h1><a href="index.html">Documentation</a></h1>
<ul>
<li> <strong>Introduction</strong>
<ul>
<li><a href="system_requirements.html">Device Requirements</a></li>
</ul>
</li>
<li> <strong>Dev Environment Setup</strong>
<ul>
<li><a href="build_system.html">Build System</a></li>
</ul>
</li>
<li> <strong>Basic Bring up</strong>
<ul>
<li><a href="build_new_device.html">Building New Device</a></li>
<li><a href="bring_up.html">Bring up</a></li>
<li><a href="keymaps_keyboard_input.html">Keymaps and Keyboard</a></li>
<li><a href="display_drivers.html">Display Drivers</a></li>
</ul>
</li>
<li> <strong>Multimedia</strong>
<ul>
<li><a href="audio_sub_system.html">Audio</a></li>
<li><a href="camera.html">Camera</a></li>
</ul>
</li>
<li> <strong>Power Management</strong>
<ul>
<li><a href="power_management.html">Power Management</a></li>
</ul>
</li>
<li> <strong>Networking</strong>
<ul>
<li><a href="wifi.html">Wi-Fi</a></li>
<li><a href="gps.html">GPS</a></li>
<li><a href="bluetooth.html">Bluetooth</a></li>
</ul>
</li>
<li> <strong>Telephony</strong>
<ul>
<li><a href="telephony.html">Radio Interface Layer</a></li>
</ul>
</li>
<li> <strong>Testing</strong>
<ul>
<li><a href="instrumentation_testing.html">Instrumentation Testing</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
<a name="gc-pagecontent"></a>
<div class="g-unit" id="gc-pagecontent">
<div id="jd-content">
<div class="jd-descr">
<a name="androidPowerTitle"></a><h1>Power Management</h1>
<a name="toc"/>
<div style="padding:10px">
<a href="#androidPowerIntro">Introduction</a><br/>
<a href="#androidPowerWakeLocks">Wake Locks</a><br/><div style="padding-left:40px">
<a href="#androidPowerWakeLocksDefinitions">Types of Wake Locks</a><br/>
<a href="#androidPowerWakeLockExample">Exploring a Wake Lock Example</a><br/></div>
<a href="#androidPowerPowerManagerClass">PowerManager class</a><br/>
<a href="#androidPowerKernelRegistration">Registering Drivers with the PM Driver</a><br/></div></font></div>
<a name="androidPowerIntro"></a><h2>Introduction</h2>
<p>Android supports its own Power Management (on top of the standard Linux Power Management) designed with the premise that the CPU shouldn't consume power if no applications or services require power. For more information regarding standard Linux power management, please see <a href="http://git.kernel.org/?p=linux/kernel/git/stable/linux-2.6.24.y.git;a=blob;f=Documentation/pm.txt">Linux Power Management Support</a> at <a href="http://kernel.org">http://kernel.org</a>.</p>
<p>Android requires that applications and services request CPU resources with &quot;wake locks&quot; through the Android application framework and native Linux libraries. If there are no active wake locks, Android will shut down the CPU. </p>
<p>The image below illustrates the Android power management architecture. </p>
<p><img src='androidPMArchitecture.gif'></p>
Solid elements represent Android blocks and dashed elements represent partner-specific blocks.
<a name="androidPowerWakeLocks"></a><h2>Wake Locks</h2>
<p>Wake locks are used by applications and services to request CPU resources.</p>
<a name="androidPowerWakeLocksDefinitions"></a><h3>Types of Wake Locks</h3>
<table border=1 cellpadding=2 cellspacing=0>
<tbody><tr>
<th scope="col">Wake Lock </th>
<th scope="col">Description</th>
</tr>
<tr>
<td>ACQUIRE_CAUSES_WAKEUP<br/></td>
<td>Normally wake locks don't actually wake the device, they just cause it to remain on once it's already on. Think of the video player app as the normal behavior. Notifications that pop up and want the device to be on are the exception; use this flag to be like them.</td>
</tr>
<tr>
<td>FULL_WAKE_LOCK</td>
<td>Wake lock that ensures that the screen and keyboard are on at full brightness. </td>
</tr>
<tr>
<td>ON_AFTER_RELEASE</td>
<td>When this wake lock is released, poke the user activity timer so the screen stays on for a little longer.</td>
</tr>
<tr>
<td>PARTIAL_WAKE_LOCK</td>
<td>Wake lock that ensures that the CPU is running. The screen might not be on.</td>
</tr>
<tr>
<td>SCREEN_BRIGHT_WAKE_LOCK</td>
<td>Wake lock that ensures that the screen is on at full brightness; the keyboard backlight will be allowed to go off.</td>
</tr>
<tr>
<td>SCREEN_DIM_WAKE_LOCK</td>
<td>Wake lock that ensures that the screen is on, but the keyboard backlight will be allowed to go off, and the screen backlight will be allowed to go dim.</td>
</tr>
</table>
<a name="androidPowerWakeLockExample"></a><h3>Exploring a Wake Lock Example</h3>
<p>All power management calls follow the same basic format:</p>
<p><ol><li>Acquire handle to the <code>PowerManager</code> service.</li>
<li>Create a wake lock and specify the power management flags for screen, timeout, etc.</li>
<li>Acquire wake lock.</li>
<li>Perform operation (play MP3, open HTML page, etc.).</li>
<li>Release wake lock.</li>
</ol>
</p>
<p>The snippet below illustrates this process.</p>
<pre class="prettify">
PowerManager pm = (PowerManager)mContext.getSystemService(
Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(
PowerManager.SCREEN_DIM_WAKE_LOCK
| PowerManager.ON_AFTER_RELEASE,
TAG);
wl.acquire();
// ...
wl.release();
</pre>
<a name="androidPowerPowerManagerClass"></a><h2>PowerManager class</h2>
<p>The Android Framework exposes power management to services and applications through the <code>PowerManager</code> class.</p>
<p>User space native libraries (any hardware function in <code>//device/lib/hardware/</code> meant to serve as supporting libraries for Android runtime) should never call into Android Power Management directly (see the image above). Bypassing the power management policy in the Android runtime will destabilize the system.</p>
<p>All calls into Power Management should go through the Android runtime PowerManager APIs.</p>
<p> Please visit
<a href="http://code.google.com/android/reference/android/os/PowerManager.html">http://code.google.com/android/reference/android/os/PowerManager.html</a> for a description of the API and examples.</p>
<a name="androidPowerKernelRegistration"></a><h2>Registering Drivers with the PM Driver</h2>
<p>You can register Kernel-level drivers with the Android Power Manager driver so that they're notified immediately before power down or after power up. For example, you might set a display driver to completely power down when a request comes in to power down from the user space (see the Android MSM MDDI display driver for a sample implementation).</p>
<p>To register drivers with the Android PM driver, implement call-back handlers and register them with the Android PM, as illustrated in the snippet below:</p>
<pre class="prettify">
android_register_early_suspend(android_early_suspend_t *handler)
android_register_early_resume(android_early_resume_t *handler)
</pre>
<p>It is critical in a drive to return immediately and not wait for anything to happen in the call back.</p>
<p><span class="lh2"><a name="androidFooter"></a></span>
</div>
</div>
<!-- end gc-pagecontent -->
</div>
<!-- end gooey wrapper -->
</div>
<!-- end codesearchresults -->
<div id="gc-footer" dir="ltr">
<div class="text"> &copy;2008 Google<!-- - <a href="/">Code Home</a> - <a href="http://www.google.com/accounts/TOS">Site Terms of Service</a> - <a href="http://www.google.com/privacy.html">Privacy Policy</a> - <a href="/more">Site Directory</a> --></div>
</div>
<!-- end gc-footer -->
</div>
<!-- end gc-containter -->
<script src="http://www.google-analytics.com/ga.js" type="text/javascript">
</script>
<script type="text/javascript">
try {
var pageTracker = _gat._getTracker("UA-18071-1");
pageTracker._setAllowAnchor(true);
pageTracker._initData();
pageTracker._trackPageview();
} catch(e) {}
</script>
<div id="jd-build-id"> v0.6 - 25 November 2008</div>
</div></div></div></body>
</html>