Earlier this week, we released a beta of the Android SDK.
In the accompanying post, I mentioned that we had to remove some APIs from the
platform for Android 1.0, and as a result they don't appear in the 0.9 beta
SDK, and won't appear in 1.0-compatible SDKs. Today, I want to take a few minutes
to explain why.
GTalkService
We were all really excited when the "XMPPService" (as it was called, at first)
was included in the first early-look SDK. Once we brought in our security review
team to examine Android, however, they soon realized that, as exciting as it
is, the GTalkService has some fundamental security problems. Rich Cannings is
one of our security researchers, and here's his explanation of the issues:
When I first read about GTalkService, I was both excited
and scared. As a developer, I was interested in a feature that provided
a simple interface to send messages between two Google Talk friends. The
messages would appear on the receiving device as a standard Intent that
was easy to handle. How simple and beautiful is that? Unfortunately, when
I put my tin foil hat on, I recognized that things are a little more complicated
than that.
We decided to postpone GTalkService's data-messaging
functionality for the following reasons:
-
"Repurposing" Google
Talk Friends
Google Talk friends are intended for a different purpose than that envisioned
by the GTalkService. Your Google Talk friends can contact you at any
time via IM. They can see your email address and often can see your
real name. However, the idea of a Google Talk friend does not always
line up with the types of people who may want to interact with via an
Android application. For example, imagine a really cool mobile Massively
Multiplayer Online Roleplaying Game using GTalkService. You would have
to add all the players to your Google Talk friends list in order to
play with them. Next time you log in to Google Talk from your desktop
or on the web, you would notice that you have many new "friends". You
may not want to chat with these friends -- and perhaps worse, you may
not want them to know what your real name or email is. We do realize
that Android users will want to interact with other Android users anonymously
and for short periods of time, especially in gaming scenarios. Unfortunately,
it turns out that using Instant Messaging is not really a good way to
do that.
-
Verifying Remote
Intent Senders
Intents were designed to send messages within the device. The Intent
subsystem can conclusively determine who sent Intents only when the
Intents originate from the same device that services the Intent. When
Intents come from other devices, the Intent subsystem cannot determine
what application sent the Intent. This can lead to a variety of problems.
At first, remote applications could send arbitrary Intents, meaning
that your Google Talk friends had almost the same control of your device
as you did. Even once that issue was resolved, we recognized that we
could not trust the identity of the application who sent the request.
We could only trust the identity of the user. So a "bad" application
on your friend's device could send a message to a "good" application
on your device which would negatively affect the good application. In
the end, we determined that the Intent system, as designed for local
use, did not lend itself well to being the vehicle for a Remote Procedure
Call (RPC).
-
Placing Too Much
Security Burden on Developers
As originally designed, the GTalkService placed a significant burden
on the application developer to avoid security flaws and perform user
and relationship management. An Android application using GTalkService
would be reachable from all of the user's Google Talk friends, and a
flaw in that application could pose an inviting target to a malicious
"friend" or automated malware. There are automated mechanisms that could
be used to help protect vulnerable applications or stop the spread of
malware, but the deployment of these technologies was not possible in
time for the launch of the first Android handsets.
Although we would have loved to ship this service, in the
end, the Android team decided to pull the API instead of exposing users to risk
and breaking compatibility with a future, more secure version of the feature.
We think it's obvious that this kind of functionality would be incredibly useful,
and would open lots of new doors for developers. One of our top priorities after
the first devices ship is to develop a device-to-device (and possibly device-to-server)
RPC mechanism that is fast, reliable, and protective of developers and users
alike.
As a final note, I want to point out that since the GTalkService
was always a Google "value-added" service anyway, it was never guaranteed that
it would be present on every Android device. That is, GTalkService was never
part of core Android. As a result this change actually allows us the potential
to build a new system that is part
of the core of a future version of Android.
Bluetooth API
The 1.0 version of Android and the first devices will include support for Bluetooth;
for instance, Android will support Bluetooth headsets. In the early-look SDKs,
there was an incomplete draft of an API that exposed Bluetooth functionality
to developers. Unfortunately we had to remove that API from the 1.0 release.
To get the skinny on why, I contacted Nick Pelly, one of the Android engineers
responsible for that functionality. Here's the story on Bluetooth, in Nick's
words:
The reason is that we plain ran out of time. The Android
Bluetooth API was pretty far along, but needs some clean-up before we can
commit to it for the SDK. Keep in mind that putting it in the 1.0 SDK would
have locked us into that API for years to come.
Here's an example of the problems in the API. Client
code is required to pass around IBluetoothDeviceCallback objects in order
to receive asynchronous callbacks, but IBluetoothDeviceCallback is meant
to be an internal interface. That client code would break the moment we
added new callbacks to IBluetoothDeviceCallback.aidl. This is not a recipe
for future-proof apps.
To make things even more tricky, the recent introduction
of the bluez 4.x series brings its own new API. The Android Bluetooth stack
uses bluez for GAP and SDP so you'll see more than a passing resemblance
to bluez's interfaces in Android. The bluez 4.x change requires us to carefully
consider how to structure our API for the future. Again, remember that once
we settle on an interface we need to support it for years going forward.
Rather than ship a broken API that we knew was going to change
a lot, we chose not to include it. We absolutely intend to support a Bluetooth
API in a future release, although we don't know exactly when that will be. This
should include some tasty features, such as:
-
Bindings to GAP and SDP functionality.
-
Access to RFCOMM and SCO sockets.
-
Potentially, L2CAP socket support from Java. (This one
is under consideration.)
-
An API to our headset and handsfree profiles.
On a personal note, Nick adds, "I would love nothing more
than to start seeing some neat third-party applications and games over Bluetooth.
In my opinion, Bluetooth is completely under-utilized on most mobile platforms
and I'm excited to someday see what the developer community can do with Android."
I'm definitely bummed about these API removals. I was particularly
looking forward to the P2P capabilities offered by GTalkService, but, as always,
user security and privacy must come first. In all these cases, we'll work with
the developer community to create some great APIs that balance these concerns.
Source: http://android-developers.blogspot.com/2008/08/some-information-on-apis-removed-in.html