diff options
| -rw-r--r-- | Android.mk | 29 | ||||
| -rw-r--r-- | api/current.xml | 32 | ||||
| -rw-r--r-- | cmds/stagefright/record.cpp | 20 | ||||
| -rw-r--r-- | media/libstagefright/rtsp/ARTPConnection.cpp | 8 | ||||
| -rw-r--r-- | media/libstagefright/rtsp/MyHandler.h | 102 | ||||
| -rw-r--r-- | packages/SettingsProvider/res/values/defaults.xml | 2 | ||||
| -rw-r--r-- | packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java | 23 | ||||
| -rw-r--r-- | packages/SystemUI/res/values/defaults.xml | 58 | ||||
| -rw-r--r-- | tools/aapt/Bundle.h | 5 | ||||
| -rw-r--r-- | tools/aapt/Main.cpp | 9 | ||||
| -rw-r--r-- | tools/aapt/Resource.cpp | 7 |
11 files changed, 172 insertions, 123 deletions
@@ -471,6 +471,35 @@ $(full_target): $(framework_built) $(INTERNAL_PLATFORM_API_FILE): $(full_target) $(call dist-for-goals,sdk,$(INTERNAL_PLATFORM_API_FILE)) +# ==== check javadoc comments but don't generate docs ======== +include $(CLEAR_VARS) + +LOCAL_SRC_FILES:=$(framework_docs_LOCAL_SRC_FILES) +LOCAL_INTERMEDIATE_SOURCES:=$(framework_docs_LOCAL_INTERMEDIATE_SOURCES) +LOCAL_JAVA_LIBRARIES:=$(framework_docs_LOCAL_JAVA_LIBRARIES) +LOCAL_MODULE_CLASS:=$(framework_docs_LOCAL_MODULE_CLASS) +LOCAL_DROIDDOC_SOURCE_PATH:=$(framework_docs_LOCAL_DROIDDOC_SOURCE_PATH) +LOCAL_DROIDDOC_HTML_DIR:=$(framework_docs_LOCAL_DROIDDOC_HTML_DIR) +LOCAL_ADDITIONAL_JAVA_DIR:=$(framework_docs_LOCAL_ADDITIONAL_JAVA_DIR) + +LOCAL_MODULE := doc-comment-check + +LOCAL_DROIDDOC_OPTIONS:=\ + $(framework_docs_LOCAL_DROIDDOC_OPTIONS) \ + -stubs $(TARGET_OUT_COMMON_INTERMEDIATES)/JAVA_LIBRARIES/android_stubs_current_intermediates/src \ + -apixml $(INTERNAL_PLATFORM_API_FILE) \ + -parsecomments + +LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR:=build/tools/droiddoc/templates-sdk +LOCAL_DROIDDOC_CUSTOM_ASSET_DIR:=assets-sdk + +include $(BUILD_DROIDDOC) + +# $(gen), i.e. framework.aidl, is also needed while building against the current stub. +$(full_target): $(framework_built) $(gen) + +droidcore: doc-comment-check-docs + # ==== static html in the sdk ================================== include $(CLEAR_VARS) diff --git a/api/current.xml b/api/current.xml index b4f2325..9bedb67 100644 --- a/api/current.xml +++ b/api/current.xml @@ -97628,7 +97628,7 @@ type="android.net.SSLCertificateSocketFactory" static="false" final="false" - deprecated="deprecated" + deprecated="not deprecated" visibility="public" > <parameter name="handshakeTimeoutMillis" type="int"> @@ -99728,7 +99728,7 @@ type="android.net.http.SslCertificate" static="false" final="false" - deprecated="deprecated" + deprecated="not deprecated" visibility="public" > <parameter name="issuedTo" type="java.lang.String"> @@ -99795,7 +99795,7 @@ synchronized="false" static="false" final="false" - deprecated="deprecated" + deprecated="not deprecated" visibility="public" > </method> @@ -99817,7 +99817,7 @@ synchronized="false" static="false" final="false" - deprecated="deprecated" + deprecated="not deprecated" visibility="public" > </method> @@ -173174,7 +173174,7 @@ abstract="false" static="false" final="false" - deprecated="deprecated" + deprecated="not deprecated" visibility="public" > <constructor name="EventLogTags" @@ -203508,7 +203508,7 @@ synchronized="true" static="false" final="false" - deprecated="deprecated" + deprecated="not deprecated" visibility="public" > </method> @@ -204054,7 +204054,7 @@ synchronized="true" static="false" final="false" - deprecated="deprecated" + deprecated="not deprecated" visibility="public" > <parameter name="flag" type="boolean"> @@ -206179,7 +206179,7 @@ synchronized="false" static="false" final="false" - deprecated="deprecated" + deprecated="not deprecated" visibility="public" > <parameter name="view" type="android.webkit.WebView"> @@ -214712,7 +214712,7 @@ synchronized="false" static="false" final="false" - deprecated="deprecated" + deprecated="not deprecated" visibility="public" > </method> @@ -405008,7 +405008,7 @@ synchronized="false" static="false" final="false" - deprecated="deprecated" + deprecated="not deprecated" visibility="protected" > <parameter name="pattern" type="java.lang.String"> @@ -412389,7 +412389,7 @@ abstract="true" static="false" final="false" - deprecated="deprecated" + deprecated="not deprecated" visibility="public" > <method name="getLength" @@ -412878,7 +412878,7 @@ abstract="true" static="false" final="false" - deprecated="deprecated" + deprecated="not deprecated" visibility="public" > <method name="characters" @@ -413093,7 +413093,7 @@ abstract="false" static="false" final="false" - deprecated="deprecated" + deprecated="not deprecated" visibility="public" > <implements name="org.xml.sax.DTDHandler"> @@ -413560,7 +413560,7 @@ abstract="true" static="false" final="false" - deprecated="deprecated" + deprecated="not deprecated" visibility="public" > <method name="parse" @@ -414992,7 +414992,7 @@ abstract="false" static="false" final="false" - deprecated="deprecated" + deprecated="not deprecated" visibility="public" > <implements name="org.xml.sax.AttributeList"> @@ -416481,7 +416481,7 @@ abstract="false" static="false" final="false" - deprecated="deprecated" + deprecated="not deprecated" visibility="public" > <method name="makeParser" diff --git a/cmds/stagefright/record.cpp b/cmds/stagefright/record.cpp index 5a87f4c..c424281 100644 --- a/cmds/stagefright/record.cpp +++ b/cmds/stagefright/record.cpp @@ -32,9 +32,15 @@ using namespace android; +static const int32_t kFramerate = 24; // fps +static const int32_t kIFramesIntervalSec = 1; +static const int32_t kVideoBitRate = 512 * 1024; +static const int32_t kAudioBitRate = 12200; +static const int32_t kColorFormat = OMX_COLOR_FormatYUV420SemiPlanar; +static const int64_t kDurationUs = 10000000LL; // 10 seconds + #if 1 class DummySource : public MediaSource { - static const int32_t kFramerate = 24; // fps public: DummySource(int width, int height) @@ -176,6 +182,12 @@ int main(int argc, char **argv) { enc_meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_AVC); enc_meta->setInt32(kKeyWidth, width); enc_meta->setInt32(kKeyHeight, height); + enc_meta->setInt32(kKeySampleRate, kFramerate); + enc_meta->setInt32(kKeyBitRate, kVideoBitRate); + enc_meta->setInt32(kKeyStride, width); + enc_meta->setInt32(kKeySliceHeight, height); + enc_meta->setInt32(kKeyIFramesInterval, kIFramesIntervalSec); + enc_meta->setInt32(kKeyColorFormat, kColorFormat); sp<MediaSource> encoder = OMXCodec::Create( @@ -184,8 +196,10 @@ int main(int argc, char **argv) { #if 1 sp<MPEG4Writer> writer = new MPEG4Writer("/sdcard/output.mp4"); writer->addSource(encoder); + writer->setMaxFileDuration(kDurationUs); writer->start(); while (!writer->reachedEOS()) { + fprintf(stderr, "."); usleep(100000); } writer->stop(); @@ -194,6 +208,8 @@ int main(int argc, char **argv) { MediaBuffer *buffer; while (encoder->read(&buffer) == OK) { + printf("."); + fflush(stdout); int32_t isSync; if (!buffer->meta_data()->findInt32(kKeyIsSyncFrame, &isSync)) { isSync = false; @@ -209,6 +225,7 @@ int main(int argc, char **argv) { encoder->stop(); #endif + printf("$\n"); client.disconnect(); #endif @@ -267,6 +284,7 @@ int main(int argc, char **argv) { encMeta->setInt32(kKeySampleRate, kSampleRate); encMeta->setInt32(kKeyChannelCount, kNumChannels); encMeta->setInt32(kKeyMaxInputSize, 8192); + encMeta->setInt32(kKeyBitRate, kAudioBitRate); sp<MediaSource> encoder = OMXCodec::Create(client.interface(), encMeta, true, audioSource); diff --git a/media/libstagefright/rtsp/ARTPConnection.cpp b/media/libstagefright/rtsp/ARTPConnection.cpp index 12f8f32..10c9e02 100644 --- a/media/libstagefright/rtsp/ARTPConnection.cpp +++ b/media/libstagefright/rtsp/ARTPConnection.cpp @@ -362,7 +362,6 @@ status_t ARTPConnection::receive(StreamInfo *s, bool receiveRTP) { if (receiveRTP) { err = parseRTP(s, buffer); } else { - ++s->mNumRTCPPacketsReceived; err = parseRTCP(s, buffer); } @@ -456,6 +455,12 @@ status_t ARTPConnection::parseRTP(StreamInfo *s, const sp<ABuffer> &buffer) { } status_t ARTPConnection::parseRTCP(StreamInfo *s, const sp<ABuffer> &buffer) { + if (s->mNumRTCPPacketsReceived++ == 0) { + sp<AMessage> notify = s->mNotifyMsg->dup(); + notify->setInt32("first-rtcp", true); + notify->post(); + } + const uint8_t *data = buffer->data(); size_t size = buffer->size(); @@ -626,7 +631,6 @@ void ARTPConnection::onInjectPacket(const sp<AMessage> &msg) { if (it->mRTPSocket == index) { err = parseRTP(s, buffer); } else { - ++s->mNumRTCPPacketsReceived; err = parseRTCP(s, buffer); } } diff --git a/media/libstagefright/rtsp/MyHandler.h b/media/libstagefright/rtsp/MyHandler.h index ee6f65a..b849117 100644 --- a/media/libstagefright/rtsp/MyHandler.h +++ b/media/libstagefright/rtsp/MyHandler.h @@ -82,7 +82,8 @@ struct MyHandler : public AHandler { mFirstAccessUnitNTP(0), mNumAccessUnitsReceived(0), mCheckPending(false), - mTryTCPInterleaving(false) { + mTryTCPInterleaving(false), + mReceivedFirstRTCPPacket(false) { mNetLooper->setName("rtsp net"); mNetLooper->start(false /* runOnCallingThread */, false /* canCallJava */, @@ -199,31 +200,35 @@ struct MyHandler : public AHandler { break; } - CHECK_EQ(response->mStatusCode, 200u); - - mSessionDesc = new ASessionDescription; + if (response->mStatusCode != 200) { + result = UNKNOWN_ERROR; + } else { + mSessionDesc = new ASessionDescription; - mSessionDesc->setTo( - response->mContent->data(), - response->mContent->size()); + mSessionDesc->setTo( + response->mContent->data(), + response->mContent->size()); - CHECK(mSessionDesc->isValid()); + CHECK(mSessionDesc->isValid()); - ssize_t i = response->mHeaders.indexOfKey("content-base"); - if (i >= 0) { - mBaseURL = response->mHeaders.valueAt(i); - } else { - i = response->mHeaders.indexOfKey("content-location"); + ssize_t i = response->mHeaders.indexOfKey("content-base"); if (i >= 0) { mBaseURL = response->mHeaders.valueAt(i); } else { - mBaseURL = mSessionURL; + i = response->mHeaders.indexOfKey("content-location"); + if (i >= 0) { + mBaseURL = response->mHeaders.valueAt(i); + } else { + mBaseURL = mSessionURL; + } } + + CHECK_GT(mSessionDesc->countTracks(), 1u); + setupTrack(1); } + } - CHECK_GT(mSessionDesc->countTracks(), 1u); - setupTrack(1); - } else { + if (result != OK) { sp<AMessage> reply = new AMessage('disc', id()); mConn->disconnect(reply); } @@ -247,16 +252,7 @@ struct MyHandler : public AHandler { LOG(INFO) << "SETUP(" << index << ") completed with result " << result << " (" << strerror(-result) << ")"; - if (result != OK) { - if (track) { - if (!track->mUsingInterleavedTCP) { - close(track->mRTPSocket); - close(track->mRTCPSocket); - } - - mTracks.removeItemsAt(trackIndex); - } - } else { + if (result == OK) { CHECK(track != NULL); sp<RefBase> obj; @@ -264,29 +260,40 @@ struct MyHandler : public AHandler { sp<ARTSPResponse> response = static_cast<ARTSPResponse *>(obj.get()); - CHECK_EQ(response->mStatusCode, 200u); - - ssize_t i = response->mHeaders.indexOfKey("session"); - CHECK_GE(i, 0); + if (response->mStatusCode != 200) { + result = UNKNOWN_ERROR; + } else { + ssize_t i = response->mHeaders.indexOfKey("session"); + CHECK_GE(i, 0); - if (index == 1) { mSessionID = response->mHeaders.valueAt(i); i = mSessionID.find(";"); if (i >= 0) { // Remove options, i.e. ";timeout=90" mSessionID.erase(i, mSessionID.size() - i); } - } - sp<AMessage> notify = new AMessage('accu', id()); - notify->setSize("track-index", trackIndex); + sp<AMessage> notify = new AMessage('accu', id()); + notify->setSize("track-index", trackIndex); - mRTPConn->addStream( - track->mRTPSocket, track->mRTCPSocket, - mSessionDesc, index, - notify, track->mUsingInterleavedTCP); + mRTPConn->addStream( + track->mRTPSocket, track->mRTCPSocket, + mSessionDesc, index, + notify, track->mUsingInterleavedTCP); - mSetupTracksSuccessful = true; + mSetupTracksSuccessful = true; + } + } + + if (result != OK) { + if (track) { + if (!track->mUsingInterleavedTCP) { + close(track->mRTPSocket); + close(track->mRTCPSocket); + } + + mTracks.removeItemsAt(trackIndex); + } } ++index; @@ -355,6 +362,12 @@ struct MyHandler : public AHandler { } } mTracks.clear(); + mSetupTracksSuccessful = false; + mSeekPending = false; + mFirstAccessUnit = true; + mFirstAccessUnitNTP = 0; + mNumAccessUnitsReceived = 0; + mReceivedFirstRTCPPacket = false; sp<AMessage> reply = new AMessage('tear', id()); @@ -424,6 +437,12 @@ struct MyHandler : public AHandler { case 'accu': { + int32_t firstRTCP; + if (msg->findInt32("first-rtcp", &firstRTCP)) { + mReceivedFirstRTCPPacket = true; + break; + } + ++mNumAccessUnitsReceived; if (!mCheckPending) { @@ -612,7 +631,7 @@ struct MyHandler : public AHandler { case 'tiou': { - if (mFirstAccessUnit) { + if (!mReceivedFirstRTCPPacket) { if (mTryTCPInterleaving) { LOG(WARNING) << "Never received any data, disconnecting."; (new AMessage('abor', id()))->post(); @@ -747,6 +766,7 @@ private: int64_t mNumAccessUnitsReceived; bool mCheckPending; bool mTryTCPInterleaving; + bool mReceivedFirstRTCPPacket; struct TrackInfo { AString mURL; diff --git a/packages/SettingsProvider/res/values/defaults.xml b/packages/SettingsProvider/res/values/defaults.xml index 8349fe6..52e04d7 100644 --- a/packages/SettingsProvider/res/values/defaults.xml +++ b/packages/SettingsProvider/res/values/defaults.xml @@ -22,7 +22,7 @@ <bool name="def_airplane_mode_on">false</bool> <!-- Comma-separated list of bluetooth, wifi, and cell. --> <string name="def_airplane_mode_radios" translatable="false">cell,bluetooth,wifi</string> - <string name="airplane_mode_toggleable_radios" translatable="false">wifi</string> + <string name="airplane_mode_toggleable_radios" translatable="false">bluetooth,wifi</string> <bool name="def_auto_time">true</bool> <bool name="def_accelerometer_rotation">true</bool> <!-- Default screen brightness, from 0 to 255. 102 is 40%. --> diff --git a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java index 7395233..ad04bb4 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java @@ -64,7 +64,7 @@ public class DatabaseHelper extends SQLiteOpenHelper { // database gets upgraded properly. At a minimum, please confirm that 'upgradeVersion' // is properly propagated through your change. Not doing so will result in a loss of user // settings. - private static final int DATABASE_VERSION = 56; + private static final int DATABASE_VERSION = 57; private Context mContext; @@ -713,6 +713,27 @@ public class DatabaseHelper extends SQLiteOpenHelper { } upgradeVersion = 56; } + + if (upgradeVersion == 56) { + /* + * Add Bluetooth to list of toggleable radios in airplane mode + */ + db.beginTransaction(); + SQLiteStatement stmt = null; + try { + db.execSQL("DELETE FROM system WHERE name='" + + Settings.System.AIRPLANE_MODE_TOGGLEABLE_RADIOS + "'"); + stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)" + + " VALUES(?,?);"); + loadStringSetting(stmt, Settings.System.AIRPLANE_MODE_TOGGLEABLE_RADIOS, + R.string.airplane_mode_toggleable_radios); + db.setTransactionSuccessful(); + } finally { + db.endTransaction(); + if (stmt != null) stmt.close(); + } + upgradeVersion = 57; + } // *** Remember to update DATABASE_VERSION above! if (upgradeVersion != currentVersion) { diff --git a/packages/SystemUI/res/values/defaults.xml b/packages/SystemUI/res/values/defaults.xml index 34302c4..df07a3d 100644 --- a/packages/SystemUI/res/values/defaults.xml +++ b/packages/SystemUI/res/values/defaults.xml @@ -17,62 +17,4 @@ */ --> <resources> - <bool name="def_dim_screen">true</bool> - <integer name="def_screen_off_timeout">60000</integer> - <bool name="def_airplane_mode_on">false</bool> - <!-- Comma-separated list of bluetooth, wifi, and cell. --> - <string name="def_airplane_mode_radios" translatable="false">cell,bluetooth,wifi</string> - <string name="airplane_mode_toggleable_radios" translatable="false">wifi</string> - <bool name="def_auto_time">true</bool> - <bool name="def_accelerometer_rotation">true</bool> - <!-- Default screen brightness, from 0 to 255. 102 is 40%. --> - <integer name="def_screen_brightness">102</integer> - <bool name="def_screen_brightness_automatic_mode">false</bool> - <fraction name="def_window_animation_scale">100%</fraction> - <fraction name="def_window_transition_scale">100%</fraction> - <bool name="def_haptic_feedback">true</bool> - - <bool name="def_bluetooth_on">false</bool> - <bool name="def_install_non_market_apps">false</bool> - <!-- Comma-separated list of location providers. - Network location is off by default because it requires - user opt-in via Setup Wizard or Settings. - --> - <string name="def_location_providers_allowed" translatable="false">gps</string> - <bool name="assisted_gps_enabled">true</bool> - <!-- 0 == mobile, 1 == wifi. --> - <integer name="def_network_preference">1</integer> - <bool name="def_usb_mass_storage_enabled">true</bool> - <bool name="def_wifi_on">false</bool> - <bool name="def_networks_available_notification_on">true</bool> - - <bool name="def_backup_enabled">false</bool> - <string name="def_backup_transport" translatable="false"></string> - <!-- Default value for whether or not to pulse the notification LED when there is a - pending notification --> - <bool name="def_notification_pulse">true</bool> - - <bool name="def_mount_play_notification_snd">true</bool> - <bool name="def_mount_ums_autostart">false</bool> - <bool name="def_mount_ums_prompt">true</bool> - <bool name="def_mount_ums_notify_enabled">true</bool> - <!-- Enable User preference for setting install location --> - <bool name="set_install_location">true</bool> - <!-- Default install location if user preference for setting install location is turned on. --> - <integer name="def_install_location">2</integer> - - <!-- user interface sound effects --> - <integer name="def_power_sounds_enabled">1</integer> - <string name="def_low_battery_sound" translatable="false">/system/media/audio/ui/LowBattery.ogg</string> - <integer name="def_dock_sounds_enabled">0</integer> - <string name="def_desk_dock_sound" translatable="false">/system/media/audio/ui/Dock.ogg</string> - <string name="def_desk_undock_sound" translatable="false">/system/media/audio/ui/Undock.ogg</string> - <string name="def_car_dock_sound" translatable="false">/system/media/audio/ui/Dock.ogg</string> - <string name="def_car_undock_sound" translatable="false">/system/media/audio/ui/Undock.ogg</string> - <integer name="def_lockscreen_sounds_enabled">0</integer> - <string name="def_lock_sound" translatable="false">/system/media/audio/ui/Lock.ogg</string> - <string name="def_unlock_sound" translatable="false">/system/media/audio/ui/Unlock.ogg</string> - - <!-- Default for Settings.System.VIBRATE_IN_SILENT --> - <bool name="def_vibrate_in_silent">true</bool> </resources> diff --git a/tools/aapt/Bundle.h b/tools/aapt/Bundle.h index 6a1f2d5..a1bc241 100644 --- a/tools/aapt/Bundle.h +++ b/tools/aapt/Bundle.h @@ -45,7 +45,7 @@ public: mRClassDir(NULL), mResourceIntermediatesDir(NULL), mManifestMinSdkVersion(NULL), mMinSdkVersion(NULL), mTargetSdkVersion(NULL), mMaxSdkVersion(NULL), mVersionCode(NULL), mVersionName(NULL), mCustomPackage(NULL), - mMaxResVersion(NULL), + mMaxResVersion(NULL), mDebugMode(false), mArgc(0), mArgv(NULL) {} ~Bundle(void) {} @@ -137,6 +137,8 @@ public: void setCustomPackage(const char* val) { mCustomPackage = val; } const char* getMaxResVersion() const { return mMaxResVersion; } void setMaxResVersion(const char * val) { mMaxResVersion = val; } + bool getDebugMode() { return mDebugMode; } + void setDebugMode(bool val) { mDebugMode = val; } /* * Set and get the file specification. @@ -234,6 +236,7 @@ private: const char* mVersionName; const char* mCustomPackage; const char* mMaxResVersion; + bool mDebugMode; /* file specification */ int mArgc; diff --git a/tools/aapt/Main.cpp b/tools/aapt/Main.cpp index f457cc8..71c023d 100644 --- a/tools/aapt/Main.cpp +++ b/tools/aapt/Main.cpp @@ -57,7 +57,7 @@ void usage(void) fprintf(stderr, " %s p[ackage] [-d][-f][-m][-u][-v][-x][-z][-M AndroidManifest.xml] \\\n" " [-0 extension [-0 extension ...]] [-g tolerance] [-j jarfile] \\\n" - " [--min-sdk-version VAL] [--target-sdk-version VAL] \\\n" + " [--debug-mode] [--min-sdk-version VAL] [--target-sdk-version VAL] \\\n" " [--app-version VAL] [--app-version-name TEXT] [--custom-package VAL] \\\n" " [--rename-manifest-package PACKAGE] \\\n" " [--rename-instrumentation-target-package PACKAGE] \\\n" @@ -124,6 +124,9 @@ void usage(void) " -0 specifies an additional extension for which such files will not\n" " be stored compressed in the .apk. An empty string means to not\n" " compress any files at all.\n" + " --debug-mode\n" + " inserts android:debuggable=\"true\" in to the application node of the\n" + " manifest, making the application debuggable even on production devices.\n" " --min-sdk-version\n" " inserts android:minSdkVersion in to manifest. If the version is 7 or\n" " higher, the default encoding for resources will be in UTF-8.\n" @@ -392,7 +395,9 @@ int main(int argc, char* const argv[]) } break; case '-': - if (strcmp(cp, "-min-sdk-version") == 0) { + if (strcmp(cp, "-debug-mode") == 0) { + bundle.setDebugMode(true); + } else if (strcmp(cp, "-min-sdk-version") == 0) { argc--; argv++; if (!argc) { diff --git a/tools/aapt/Resource.cpp b/tools/aapt/Resource.cpp index bd84e23..9c5fcda 100644 --- a/tools/aapt/Resource.cpp +++ b/tools/aapt/Resource.cpp @@ -678,6 +678,13 @@ status_t massageManifest(Bundle* bundle, sp<XMLNode> root) bundle->getMaxSdkVersion()); } + if (bundle->getDebugMode()) { + sp<XMLNode> application = root->getChildElement(String16(), String16("application")); + if (application != NULL) { + addTagAttribute(application, RESOURCES_ANDROID_NAMESPACE, "debuggable", "true"); + } + } + // Deal with manifest package name overrides const char* manifestPackageNameOverride = bundle->getManifestPackageNameOverride(); if (manifestPackageNameOverride != NULL) { |
