diff --git a/docs/html/guide/basics/appmodel.jd b/docs/html/guide/basics/appmodel.jd deleted file mode 100644 index 323fc9b3aa914..0000000000000 --- a/docs/html/guide/basics/appmodel.jd +++ /dev/null @@ -1,261 +0,0 @@ -page.title=Application Model -@jd:body -
In most operating systems, there is a strong 1-to-1 correlation between -the executable image (such as the .exe on Windows) that an application lives in, -the process it runs in, and the icon and application the user interacts with. -In Android these associations are much more fluid, and it is important to -understand how the various pieces can be put together.
- -Because of the flexible nature of Android applications, there is some -basic terminology that needs to be understood when implementing the -various pieces of an application:
- -An android package (or .apk for short) -is the file containing an application's code and its resources. This is the -file that an application is distributed in and downloaded by the user when -installing that application on their device.
A task is generally what the user perceives as -an "application" that can be launched: usually a task has an icon in the -home screen through which it is accessed, and it is available as a top-level -item that can be brought to the foreground in front of other -tasks.
A process is a low-level kernel process in which -an application's code is running. Normally all of the code in a -.apk is run in one, dedicated process for that .apk; however, the -{@link android.R.styleable#AndroidManifestApplication_process process} tag -can be used to modify where that code is run, either for -{@link android.R.styleable#AndroidManifestApplication the entire .apk} -or for individual -{@link android.R.styleable#AndroidManifestActivity activity}, -{@link android.R.styleable#AndroidManifestReceiver receiver}, -{@link android.R.styleable#AndroidManifestService service}, or -{@link android.R.styleable#AndroidManifestProvider provider}, components.
A key point here is: when the user sees as an "application," what
-they are actually dealing with is a task. If you just create a .apk
-with a number of activities, one of which is a top-level entry point (via
-an {@link android.R.styleable#AndroidManifestIntentFilter intent-filter} for
-the action android.intent.action.MAIN and
-category android.intent.category.LAUNCHER), then there will indeed
-be one task created for your .apk, and any activities you start from there
-will also run as part of that task.
A task, then, from the user's perspective your application; and from the -application developer's perspective it is one or more activities the user -has traversed through in that task and not yet closed, or an activity stack. -A new task is created by -starting an activity Intent with the {@link android.content.Intent#FLAG_ACTIVITY_NEW_TASK -Intent.FLAG_ACTIVITY_NEW_TASK} flag; this Intent will be used as the root Intent of -the task, defining what task it is. Any activity started without this flag -will run in the same task as the activity that is starting it (unless that -activity has requested a special launch mode, as discussed later). Tasks can -be re-ordered: if you use FLAG_ACTIVITY_NEW_TASK but there is already a task -running for that Intent, the current task's activity stack will be brought -to the foreground instead of starting a new task.
- -FLAG_ACTIVITY_NEW_TASK must only be used with care: using it says that, -from the user's perspective, a new application starts at this point. If this -is not the behavior you desire, you should not be creating a new task. In -addition, you should only use the new task flag if it is possible for the user -to navigate from home back to where they are and launch the same Intent as a -new task. Otherwise, if the user presses HOME instead of BACK from the task -you have launched, your task and its activities will be ordered behind the -home screen without a way to return to them.
- -In some cases Android needs to know which task an activity belongs to even when -it is not being launched in to a specific task. This is accomplished through -task affinities, which provide a unique static name for the task that one or more -activities are intended to run in. The default task affinity for an activity -is the name of the .apk package name the activity is implemented in. This -provides the normally expected behavior, where all of the activities in a -particular .apk are part of a single application to the user.
- -When starting a new activity without the -{@link android.content.Intent#FLAG_ACTIVITY_NEW_TASK -Intent.FLAG_ACTIVITY_NEW_TASK} flag, task affinities have no impact on the -task the new activity will run in: it will always run in the task of the -activity that is starting it. However, if the NEW_TASK flag is being used, -then the affinity will be used to determine if a task already exists with -the same affinity. If so, that task will be brought to the front and the -new activity launched at the top of that task.
- -This behavior is most useful for situations where you must use the -NEW_TASK flag, in particular launching activities from status bar notifications -or home screen shortcuts. The result is that, when the user launches your -application this way, its current task state will be brought to the foreground, -and the activity they now want to look at placed on top of it.
- -You can assign your own task affinities in your manifest's -{@link android.R.styleable#AndroidManifestApplication application} tag for -all activities in the .apk, or the -{@link android.R.styleable#AndroidManifestActivity activity} tag of -individual activities. Some examples of how this can be used are:
- -The main way you control how activities interact with tasks is through -the activity's -{@link android.R.styleable#AndroidManifestActivity_launchMode launchMode} -attribute and the {@link android.content.Intent#setFlags flags} associated -with an Intent. These two parameters can work together in various ways -to control the outcome of the activity launch, as described in their -associated documentation. Here we will look at some common use cases and -combinations of these parameters.
- -The most common launch mode you will use (besides the default
-standard mode) is singleTop. This does not have
-an impact on tasks; it just avoids starting the same activity multiple times
-on the top of a stack.
-
-
The singleTask launch mode has a major
-impact on tasks: it causes the activity to always be started in
-a new task (or its existing task to be brought to the foreground). Using
-this mode requires a lot of care in how you interact with the rest of the
-system, as it impacts every path in to the activity. It should only be used
-with activities that are front doors to the application (that is, which
-support the MAIN action and LAUNCHER category).
The singleInstance launch mode is even more specialized, and
-should only be used in applications that are implemented entirely as one
-activity.
A situation you will often run in to is when another entity (such as the -{@link android.app.SearchManager} or {@link android.app.NotificationManager}) -starts one of your activities. In this case, the -{@link android.content.Intent#FLAG_ACTIVITY_NEW_TASK -Intent.FLAG_ACTIVITY_NEW_TASK} flag must be used, because the activity is -being started outside of a task (and the application/task may not even -exist). As described previously, the standard behavior in this situation -is to bring to the foreground the current task matching the new activity's -affinity and start the new activity at the top of it. There are, however, -other types of behavior that you can implement.
- -One common approach is to also use the
-{@link android.content.Intent#FLAG_ACTIVITY_CLEAR_TOP
-Intent.FLAG_ACTIVITY_CLEAR_TOP} flag in conjunction with NEW_TASK. By doing so,
-if your task is already running, then it will be brought to the foreground,
-all of the activities on its stack cleared except the root activity, and the
-root activity's {@link android.app.Activity#onNewIntent} called with the
-Intent being started. Note that the activity often also use the singleTop
-or singleTask launch mode when using this approach, so that
-the current instance is given the new intent instead of requiring that it
-be destroyed and a new instance started.
Another approach you can take is to set the notification activity's
-android:taskAffinity to the empty string "" (indicating no affinity)
-and setting the
-{@link android.R.styleable#AndroidManifestActivity_noHistory
-android:noHistory} and
-{@link android.R.styleable#AndroidManifestActivity_excludeFromRecents
-android:excludeFromRecents} attributes.
-This approach is useful if you would like the notification
-to take the user to a separate activity describing it, rather than return
-to the application's task. By specifying these attributes, the activity will
-be finished whether the user leaves it with BACK or HOME and it will not
-show up in the recent tasks list; if the noHistory attribute
-isn't specified, pressing HOME will result in the activity and its task
-remaining in the system, possibly with no way to return to it.
Be sure to read the documentation on the -{@link android.R.styleable#AndroidManifestActivity_launchMode launchMode attribute} -and the {@link android.content.Intent#setFlags Intent flags} for the details -on these options.
- -In Android, processes are entirely an implementation detail of applications -and not something the user is normally aware of. Their main uses are simply:
- -As described previously, the -{@link android.R.styleable#AndroidManifestApplication_process process} attribute -is used to control the process that particular application components run in. -Note that this attribute can not be used to violate security of the system: if -two .apks that are not sharing the same user ID try to run in the same process, -this will not be allowed and different distinct processes will be created for -each of them.
- -See the security document for -more information on these security restrictions.
- -Every process has one or more threads running in it. In most situations, Android -avoids creating additional threads in a process, keeping an application -single-threaded unless it creates its own threads. An important repercussion -of this is that all calls to {@link android.app.Activity}, -{@link android.content.BroadcastReceiver}, and {@link android.app.Service} -instances are made only from the main thread of the process they are running in.
- -Note that a new thread is not created for each -Activity, BroadcastReceiver, Service, or ContentProvider instance: -these application components are instantiated in the desired process (all in the -same process unless otherwise specified), in the main thread of that process. -This means that none of these components (including services) should perform -long or blocking operations (such as networking calls or computation loops) -when called by the system, since this will block -all other components in the process. You can use the standard library -{@link java.lang.Thread} class or Android's {@link android.os.HandlerThread} -convenience class to perform long operations on another thread.
- -There are a few important exceptions to this threading rule:
- -Calls on to an {@link android.os.IBinder} or interface implemented on -an IBinder are dispatched from the thread calling them or a thread pool in the -local process if coming from another process, not -from the main thread of their process. In particular, calls on to the IBinder -of a {@link android.app.Service} will be called this way. (Though -calls to methods on Service itself are done from the main thread.) -This means that implementations of IBinder interfaces must always be -written in a thread-safe way, since they can be called from any number of -arbitrary threads at the same time.
Calls to the main methods of {@link android.content.ContentProvider} -are dispatched from the calling thread or main thread as with IBinder. The -specific methods are documented in the ContentProvider class. -This means that implementations of these methods must always be -written in a thread-safe way, since they can be called from any number of -arbitrary threads at the same time.
Calls on {@link android.view.View} and its subclasses are made from the -thread that the view's window is running in. Normally this will be the main -thread of the process, however if you create a thread and show a window from -there then the window's view hierarchy will be called from that thread.
You can think of an Android application as a collection of components, of -various kinds. These components are for the most part quite loosely coupled, -to the degree where you can accurately describe them as a federation of -components rather than a single cohesive application.
- -Generally, these components all run in the same system process. It's -possible (and quite common) to create multiple threads within that process, -and it's also possible to create completely separate child processes if you -need to. Such cases are pretty uncommon though, because Android tries very -hard to make processes transparent to your code.
- -These are the most important parts of the Android APIs:
- -To get started with Android, please read the following sections first:
-After reading the sections above, the following Getting Started information is also very useful:
- - -These are the basic packages that make up the Android SDK for writing -applications. The packages are organized as layers, listed here from -lowest-level to highest.
- -These packages provide additional domain-specific features of the Android -platform. They are not necessary for basic application development.
- -Blog Articles
- -
- Accessibility: Are You Serving All Your Users?
-In the upcoming weeks, some of the older Client Login authentication keys will expire. - If you generated the token you’re currently using to authenticate with the C2DM servers before October 2011, it will stop working.
- -Android C2DM — Client Login key expiration
-Accessibility is about making sure that Android users who have limited vision or other physical impairments can use your application just as well
- -A Faster Emulator with Better Hardware Support
-The Android emulator is a key tool for Android developers in building and testing their apps. - As the power and diversity of Android devices has grown quickly, it’s been hard for the emulator keep pace.
- - More » -Training
- -
- Managing the Activity Lifecycle
-This class explains important lifecycle callback methods that each Activity - instance receives and how you can use them so your activity does what the user expects and does not consume system - resources when your activity doesn't need them.
- - -This class teaches you how to use basic platform features that leverage alternative - resources and other features so your app can provide an optimized user experience on a variety of Android-compatible devices, - using a single application package (APK).
- - -This class covers some common ways you can send and receive content between - applications using Intent APIs and the ActionProvider object.
- - More » -Android was designed so that most developers will be able to build -applications using the default settings and not be confronted with difficult -decisions about security. Android also has a number of security features built -into the operating system that significantly reduce the frequency and impact of -application security issues.
- -Some of the security features that help developers build secure applications -include: -
Nevertheless, it is important for developers to be familiar with Android -security best practices to make sure they take advantage of these capabilities -and to reduce the likelihood of inadvertently introducing security issues that -can affect their applications.
- -This document is organized around common APIs and development techniques -that can have security implications for your application and its users. As -these best practices are constantly evolving, we recommend you check back -occasionally throughout your application development process.
- - -Writing secure code that runs in virtual machines is a well-studied topic -and many of the issues are not specific to Android. Rather than attempting to -rehash these topics, we’d recommend that you familiarize yourself with the -existing literature. Two of the more popular resources are: -
This document is focused on the areas which are Android specific and/or -different from other environments. For developers experienced with VM -programming in other environments, there are two broad issues that may be -different about writing apps for Android: -
In general, we encourage developers to use the Android SDK for most -application development, rather than using native code. Applications built -with native code are more complex, less portable, and more like to include -common memory corruption errors such as buffer overflows.
- -Android is built using the Linux kernel and being familiar with Linux -development security best practices is especially useful if you are going to -use native code. This document is too short to discuss all of those best -practices, but one of the most popular resources is “Secure Programming for -Linux and Unix HOWTO”, available at -http://www.dwheeler.com/secure-programs.
- -An important difference between Android and most Linux environments is the -Application Sandbox. On Android, all applications run in the Application -Sandbox, including those written with native code. At the most basic level, a -good way to think about it for developers familiar with Linux is to know that -every application is given a unique UID with very limited permissions. This is -discussed in more detail in the Android Security -Overview and you should be familiar with application permissions even if -you are using native code.
- - -By default, files created on internal -storage are only accessible to the application that created the file. This -protection is implemented by Android and is sufficient for most -applications.
- -Use of -world writable or world -readable files for IPC is discouraged because it does not provide -the ability to limit data access to particular applications, nor does it -provide any control on data format. As an alternative, you might consider using -a ContentProvider which provides read and write permissions, and can make -dynamic permission grants on a case-by-case basis.
- -To provide additional protection for sensitive data, some applications -choose to encrypt local files using a key that is not accessible to the -application. (For example, a key can be placed in a {@link java.security.KeyStore} and -protected with a user password that is not stored on the device). While this -does not protect data from a root compromise that can monitor the user -inputting the password, it can provide protection for a lost device without file system -encryption.
- -Files created on external -storage, such as SD Cards, are globally readable and writable. Since -external storage can be removed by the user and also modified by any -application, applications should not store sensitive information using -external storage.
- -As with data from any untrusted source, applications should perform input -validation when handling data from external storage (see Input Validation -section). We strongly recommend that applications not store executables or -class files on external storage prior to dynamic loading. If an application -does retrieve executable files from external storage they should be signed and -cryptographically verified prior to dynamic loading.
- -ContentProviders provide a structured storage mechanism that can be limited
-to your own application, or exported to allow access by other applications. By
-default, a
-
-ContentProvider is
-exported
- for use by other applications. If you do not intend to provide other
-applications with access to your
-
-ContentProvider, mark them as
-android:exported=false in the application manifest.
When creating a
-ContentProvider
- that will be exported for use by other applications, you can specify
-a single
-permission
- for reading and writing, or distinct permissions for reading and writing
-within the manifest. We recommend that you limit your permissions to those
-required to accomplish the task at hand. Keep in mind that it’s usually
-easier to add permissions later to expose new functionality than it is to take
-them away and break existing users.
If you are using a
-
-ContentProvider for sharing data between applications built by the
-same developer, it is preferable to use
-signature
-level permissions. Signature permissions do not require user confirmation,
-so they provide a better user experience and more controlled access to the
-
-
-ContentProvider.
ContentProviders can also provide more granular access by declaring the
-grantUriPermissions element and using the FLAG_GRANT_READ_URI_PERMISSION
-and FLAG_GRANT_WRITE_URI_PERMISSION
-flags in the Intent object
-that activates the component. The scope of these permissions can be further
-limited by the
-grant-uri-permission element.
When accessing a
-
-ContentProvider, use parameterized query methods such as
-query(), update(), and delete() to avoid
-potential SQL
-Injection from untrusted data. Note that using parameterized methods is not
-sufficient if the selection is built by concatenating user data
-prior to submitting it to the method.
Do not have a false sense of security about the write permission. Consider
-that the write permission allows SQL statements which make it possible for some
-data to be confirmed using creative WHERE clauses and parsing the
-results. For example, an attacker might probe for presence of a specific phone
-number in a call-log by modifying a row only if that phone number already
-exists. If the content provider data has predictable structure, the write
-permission may be equivalent to providing both reading and writing.
Some Android applications attempt to implement IPC using traditional Linux -techniques such as network sockets and shared files. We strongly encourage the -use of Android system functionality for IPC such as Intents, Binders, Services, -and Receivers. The Android IPC mechanisms allow you to verify the identity of -the application connecting to your IPC and set security policy for each IPC -mechanism.
- -Many of the security elements are shared across IPC mechanisms. -Broadcast Receivers, -Activities, and -Services are all declared in the application manifest. If your IPC mechanism is -not intended for use by other applications, set the {@code android:exported} -property to false. This is useful for applications that consist of multiple processes -within the same UID, or if you decide late in development that you do not -actually want to expose functionality as IPC but you don’t want to rewrite -the code.
- -If your IPC is intended to be accessible to other applications, you can -apply a security policy by using the -Permission tag. If IPC is between applications built by the same developer, -it is preferable to use signature -level permissions. Signature permissions do not require user confirmation, -so they provide a better user experience and more controlled access to the IPC -mechanism.
- -One area that can introduce confusion is the use of intent filters. Note -that Intent filters should not be considered a security feature -- components -can be invoked directly and may not have data that would conform to the intent -filter. You should perform input validation within your intent receiver to -confirm that it is properly formatted for the invoked receiver, service, or -activity.
- -Intents are the preferred mechanism for asynchronous IPC in Android.
-Depending on your application requirements, you might use sendBroadcast(),
-sendOrderedBroadcast(),
-or direct an intent to a specific application component.
Note that ordered broadcasts can be “consumed” by a recipient, so they -may not be delivered to all applications. If you are sending an Intent where -delivery to a specific receiver is required, the intent must be delivered -directly to the receiver.
- -Senders of an intent can verify that the recipient has a permission -specifying a non-Null Permission upon sending. Only applications with that -Permission will receive the intent. If data within a broadcast intent may be -sensitive, you should consider applying a permission to make sure that -malicious applications cannot register to receive those messages without -appropriate permissions. In those circumstances, you may also consider -invoking the receiver directly, rather than raising a broadcast.
- -Binders are the -preferred mechanism for RPC-style IPC in Android. They provide a well-defined -interface that enables mutual authentication of the endpoints, if required.
- -We strongly encourage designing interfaces in a manner that does not require -interface specific permission checks. Binders are not declared within the -application manifest, and therefore you cannot apply declarative permissions -directly to a Binder. Binders generally inherit permissions declared in the -application manifest for the Service or Activity within which they are -implemented. If you are creating an interface that requires authentication -and/or access controls on a specific binder interface, those controls must be -explicitly added as code in the interface.
- -If providing an interface that does require access controls, use checkCallingPermission()
-to verify whether the
-caller of the Binder has a required permission. This is especially important
-before accessing a Service on behalf of the caller, as the identify of your
-application is passed to other interfaces. If invoking an interface provided
-by a Service, the bindService()
- invocation may fail if you do not have permission to access the given Service.
- If calling an interface provided locally by your own application, it may be
-useful to use the
-clearCallingIdentity() to satisfy internal security checks.
Broadcast receivers are used to handle asynchronous requests initiated via -an intent.
- -By default, receivers are exported and can be invoked by any other
-application. If your
-BroadcastReceivers is intended for use by other applications, you
-may want to apply security permissions to receivers using the
-<receiver> element within the application manifest. This will
-prevent applications without appropriate permissions from sending an intent to
-the
-BroadcastReceivers.
Services are often used to supply functionality for other applications to
-use. Each service class must have a corresponding
By default, Services are exported and can be invoked by any other
-application. Services can be protected using the {@code android:permission}
-attribute
-within the manifest’s
-<service> tag. By doing so, other applications will need to declare
-a corresponding <uses-permission>
- element in their own manifest to be
-able to start, stop, or bind to the service.
A Service can protect individual IPC calls into it with permissions, by
-calling checkCallingPermission()
-before executing
-the implementation of that call. We generally recommend using the
-declarative permissions in the manifest, since those are less prone to
-oversight.
Activities are most often used for providing the core user-facing -functionality of an application. By default, Activities are exported and -invokable by other applications only if they have an intent filter or binder -declared. In general, we recommend that you specifically declare a Receiver or -Service to handle IPC, since this modular approach reduces the risk of exposing -functionality that is not intended for use by other applications.
- -If you do expose an Activity for purposes of IPC, the android:permission
-attribute in the
-<activity> declaration in the application manifest can be used to
-restrict access to only those applications which have the stated
-permissions.
We recommend minimizing the number of permissions requested by an -application. Not having access to sensitive permissions reduces the risk of -inadvertently misusing those permissions, can improve user adoption, and makes -applications less attractive targets for attackers.
- -If it is possible to design your application in a way that does not require -a permission, that is preferable. For example, rather than requesting access -to device information to create an identifier, create a GUID for your application. -(This specific example is also discussed in Handling User Data) Or, rather than -using external storage, store data in your application directory.
- -If a permission is not required, do not request it. This sounds simple, but -there has been quite a bit of research into the frequency of over-requesting -permissions. If you’re interested in the subject you might start with this -research paper published by U.C. Berkeley: -http://www.eecs.berkeley.edu/Pubs/TechRpts/2011/EECS-2011-48.pdf
- -In addition to requesting permissions, your application can use permissions
-to protect IPC that is security sensitive and will be exposed to other
-applications -- such as a
-ContentProvider. In general, we recommend using access controls
-other than user confirmed permissions where possible since permissions can
-be confusing for users. For example, consider using the signature
-protection level on permissions for IPC communication between applications
-provided by a single developer.
Do not cause permission re-delegation. This occurs when an app exposes data -over IPC that is only available because it has a specific permission, but does -not require that permission of any clients of it’s IPC interface. More -details on the potential impacts, and frequency of this type of problem is -provided in this research paper published at USENIX: http://www.cs.be -rkeley.edu/~afelt/felt_usenixsec2011.pdf
- -Generally, you should strive to create as few permissions as possible while -satisfying your security requirements. Creating a new permission is relatively -uncommon for most applications, since system-defined -permissions cover many situations. Where appropriate, -perform access checks using existing permissions.
- -If you must create a new permission, consider whether you can accomplish -your task with a Signature permission. Signature permissions are transparent -to the user and only allow access by applications signed by the same developer -as application performing the permission check. If you create a Dangerous -permission, then the user needs to decide whether to install the application. -This can be confusing for other developers, as well as for users.
- -If you create a Dangerous permission, there are a number of complexities -that you need to consider. -
Each of these poses a significant non-technical challenge for an application -developer, which is why we discourage the use of Dangerous permission.
- - -Networking on Android is not significantly different from Linux -environments. The key consideration is making sure that appropriate protocols -are used for sensitive data, such as HTTPS for -web traffic. We prefer use of HTTPS over HTTP anywhere that HTTPS is -supported on the server, since mobile devices frequently connect on networks -that are not secured, such as public WiFi hotspots.
- -Authenticated, encrypted socket-level communication can be easily
-implemented using the SSLSocket
-class. Given the frequency with which Android devices connect to unsecured
-wireless networks using WiFi, the use of secure networking is strongly
-encouraged for all applications.
We have seen some applications use localhost network ports for -handling sensitive IPC. We discourage this approach since these interfaces are -accessible by other applications on the device. Instead, use an Android IPC -mechanism where authentication is possible such as a Service and Binder. (Even -worse than using loopback is to bind to INADDR_ANY since then your application -may receive requests from anywhere. We’ve seen that, too.)
- -Also, one common issue that warrants repeating is to make sure that you do
-not trust data downloaded from HTTP or other insecure protocols. This includes
-validation of input in WebView and
-any responses to intents issued against HTTP.
SMS is the telephony protocol most frequently used by Android developers. -Developers should keep in mind that this protocol was primarily designed for -user-to-user communication and is not well-suited for some application -purposes. Due to the limitations of SMS, we strongly recommend the use of C2DM and IP networking for -sending data messages to devices.
- -Many developers do not realize that SMS is not encrypted or strongly -authenticated on the network or on the device. In particular, any SMS receiver -should expect that a malicious user may have sent the SMS to your application --- do not rely on unauthenticated SMS data to perform sensitive commands. -Also, you should be aware that SMS may be subject to spoofing and/or -interception on the network. On the Android-powered device itself, SMS -messages are transmitted as Broadcast intents, so they may be read or captured -by other applications that have the READ_SMS permission.
- - -We strongly discourage loading code from outside of the application APK. -Doing so significantly increases the likelihood of application compromise due -to code injection or code tampering. It also adds complexity around version -management and application testing. Finally, it can make it impossible to -verify the behavior of an application, so it may be prohibited in some -environments.
- -If your application does dynamically load code, the most important thing to -keep in mind about dynamically loaded code is that it runs with the same -security permissions as the application APK. The user made a decision to -install your application based on your identity, and they are expecting that -you provide any code run within the application, including code that is -dynamically loaded.
- -The major security risk associated with dynamically loading code is that the
-code needs to come from a verifiable source. If the modules are included
-directly within your APK, then they cannot be modified by other applications.
-This is true whether the code is a native library or a class being loaded using
-
-DexClassLoader. We have seen many instances of applications
-attempting to load code from insecure locations, such as downloaded from the
-network over unencrypted protocols or from world writable locations such as
-external storage. These locations could allow someone on the network to modify
-the content in transit, or another application on a users device to modify the
-content, respectively.
Since WebView consumes web content that can include HTML and JavaScript, -improper use can introduce common web security issues such as cross-site-scripting (JavaScript injection). Android includes a number of mechanisms to reduce -the scope of these potential issues by limiting the capability of WebView to -the minimum functionality required by your application.
- -If your application does not directly use JavaScript within a WebView, do
-not call
-
-setJavaScriptEnabled(). We have seen this method invoked
-in sample code that might be repurposed in production application -- so
-remove it if necessary. By default, WebView does
-not execute JavaScript so cross-site-scripting is not possible.
Use addJavaScriptInterface() with
-particular care because it allows JavaScript to invoke operations that are
-normally reserved for Android applications. Only expose addJavaScriptInterface() to
-sources from which all input is trustworthy. If untrusted input is allowed,
-untrusted JavaScript may be able to invoke Android methods. In general, we
-recommend only exposing addJavaScriptInterface() to
-JavaScript that is contained within your application APK.
Do not trust information downloaded over HTTP, use HTTPS instead. Even if
-you are connecting only to a single website that you trust or control, HTTP is
-subject to MiTM attacks
-and interception of data. Sensitive capabilities using addJavaScriptInterface() should
-not ever be exposed to unverified script downloaded over HTTP. Note that even
-with the use of HTTPS,
-addJavaScriptInterface()
-increases the attack surface of your application to include the server
-infrastructure and all CAs trusted by the Android-powered device.
If your application accesses sensitive data with a WebView, you
-may want to use the
-clearCache() method to delete any files stored locally. Server side
-headers like no-cache can also be used to indicate that an application should
-not cache particular content.
Insufficient input validation is one of the most common security problems -affecting applications, regardless of what platform they run on. Android does -have platform-level countermeasures that reduce the exposure of applications to -input validation issues, you should use those features where possible. Also -note that selection of type-safe languages tends to reduce the likelihood of -input validation issues. We strongly recommend building your applications with -the Android SDK.
- -If you are using native code, then any data read from files, received over -the network, or received from an IPC has the potential to introduce a security -issue. The most common problems are buffer overflows, use after -free, and off-by-one errors. -Android provides a number of technologies like ASLR and DEP that reduce the -exploitability of these errors, but they do not solve the underlying problem. -These can be prevented by careful handling of pointers and managing of -buffers.
- -Dynamic, string based languages such as JavaScript and SQL are also subject -to input validation problems due to escape characters and script injection.
- -If you are using data within queries that are submitted to SQL Database or a -Content Provider, SQL Injection may be an issue. The best defense is to use -parameterized queries, as is discussed in the ContentProviders section. -Limiting permissions to read-only or write-only can also reduce the potential -for harm related to SQL Injection.
- -If you are using WebView, then
-you must consider the possibility of XSS. If your application does not
-directly use JavaScript within a WebView, do
-not call setJavaScriptEnabled() and XSS is no longer possible. If you must
-enable JavaScript then the WebView section provides other security best
-practices.
If you cannot use the security features above, we strongly recommend the use -of well-structured data formats and verifying that the data conforms to the -expected format. While blacklisting of characters or character-replacement can -be an effective strategy, these techniques are error-prone in practice and -should be avoided when possible.
- - -In general, the best approach is to minimize use of APIs that access -sensitive or personal user data. If you have access to data and can avoid -storing or transmitting the information, do not store or transmit the data. -Finally, consider if there is a way that your application logic can be -implemented using a hash or non-reversible form of the data. For example, your -application might use the hash of an an email address as a primary key, to -avoid transmitting or storing the email address. This reduces the chances of -inadvertently exposing data, and it also reduces the chance of attackers -attempting to exploit your application.
- -If your application accesses personal information such as passwords or -usernames, keep in mind that some jurisdictions may require you to provide a -privacy policy explaining your use and storage of that data. So following the -security best practice of minimizing access to user data may also simplify -compliance.
- -You should also consider whether your application might be inadvertently -exposing personal information to other parties such as third-party components -for advertising or third-party services used by your application. If you don't -know why a component or service requires a personal information, don’t -provide it. In general, reducing the access to personal information by your -application will reduce the potential for problems in this area.
- -If access to sensitive data is required, evaluate whether that information -must be transmitted to a server, or whether the operation can be performed on -the client. Consider running any code using sensitive data on the client to -avoid transmitting user data.
- -Also, make sure that you do not inadvertently expose user data to other -application on the device through overly permissive IPC, world writable files, -or network sockets. This is a special case of permission redelegation, -discussed in the Requesting Permissions section.
- -If a GUID is required, create a large, unique number and store it. Do not -use phone identifiers such as the phone number or IMEI which may be associated -with personal information. This topic is discussed in more detail in the Android Developer Blog.
- -Application developers should be careful writing to on-device logs.
-In Android, logs are a shared resource, and are available
-to an application with the
-
-READ_LOGS permission. Even though the phone log data
-is temporary and erased on reboot, inappropriate logging of user information
-could inadvertently leak user data to other applications.
In general, we recommend minimizing the frequency of asking for user -credentials -- to make phishing attacks more conspicuous, and less likely to be -successful. Instead use an authorization token and refresh it.
- -Where possible, username and password should not be stored on the device. -Instead, perform initial authentication using the username and password -supplied by the user, and then use a short-lived, service-specific -authorization token.
- -Services that will be accessible to multiple applications should be accessed
-using
-
-AccountManager. If possible, use the
-AccountManager class to invoke a cloud-based service and do not store
-passwords on the device.
After using
-AccountManager to retrieve an Account, check the CREATOR
- before passing in any credentials, so that you do not inadvertently pass
-credentials to the wrong application.
If credentials are to be used only by applications that you create, then you
-can verify the application which accesses the
-AccountManager using checkSignature().
-Alternatively, if only one application will use the credential, you might use a
-{@link java.security.KeyStore} for
-storage.
In addition to providing data isolation, supporting full-filesystem -encryption, and providing secure communications channels Android provides a -wide array of algorithms for protecting data using cryptography.
- -In general, try to use the highest level of pre-existing framework
-implementation that can support your use case. If you need to securely
-retrieve a file from a known location, a simple HTTPS URI may be adequate and
-require no knowledge of cryptography on your part. If you need a secure
-tunnel, consider using
-
-HttpsURLConnection or SSLSocket,
-rather than writing your own protocol.
If you do find yourself needing to implement your own protocol, we strongly
-recommend that you not implement your own cryptographic algorithms. Use
-existing cryptographic algorithms such as those in the implementation of AES or
-RSA provided in the Cipher class.
Use a secure random number generator (
-
-SecureRandom) to initialize any cryptographic keys (
-KeyGenerator). Use of a key that is not generated with a secure random
-number generator significantly weakens the strength of the algorithm, and may
-allow offline attacks.
If you need to store a key for repeated use, use a mechanism like {@link java.security.KeyStore} that -provides a mechanism for long term storage and retrieval of cryptographic -keys.
- -Android provides developers with the ability to design applications with a -broad range of security requirements. These best practices will help you make -sure that your application takes advantage of the security benefits provided by -the platform.
- -You can receive more information on these topics and discuss security best -practices with other developers in the Android Security -Discuss Google Group
diff --git a/docs/html/guide/topics/ui/layout-objects.jd b/docs/html/guide/topics/ui/layout-objects.jd deleted file mode 100644 index 1d15ad60c0799..0000000000000 --- a/docs/html/guide/topics/ui/layout-objects.jd +++ /dev/null @@ -1,6 +0,0 @@ -page.title=Layouts -parent.title=User Interface -parent.link=index.html -@jd:body - -You should have been redirected to Layouts.
\ No newline at end of file diff --git a/docs/html/guide/topics/ui/notifiers/index.jd b/docs/html/guide/topics/ui/notifiers/index.jd deleted file mode 100644 index caf0df70edd11..0000000000000 --- a/docs/html/guide/topics/ui/notifiers/index.jd +++ /dev/null @@ -1,92 +0,0 @@ -page.title=Notifications -parent.title=User Interface -parent.link=../index.html -@jd:body - -Several types of situations may arise that require you to notify the user -about an event that occurs in your application. Some events require the user to respond -and others do not. For example:
-Each of these notification tasks can be achieved using a different technique:
-This document summarizes each of these techniques for notifying the user and includes -links to full documentation.
- - -
-
-A toast notification is a message that pops up on the surface of the window. -It only fills the amount of space required for the message and the user's current -activity remains visible and interactive. The notification automatically fades in and -out, and does not accept interaction events. Because a toast can be created from a background -{@link android.app.Service}, it appears even if the application isn't visible.
- -A toast is best for short text messages, such as "File saved," -when you're fairly certain the user is paying attention -to the screen. A toast can not accept user interaction events; if you'd like -the user to respond and take action, consider using a -Status Notification instead.
- -For more information, refer to Toast Notifications.
- - -
-
-A status notification adds an icon to the system's status bar -(with an optional ticker-text message) and an expanded message in the "Notifications" window. -When the user selects the expanded message, Android fires an -{@link android.content.Intent} that is defined by the notification (usually to launch an -{@link android.app.Activity}). -You can also configure the notification to alert the user with a sound, a vibration, and flashing -lights on the device.
- -This kind of notification is ideal when your application is working in -a background {@link android.app.Service} and needs to -notify the user about an event. If you need to alert the user about an event that occurs -while your Activity is still in focus, consider using a -Dialog Notification instead.
- -For more information, refer to -Status Notifications.
- - -
-
-A dialog is usually a small window that appears in front of the current Activity. -The underlying Activity loses focus and the dialog accepts all user interaction. -Dialogs are normally used -for notifications and short activities that directly relate to the application in progress.
- -You should use a dialog when you need to show a progress bar or a short -message that requires confirmation from the user (such as an alert with "OK" and "Cancel" buttons). -You can use also use dialogs as integral components -in your application's UI and for other purposes besides notifications. -For a complete discussion on all the available types of dialogs, -including its uses for notifications, refer to -Dialogs.
- - - diff --git a/docs/html/sdk/installing/next.jd b/docs/html/sdk/installing/next.jd deleted file mode 100644 index cb974a4555a06..0000000000000 --- a/docs/html/sdk/installing/next.jd +++ /dev/null @@ -1,51 +0,0 @@ -page.title=Next Steps - -@jd:body - - -Now that you've installed the Android SDK, here are are a few ways to learn Android -and start developing:
- -This class is an essential first step for new Android developers.
-It gives you step by step instructions for building a simple app. You’ll learn how to -create an Android project and run a debuggable version of the app. You'll also learn some -fundamentals of Android app design, including how to build a simple user interface and handle user -input.
-<sdk>/samples/<platform-version>/.