page.title=Project Roles
@jd:body

<!--
    Copyright 2013 The Android Open Source Project

    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at

        http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
-->
<div id="qv-wrapper">
  <div id="qv">
    <h2>In this document</h2>
    <ol id="auto-toc">
    </ol>
  </div>
</div>
<p>The Android Open Source Project (AOSP) includes individuals working in a variety
of roles. Google is responsible for Android product management
and the engineering process for the core framework and platform; however,
the project considers contributions from any source, not just Google. This
page describes the kinds of roles that interested parties can take on.</p>
<p>Anyone who is interested in exploring and contributing to Android can use the
Android Open Source Project resources. Anyone can join the mailing lists, ask
questions, contribute patches, report bugs, look at submitted patches, and use
the tools. To get started with the Android code, see <a href="{@docRoot}source/contributing.html">Contributing</a>.</p>
<h2 id="contributor">Contributor</h2>
<p>"Contributors" are those making contributions to the AOSP source code,
including both employees of Google or other companies, as well as individual
developers who are contributing to Android on their own behalf. There is no
distinction between contributors who are employed by Google and those who are
not; all engineers use the same tools (git, repo, and gerrit),
follow the same code review process, and are subject
to the same requirements on code style and so on.</p>
<h2 id="developer">Developer</h2>
<p>"Developers" are engineers writing applications that run on Android
devices. There is often little difference in skillset between a developer
and a contributor. But AOSP uses "developer" to distinguish between
engineers using the platform and those contributing to it. Developers
(along with users) are the "customers" of the platform the contributors
create. As such, we talk about developers a lot, though this isn't technically
a separate role in the AOSP per se.</p>
<h2 id="verifier">Verifier</h2>
<p>"Verifiers" are responsible for testing change requests. After individuals
have submitted a significant amount of high-quality code to the project, the
project leads might invite them to become verifiers.</p>
<p class="note"><strong>Note:</strong> At this time, verifiers act similarly to approvers.</p>
<h2 id="approver">Approver</h2>
<p>"Approvers" are experienced members of the project who have demonstrated their
design skills and have made significant technical contributions to the
project. In the code-review process, an approver decides whether to include or
exclude a change. Project leads (who are typically employed by Google) choose
the approvers, sometimes promoting to this position verifiers who have
demonstrated their expertise within a specific project.</p>
<h2 id="project-leads">Project Lead</h2>
<p>Android consists of a number of sub-projects; you can see these in the git
repository as individual .git files. "Project leads" are senior contributors who
oversee the engineering for individual Android projects. Typically these project
leads are Google employees. A project lead for an individual project is
responsible for the following:</p>
<ul>
<li>
<p>Lead all technical aspects of the project, including the project roadmap,
  development, release cycles, versioning, and quality assurance (QA).</p>
</li>
<li>
<p>Ensure the project is tested by QA in time for scheduled Android platform
  releases.</p>
</li>
<li>
<p>Designate Verifiers and Approvers for submitted patches.</p>
</li>
<li>
<p>Be fair and unbiased while reviewing changes. Accept or reject patches
  based on technical merit and alignment with the Android strategy.</p>
</li>
<li>
<p>Review changes in a timely manner and make best efforts to communicate
  when changes are not accepted.</p>
</li>
<li>
<p>Optionally maintain a web site for the project for information and
  documents specific to the project.</p>
</li>
<li>
<p>Act as a facilitator in resolving technical conflicts.</p>
</li>
<li>
<p>Be a public face for the project and the go-to person for questions
  related to the project.</p>
</li>
</ul>
