diff options
Diffstat (limited to 'cmds')
| -rw-r--r-- | cmds/am/src/com/android/commands/am/Am.java | 2 | ||||
| -rw-r--r-- | cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java | 10 | ||||
| -rw-r--r-- | cmds/bootanimation/BootAnimation.cpp | 2 | ||||
| -rw-r--r-- | cmds/dumpstate/dumpstate.c | 14 | ||||
| -rwxr-xr-x[-rw-r--r--] | cmds/input/input | 0 | ||||
| -rw-r--r-- | cmds/installd/commands.c | 150 | ||||
| -rw-r--r-- | cmds/installd/installd.c | 38 | ||||
| -rw-r--r-- | cmds/installd/installd.h | 23 | ||||
| -rw-r--r-- | cmds/installd/utils.c | 8 | ||||
| -rw-r--r-- | cmds/servicemanager/bctest.c | 3 | ||||
| -rw-r--r-- | cmds/servicemanager/service_manager.c | 7 | ||||
| -rw-r--r-- | cmds/stagefright/Android.mk | 7 | ||||
| -rw-r--r-- | cmds/stagefright/record.cpp | 31 | ||||
| -rw-r--r-- | cmds/stagefright/stagefright.cpp | 164 | ||||
| -rw-r--r-- | cmds/surfaceflinger/Android.mk | 2 | ||||
| -rw-r--r-- | cmds/surfaceflinger/main_surfaceflinger.cpp | 31 | ||||
| -rw-r--r-- | cmds/svc/src/com/android/commands/svc/PowerCommand.java | 2 | ||||
| -rw-r--r-- | cmds/system_server/library/Android.mk | 8 | ||||
| -rw-r--r-- | cmds/system_server/library/system_init.cpp | 4 |
19 files changed, 389 insertions, 117 deletions
diff --git a/cmds/am/src/com/android/commands/am/Am.java b/cmds/am/src/com/android/commands/am/Am.java index 736ac08f0586..301883f43c1f 100644 --- a/cmds/am/src/com/android/commands/am/Am.java +++ b/cmds/am/src/com/android/commands/am/Am.java @@ -205,7 +205,7 @@ public class Am { String uri = nextArg(); if (uri != null) { Intent oldIntent = intent; - intent = Intent.getIntent(uri); + intent = Intent.parseUri(uri, 0); if (oldIntent.getAction() != null) { intent.setAction(oldIntent.getAction()); } diff --git a/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java b/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java index 8263e75c1672..39b3a20a7370 100644 --- a/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java +++ b/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java @@ -175,6 +175,11 @@ public final class Bmgr { private void doTransport() { try { String which = nextArg(); + if (which == null) { + showUsage(); + return; + } + String old = mBmgr.selectBackupTransport(which); if (old == null) { System.out.println("Unknown transport '" + which @@ -318,6 +323,11 @@ public final class Bmgr { private void doRestore() { String arg = nextArg(); + if (arg == null) { + showUsage(); + return; + } + if (arg.indexOf('.') >= 0) { // it's a package name doRestorePackage(arg); diff --git a/cmds/bootanimation/BootAnimation.cpp b/cmds/bootanimation/BootAnimation.cpp index ac2eb0d1d8ae..7a7f8ed35215 100644 --- a/cmds/bootanimation/BootAnimation.cpp +++ b/cmds/bootanimation/BootAnimation.cpp @@ -38,7 +38,7 @@ #include <ui/EGLUtils.h> #include <surfaceflinger/ISurfaceComposer.h> -#include <surfaceflinger/ISurfaceFlingerClient.h> +#include <surfaceflinger/ISurfaceComposerClient.h> #include <core/SkBitmap.h> #include <images/SkImageDecoder.h> diff --git a/cmds/dumpstate/dumpstate.c b/cmds/dumpstate/dumpstate.c index 082e704d6f77..6e9caaf6867c 100644 --- a/cmds/dumpstate/dumpstate.c +++ b/cmds/dumpstate/dumpstate.c @@ -218,8 +218,18 @@ int main(int argc, char *argv[]) { /* switch to non-root user and group */ gid_t groups[] = { AID_LOG, AID_SDCARD_RW, AID_MOUNT }; - setgroups(sizeof(groups)/sizeof(groups[0]), groups); - setuid(AID_SHELL); + if (setgroups(sizeof(groups)/sizeof(groups[0]), groups) != 0) { + LOGE("Unable to setgroups, aborting: %s\n", strerror(errno)); + return -1; + } + if (setgid(AID_SHELL) != 0) { + LOGE("Unable to setgid, aborting: %s\n", strerror(errno)); + return -1; + } + if (setuid(AID_SHELL) != 0) { + LOGE("Unable to setuid, aborting: %s\n", strerror(errno)); + return -1; + } char path[PATH_MAX], tmp_path[PATH_MAX]; pid_t gzip_pid = -1; diff --git a/cmds/input/input b/cmds/input/input index fa9dced0482d..fa9dced0482d 100644..100755 --- a/cmds/input/input +++ b/cmds/input/input diff --git a/cmds/installd/commands.c b/cmds/installd/commands.c index 41f070ca2775..f6f80d1d47e2 100644 --- a/cmds/installd/commands.c +++ b/cmds/installd/commands.c @@ -16,7 +16,7 @@ #include "installd.h" -int install(const char *pkgname, uid_t uid, gid_t gid) +int install(const char *pkgname, int encrypted_fs_flag, uid_t uid, gid_t gid) { char pkgdir[PKG_PATH_MAX]; char libdir[PKG_PATH_MAX]; @@ -24,14 +24,19 @@ int install(const char *pkgname, uid_t uid, gid_t gid) if ((uid < AID_SYSTEM) || (gid < AID_SYSTEM)) { LOGE("invalid uid/gid: %d %d\n", uid, gid); return -1; - } - if (create_pkg_path(pkgdir, PKG_DIR_PREFIX, pkgname, PKG_DIR_POSTFIX)) - return -1; - if (create_pkg_path(libdir, PKG_LIB_PREFIX, pkgname, PKG_LIB_POSTFIX)) - return -1; - + if (encrypted_fs_flag == USE_UNENCRYPTED_FS) { + if (create_pkg_path(pkgdir, PKG_DIR_PREFIX, pkgname, PKG_DIR_POSTFIX)) + return -1; + if (create_pkg_path(libdir, PKG_LIB_PREFIX, pkgname, PKG_LIB_POSTFIX)) + return -1; + } else { + if (create_pkg_path(pkgdir, PKG_SEC_DIR_PREFIX, pkgname, PKG_DIR_POSTFIX)) + return -1; + if (create_pkg_path(libdir, PKG_SEC_LIB_PREFIX, pkgname, PKG_LIB_POSTFIX)) + return -1; + } if (mkdir(pkgdir, 0751) < 0) { LOGE("cannot create dir '%s': %s\n", pkgdir, strerror(errno)); @@ -56,27 +61,38 @@ int install(const char *pkgname, uid_t uid, gid_t gid) return 0; } -int uninstall(const char *pkgname) +int uninstall(const char *pkgname, int encrypted_fs_flag) { char pkgdir[PKG_PATH_MAX]; - if (create_pkg_path(pkgdir, PKG_DIR_PREFIX, pkgname, PKG_DIR_POSTFIX)) - return -1; + if (encrypted_fs_flag == USE_UNENCRYPTED_FS) { + if (create_pkg_path(pkgdir, PKG_DIR_PREFIX, pkgname, PKG_DIR_POSTFIX)) + return -1; + } else { + if (create_pkg_path(pkgdir, PKG_SEC_DIR_PREFIX, pkgname, PKG_DIR_POSTFIX)) + return -1; + } /* delete contents AND directory, no exceptions */ return delete_dir_contents(pkgdir, 1, 0); } -int renamepkg(const char *oldpkgname, const char *newpkgname) +int renamepkg(const char *oldpkgname, const char *newpkgname, int encrypted_fs_flag) { char oldpkgdir[PKG_PATH_MAX]; char newpkgdir[PKG_PATH_MAX]; - if (create_pkg_path(oldpkgdir, PKG_DIR_PREFIX, oldpkgname, PKG_DIR_POSTFIX)) - return -1; - if (create_pkg_path(newpkgdir, PKG_DIR_PREFIX, newpkgname, PKG_DIR_POSTFIX)) - return -1; - + if (encrypted_fs_flag == USE_UNENCRYPTED_FS) { + if (create_pkg_path(oldpkgdir, PKG_DIR_PREFIX, oldpkgname, PKG_DIR_POSTFIX)) + return -1; + if (create_pkg_path(newpkgdir, PKG_DIR_PREFIX, newpkgname, PKG_DIR_POSTFIX)) + return -1; + } else { + if (create_pkg_path(oldpkgdir, PKG_SEC_DIR_PREFIX, oldpkgname, PKG_DIR_POSTFIX)) + return -1; + if (create_pkg_path(newpkgdir, PKG_SEC_DIR_PREFIX, newpkgname, PKG_DIR_POSTFIX)) + return -1; + } if (rename(oldpkgdir, newpkgdir) < 0) { LOGE("cannot rename dir '%s' to '%s': %s\n", oldpkgdir, newpkgdir, strerror(errno)); @@ -85,35 +101,48 @@ int renamepkg(const char *oldpkgname, const char *newpkgname) return 0; } -int delete_user_data(const char *pkgname) +int delete_user_data(const char *pkgname, int encrypted_fs_flag) { char pkgdir[PKG_PATH_MAX]; - if (create_pkg_path(pkgdir, PKG_DIR_PREFIX, pkgname, PKG_DIR_POSTFIX)) - return -1; + if (encrypted_fs_flag == USE_UNENCRYPTED_FS) { + if (create_pkg_path(pkgdir, PKG_DIR_PREFIX, pkgname, PKG_DIR_POSTFIX)) + return -1; + } else { + if (create_pkg_path(pkgdir, PKG_SEC_DIR_PREFIX, pkgname, PKG_DIR_POSTFIX)) + return -1; + } /* delete contents, excluding "lib", but not the directory itself */ return delete_dir_contents(pkgdir, 0, "lib"); } -int delete_cache(const char *pkgname) +int delete_cache(const char *pkgname, int encrypted_fs_flag) { char cachedir[PKG_PATH_MAX]; - if (create_pkg_path(cachedir, CACHE_DIR_PREFIX, pkgname, CACHE_DIR_POSTFIX)) - return -1; - + if (encrypted_fs_flag == USE_UNENCRYPTED_FS) { + if (create_pkg_path(cachedir, CACHE_DIR_PREFIX, pkgname, CACHE_DIR_POSTFIX)) + return -1; + } else { + if (create_pkg_path(cachedir, CACHE_SEC_DIR_PREFIX, pkgname, CACHE_DIR_POSTFIX)) + return -1; + } /* delete contents, not the directory, no exceptions */ return delete_dir_contents(cachedir, 0, 0); } -static int disk_free() +/* TODO(oam): depending on use case (ecryptfs or dmcrypt) + * change implementation + */ +static int64_t disk_free() { struct statfs sfs; if (statfs(PKG_DIR_PREFIX, &sfs) == 0) { return sfs.f_bavail * sfs.f_bsize; } else { + LOGE("Couldn't statfs " PKG_DIR_PREFIX ": %s\n", strerror(errno)); return -1; } } @@ -125,23 +154,56 @@ static int disk_free() * also require that apps constantly modify file metadata even * when just reading from the cache, which is pretty awful. */ -int free_cache(int free_size) +int free_cache(int64_t free_size) { const char *name; int dfd, subfd; DIR *d; struct dirent *de; - int avail; + int64_t avail; avail = disk_free(); if (avail < 0) return -1; - LOGI("free_cache(%d) avail %d\n", free_size, avail); + LOGI("free_cache(%" PRId64 ") avail %" PRId64 "\n", free_size, avail); if (avail >= free_size) return 0; + /* First try encrypted dir */ + d = opendir(PKG_SEC_DIR_PREFIX); + if (d == NULL) { + LOGE("cannot open %s: %s\n", PKG_SEC_DIR_PREFIX, strerror(errno)); + } else { + dfd = dirfd(d); + + while ((de = readdir(d))) { + if (de->d_type != DT_DIR) continue; + name = de->d_name; + + /* always skip "." and ".." */ + if (name[0] == '.') { + if (name[1] == 0) continue; + if ((name[1] == '.') && (name[2] == 0)) continue; + } + + subfd = openat(dfd, name, O_RDONLY | O_DIRECTORY); + if (subfd < 0) continue; + + delete_dir_contents_fd(subfd, "cache"); + close(subfd); + + avail = disk_free(); + if (avail >= free_size) { + closedir(d); + return 0; + } + } + closedir(d); + } + + /* Next try unencrypted dir... */ d = opendir(PKG_DIR_PREFIX); if (d == NULL) { - LOGE("cannot open %s\n", PKG_DIR_PREFIX); + LOGE("cannot open %s: %s\n", PKG_DIR_PREFIX, strerror(errno)); return -1; } dfd = dirfd(d); @@ -217,6 +279,7 @@ int move_dex(const char *src, const char *dst) LOGI("move %s -> %s\n", src_dex, dst_dex); if (rename(src_dex, dst_dex) < 0) { + LOGE("Couldn't move %s: %s\n", src_dex, strerror(errno)); return -1; } else { return 0; @@ -232,6 +295,7 @@ int rm_dex(const char *path) LOGI("unlink %s\n", dex_path); if (unlink(dex_path) < 0) { + LOGE("Couldn't unlink %s: %s\n", dex_path, strerror(errno)); return -1; } else { return 0; @@ -263,10 +327,10 @@ int protect(char *pkgname, gid_t gid) return 0; } -static int stat_size(struct stat *s) +static int64_t stat_size(struct stat *s) { - int blksize = s->st_blksize; - int size = s->st_size; + int64_t blksize = s->st_blksize; + int64_t size = s->st_size; if (blksize) { /* round up to filesystem block size */ @@ -276,9 +340,9 @@ static int stat_size(struct stat *s) return size; } -static int calculate_dir_size(int dfd) +static int64_t calculate_dir_size(int dfd) { - int size = 0; + int64_t size = 0; struct stat s; DIR *d; struct dirent *de; @@ -314,7 +378,7 @@ static int calculate_dir_size(int dfd) int get_size(const char *pkgname, const char *apkpath, const char *fwdlock_apkpath, - int *_codesize, int *_datasize, int *_cachesize) + int64_t *_codesize, int64_t *_datasize, int64_t *_cachesize, int encrypted_fs_flag) { DIR *d; int dfd; @@ -322,9 +386,9 @@ int get_size(const char *pkgname, const char *apkpath, struct stat s; char path[PKG_PATH_MAX]; - int codesize = 0; - int datasize = 0; - int cachesize = 0; + int64_t codesize = 0; + int64_t datasize = 0; + int64_t cachesize = 0; /* count the source apk as code -- but only if it's not * on the /system partition and its not on the sdcard. @@ -349,8 +413,14 @@ int get_size(const char *pkgname, const char *apkpath, } } - if (create_pkg_path(path, PKG_DIR_PREFIX, pkgname, PKG_DIR_POSTFIX)) { - goto done; + if (encrypted_fs_flag == 0) { + if (create_pkg_path(path, PKG_DIR_PREFIX, pkgname, PKG_DIR_POSTFIX)) { + goto done; + } + } else { + if (create_pkg_path(path, PKG_SEC_DIR_PREFIX, pkgname, PKG_DIR_POSTFIX)) { + goto done; + } } d = opendir(path); @@ -375,7 +445,7 @@ int get_size(const char *pkgname, const char *apkpath, } subfd = openat(dfd, name, O_RDONLY | O_DIRECTORY); if (subfd >= 0) { - int size = calculate_dir_size(subfd); + int64_t size = calculate_dir_size(subfd); if (!strcmp(name,"lib")) { codesize += size; } else if(!strcmp(name,"cache")) { diff --git a/cmds/installd/installd.c b/cmds/installd/installd.c index f6ca9980a0fd..c9918459e957 100644 --- a/cmds/installd/installd.c +++ b/cmds/installd/installd.c @@ -29,7 +29,7 @@ static int do_ping(char **arg, char reply[REPLY_MAX]) static int do_install(char **arg, char reply[REPLY_MAX]) { - return install(arg[0], atoi(arg[1]), atoi(arg[2])); /* pkgname, uid, gid */ + return install(arg[0], atoi(arg[1]), atoi(arg[2]), atoi(arg[3])); /* pkgname, uid, gid */ } static int do_dexopt(char **arg, char reply[REPLY_MAX]) @@ -50,22 +50,22 @@ static int do_rm_dex(char **arg, char reply[REPLY_MAX]) static int do_remove(char **arg, char reply[REPLY_MAX]) { - return uninstall(arg[0]); /* pkgname */ + return uninstall(arg[0], atoi(arg[1])); /* pkgname */ } static int do_rename(char **arg, char reply[REPLY_MAX]) { - return renamepkg(arg[0], arg[1]); /* oldpkgname, newpkgname */ + return renamepkg(arg[0], arg[1], atoi(arg[2])); /* oldpkgname, newpkgname */ } static int do_free_cache(char **arg, char reply[REPLY_MAX]) /* TODO int:free_size */ { - return free_cache(atoi(arg[0])); /* free_size */ + return free_cache((int64_t)atoll(arg[0])); /* free_size */ } static int do_rm_cache(char **arg, char reply[REPLY_MAX]) { - return delete_cache(arg[0]); /* pkgname */ + return delete_cache(arg[0], atoi(arg[1])); /* pkgname */ } static int do_protect(char **arg, char reply[REPLY_MAX]) @@ -75,21 +75,25 @@ static int do_protect(char **arg, char reply[REPLY_MAX]) static int do_get_size(char **arg, char reply[REPLY_MAX]) { - int codesize = 0; - int datasize = 0; - int cachesize = 0; + int64_t codesize = 0; + int64_t datasize = 0; + int64_t cachesize = 0; int res = 0; /* pkgdir, apkpath */ - res = get_size(arg[0], arg[1], arg[2], &codesize, &datasize, &cachesize); + res = get_size(arg[0], arg[1], arg[2], &codesize, &datasize, &cachesize, atoi(arg[3])); - sprintf(reply,"%d %d %d", codesize, datasize, cachesize); + /* + * Each int64_t can take up 22 characters printed out. Make sure it + * doesn't go over REPLY_MAX in the future. + */ + snprintf(reply, REPLY_MAX, "%" PRId64 " %" PRId64 " %" PRId64, codesize, datasize, cachesize); return res; } static int do_rm_user_data(char **arg, char reply[REPLY_MAX]) { - return delete_user_data(arg[0]); /* pkgname */ + return delete_user_data(arg[0], atoi(arg[1])); /* pkgname */ } static int do_movefiles(char **arg, char reply[REPLY_MAX]) @@ -105,17 +109,17 @@ struct cmdinfo { struct cmdinfo cmds[] = { { "ping", 0, do_ping }, - { "install", 3, do_install }, + { "install", 4, do_install }, { "dexopt", 3, do_dexopt }, { "movedex", 2, do_move_dex }, { "rmdex", 1, do_rm_dex }, - { "remove", 1, do_remove }, - { "rename", 2, do_rename }, + { "remove", 2, do_remove }, + { "rename", 3, do_rename }, { "freecache", 1, do_free_cache }, - { "rmcache", 1, do_rm_cache }, + { "rmcache", 2, do_rm_cache }, { "protect", 2, do_protect }, - { "getsize", 3, do_get_size }, - { "rmuserdata", 1, do_rm_user_data }, + { "getsize", 4, do_get_size }, + { "rmuserdata", 2, do_rm_user_data }, { "movefiles", 0, do_movefiles }, }; diff --git a/cmds/installd/installd.h b/cmds/installd/installd.h index cfcdb98f7e65..479e4b255f8c 100644 --- a/cmds/installd/installd.h +++ b/cmds/installd/installd.h @@ -19,6 +19,8 @@ #include <stdio.h> #include <stdlib.h> +#include <stdint.h> +#include <inttypes.h> #include <sys/stat.h> #include <dirent.h> #include <unistd.h> @@ -48,16 +50,23 @@ /* elements combined with a valid package name to form paths */ #define PKG_DIR_PREFIX "/data/data/" +#define PKG_SEC_DIR_PREFIX "/data/secure/data/" #define PKG_DIR_POSTFIX "" #define PKG_LIB_PREFIX "/data/data/" +#define PKG_SEC_LIB_PREFIX "/data/secure/data/" #define PKG_LIB_POSTFIX "/lib" #define CACHE_DIR_PREFIX "/data/data/" +#define CACHE_SEC_DIR_PREFIX "/data/secure/data/" #define CACHE_DIR_POSTFIX "/cache" #define APK_DIR_PREFIX "/data/app/" +/* Encrypted File SYstems constants */ +#define USE_ENCRYPTED_FS 1 +#define USE_UNENCRYPTED_FS 0 + /* other handy constants */ #define PROTECTED_DIR_PREFIX "/data/app-private/" @@ -89,16 +98,16 @@ int delete_dir_contents_fd(int dfd, const char *name); /* commands.c */ -int install(const char *pkgname, uid_t uid, gid_t gid); -int uninstall(const char *pkgname); -int renamepkg(const char *oldpkgname, const char *newpkgname); -int delete_user_data(const char *pkgname); -int delete_cache(const char *pkgname); +int install(const char *pkgname, int encrypted_fs_flag, uid_t uid, gid_t gid); +int uninstall(const char *pkgname, int encrypted_fs_flag); +int renamepkg(const char *oldpkgname, const char *newpkgname, int encrypted_fs_flag); +int delete_user_data(const char *pkgname, int encrypted_fs_flag); +int delete_cache(const char *pkgname, int encrypted_fs_flag); int move_dex(const char *src, const char *dst); int rm_dex(const char *path); int protect(char *pkgname, gid_t gid); int get_size(const char *pkgname, const char *apkpath, const char *fwdlock_apkpath, - int *codesize, int *datasize, int *cachesize); -int free_cache(int free_size); + int64_t *codesize, int64_t *datasize, int64_t *cachesize, int encrypted_fs_flag); +int free_cache(int64_t free_size); int dexopt(const char *apk_path, uid_t uid, int is_public); int movefiles(); diff --git a/cmds/installd/utils.c b/cmds/installd/utils.c index 555c19e07aa9..a5e4b5a1557d 100644 --- a/cmds/installd/utils.c +++ b/cmds/installd/utils.c @@ -98,11 +98,13 @@ static int _delete_dir_contents(DIR *d, const char *ignore) subfd = openat(dfd, name, O_RDONLY | O_DIRECTORY); if (subfd < 0) { + LOGE("Couldn't openat %s: %s\n", name, strerror(errno)); result = -1; continue; } subdir = fdopendir(subfd); if (subdir == NULL) { + LOGE("Couldn't fdopendir %s: %s\n", name, strerror(errno)); close(subfd); result = -1; continue; @@ -112,10 +114,12 @@ static int _delete_dir_contents(DIR *d, const char *ignore) } closedir(subdir); if (unlinkat(dfd, name, AT_REMOVEDIR) < 0) { + LOGE("Couldn't unlinkat %s: %s\n", name, strerror(errno)); result = -1; } } else { if (unlinkat(dfd, name, 0) < 0) { + LOGE("Couldn't unlinkat %s: %s\n", name, strerror(errno)); result = -1; } } @@ -133,12 +137,14 @@ int delete_dir_contents(const char *pathname, d = opendir(pathname); if (d == NULL) { + LOGE("Couldn't opendir %s: %s\n", pathname, strerror(errno)); return -errno; } res = _delete_dir_contents(d, ignore); closedir(d); if (also_delete_dir) { if (rmdir(pathname)) { + LOGE("Couldn't rmdir %s: %s\n", pathname, strerror(errno)); res = -1; } } @@ -152,10 +158,12 @@ int delete_dir_contents_fd(int dfd, const char *name) fd = openat(dfd, name, O_RDONLY | O_DIRECTORY); if (fd < 0) { + LOGE("Couldn't openat %s: %s\n", name, strerror(errno)); return -1; } d = fdopendir(fd); if (d == NULL) { + LOGE("Couldn't fdopendir %s: %s\n", name, strerror(errno)); close(fd); return -1; } diff --git a/cmds/servicemanager/bctest.c b/cmds/servicemanager/bctest.c index 6dee8166ed0f..ff5acedfa067 100644 --- a/cmds/servicemanager/bctest.c +++ b/cmds/servicemanager/bctest.c @@ -14,6 +14,7 @@ void *svcmgr_lookup(struct binder_state *bs, void *target, const char *name) struct binder_io msg, reply; bio_init(&msg, iodata, sizeof(iodata), 4); + bio_put_uint32(&msg, 0); // strict mode header bio_put_string16_x(&msg, SVC_MGR_NAME); bio_put_string16_x(&msg, name); @@ -37,7 +38,7 @@ int svcmgr_publish(struct binder_state *bs, void *target, const char *name, void struct binder_io msg, reply; bio_init(&msg, iodata, sizeof(iodata), 4); - + bio_put_uint32(&msg, 0); // strict mode header bio_put_string16_x(&msg, SVC_MGR_NAME); bio_put_string16_x(&msg, name); bio_put_obj(&msg, ptr); diff --git a/cmds/servicemanager/service_manager.c b/cmds/servicemanager/service_manager.c index a2006c177bfd..01cddc6f33e3 100644 --- a/cmds/servicemanager/service_manager.c +++ b/cmds/servicemanager/service_manager.c @@ -193,6 +193,7 @@ int svcmgr_handler(struct binder_state *bs, uint16_t *s; unsigned len; void *ptr; + uint32_t strict_policy; // LOGI("target=%p code=%d pid=%d uid=%d\n", // txn->target, txn->code, txn->sender_pid, txn->sender_euid); @@ -200,8 +201,12 @@ int svcmgr_handler(struct binder_state *bs, if (txn->target != svcmgr_handle) return -1; + // Equivalent to Parcel::enforceInterface(), reading the RPC + // header with the strict mode policy mask and the interface name. + // Note that we ignore the strict_policy and don't propagate it + // further (since we do no outbound RPCs anyway). + strict_policy = bio_get_uint32(msg); s = bio_get_string16(msg, &len); - if ((len != (sizeof(svcmgr_id) / 2)) || memcmp(svcmgr_id, s, sizeof(svcmgr_id))) { fprintf(stderr,"invalid id %s\n", str8(s)); diff --git a/cmds/stagefright/Android.mk b/cmds/stagefright/Android.mk index 34648b56fbcb..9a972841460a 100644 --- a/cmds/stagefright/Android.mk +++ b/cmds/stagefright/Android.mk @@ -1,5 +1,3 @@ -ifeq ($(BUILD_WITH_FULL_STAGEFRIGHT),true) - LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) @@ -9,11 +7,12 @@ LOCAL_SRC_FILES:= \ SineSource.cpp LOCAL_SHARED_LIBRARIES := \ - libstagefright libmedia libutils libbinder + libstagefright libmedia libutils libbinder libstagefright_foundation LOCAL_C_INCLUDES:= \ $(JNI_H_INCLUDE) \ frameworks/base/media/libstagefright \ + frameworks/base/media/libstagefright/include \ $(TOP)/external/opencore/extern_libs_v2/khronos/openmax/include LOCAL_CFLAGS += -Wno-multichar @@ -71,5 +70,3 @@ LOCAL_MODULE_TAGS := debug LOCAL_MODULE:= audioloop include $(BUILD_EXECUTABLE) - -endif diff --git a/cmds/stagefright/record.cpp b/cmds/stagefright/record.cpp index 845c85471f92..c4242817bf4e 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) @@ -147,7 +153,7 @@ int main(int argc, char **argv) { OMXClient client; CHECK_EQ(client.connect(), OK); -#if 1 +#if 0 sp<MediaSource> source = createSource(argv[1]); if (source == NULL) { @@ -165,16 +171,23 @@ int main(int argc, char **argv) { success = success && meta->findInt32(kKeyHeight, &height); CHECK(success); #else - int width = 800; + int width = 720; int height = 480; sp<MediaSource> decoder = new DummySource(width, height); #endif sp<MetaData> enc_meta = new MetaData; // enc_meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_H263); - enc_meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_MPEG4); + // enc_meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_MPEG4); + 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( @@ -183,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(); @@ -193,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; @@ -208,11 +225,14 @@ int main(int argc, char **argv) { encoder->stop(); #endif + printf("$\n"); client.disconnect(); #endif #if 0 CameraSource *source = CameraSource::Create(); + source->start(); + printf("source = %p\n", source); for (int i = 0; i < 100; ++i) { @@ -227,6 +247,8 @@ int main(int argc, char **argv) { buffer = NULL; } + source->stop(); + delete source; source = NULL; #endif @@ -262,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/cmds/stagefright/stagefright.cpp b/cmds/stagefright/stagefright.cpp index b838f320776f..4a1d27b73919 100644 --- a/cmds/stagefright/stagefright.cpp +++ b/cmds/stagefright/stagefright.cpp @@ -25,13 +25,14 @@ #include <binder/IServiceManager.h> #include <binder/ProcessState.h> #include <media/IMediaPlayerService.h> +#include <media/stagefright/foundation/ALooper.h> +#include "include/ARTSPController.h" #include <media/stagefright/AudioPlayer.h> -#include <media/stagefright/CachingDataSource.h> -#include <media/stagefright/FileSource.h> -#include <media/stagefright/HTTPDataSource.h> +#include <media/stagefright/DataSource.h> #include <media/stagefright/JPEGSource.h> #include <media/stagefright/MediaDebug.h> #include <media/stagefright/MediaDefs.h> +#include <media/stagefright/MediaErrors.h> #include <media/stagefright/MediaExtractor.h> #include <media/stagefright/MediaSource.h> #include <media/stagefright/MetaData.h> @@ -39,6 +40,9 @@ #include <media/stagefright/OMXCodec.h> #include <media/mediametadataretriever.h> +#include <media/stagefright/foundation/hexdump.h> +#include <media/stagefright/MPEG4Writer.h> + using namespace android; static long gNumRepetitions; @@ -46,6 +50,8 @@ static long gMaxNumFrames; // 0 means decode all available. static long gReproduceBug; // if not -1. static bool gPreferSoftwareCodec; static bool gPlaybackAudio; +static bool gWriteMP4; +static String8 gWriteMP4Filename; static int64_t getNowUs() { struct timeval tv; @@ -85,6 +91,7 @@ static void playSource(OMXClient *client, const sp<MediaSource> &source) { if (gPlaybackAudio) { AudioPlayer *player = new AudioPlayer(NULL); player->setSource(rawSource); + rawSource.clear(); player->start(true /* sourceAlreadyStarted */); @@ -95,6 +102,8 @@ static void playSource(OMXClient *client, const sp<MediaSource> &source) { delete player; player = NULL; + + return; } else if (gReproduceBug >= 3 && gReproduceBug <= 5) { int64_t durationUs; CHECK(meta->findInt64(kKeyDuration, &durationUs)); @@ -256,6 +265,77 @@ static void playSource(OMXClient *client, const sp<MediaSource> &source) { } } +static void writeSourceToMP4(const sp<MediaSource> &source) { + sp<MPEG4Writer> writer = + new MPEG4Writer(gWriteMP4Filename.string()); + + CHECK_EQ(writer->addSource(source), OK); + + sp<MetaData> params = new MetaData; + CHECK_EQ(writer->start(), OK); + + while (!writer->reachedEOS()) { + usleep(100000); + } + writer->stop(); +} + +static void performSeekTest(const sp<MediaSource> &source) { + CHECK_EQ(OK, source->start()); + + int64_t durationUs; + CHECK(source->getFormat()->findInt64(kKeyDuration, &durationUs)); + + for (int64_t seekTimeUs = 0; seekTimeUs <= durationUs; + seekTimeUs += 60000ll) { + MediaSource::ReadOptions options; + options.setSeekTo( + seekTimeUs, MediaSource::ReadOptions::SEEK_PREVIOUS_SYNC); + + MediaBuffer *buffer; + status_t err; + for (;;) { + err = source->read(&buffer, &options); + + options.clearSeekTo(); + + if (err == INFO_FORMAT_CHANGED) { + CHECK(buffer == NULL); + continue; + } + + if (err != OK) { + CHECK(buffer == NULL); + break; + } + + if (buffer->range_length() > 0) { + break; + } + + CHECK(buffer != NULL); + + buffer->release(); + buffer = NULL; + } + + if (err == OK) { + int64_t timeUs; + CHECK(buffer->meta_data()->findInt64(kKeyTime, &timeUs)); + + printf("%lld\t%lld\t%lld\n", seekTimeUs, timeUs, seekTimeUs - timeUs); + + buffer->release(); + buffer = NULL; + } else { + printf("ERROR\n"); + break; + } + } + + CHECK_EQ(OK, source->stop()); +} + static void usage(const char *me) { fprintf(stderr, "usage: %s\n", me); fprintf(stderr, " -h(elp)\n"); @@ -268,6 +348,8 @@ static void usage(const char *me) { fprintf(stderr, " -t(humbnail) extract video thumbnail or album art\n"); fprintf(stderr, " -s(oftware) prefer software codec\n"); fprintf(stderr, " -o playback audio\n"); + fprintf(stderr, " -w(rite) filename (write to .mp4 file)\n"); + fprintf(stderr, " -k seek test\n"); } int main(int argc, char **argv) { @@ -277,14 +359,19 @@ int main(int argc, char **argv) { bool listComponents = false; bool dumpProfiles = false; bool extractThumbnail = false; + bool seekTest = false; gNumRepetitions = 1; gMaxNumFrames = 0; gReproduceBug = -1; gPreferSoftwareCodec = false; gPlaybackAudio = false; + gWriteMP4 = false; + + sp<ALooper> looper; + sp<ARTSPController> rtspController; int res; - while ((res = getopt(argc, argv, "han:lm:b:ptso")) >= 0) { + while ((res = getopt(argc, argv, "han:lm:b:ptsow:k")) >= 0) { switch (res) { case 'a': { @@ -320,6 +407,13 @@ int main(int argc, char **argv) { break; } + case 'w': + { + gWriteMP4 = true; + gWriteMP4Filename.setTo(optarg); + break; + } + case 'p': { dumpProfiles = true; @@ -344,6 +438,12 @@ int main(int argc, char **argv) { break; } + case 'k': + { + seekTest = true; + break; + } + case '?': case 'h': default: @@ -479,19 +579,10 @@ int main(int argc, char **argv) { for (int k = 0; k < argc; ++k) { const char *filename = argv[k]; - sp<DataSource> dataSource; - if (!strncasecmp("http://", filename, 7)) { - dataSource = new HTTPDataSource(filename); - if (((HTTPDataSource *)dataSource.get())->connect() != OK) { - fprintf(stderr, "failed to connect to HTTP server.\n"); - return -1; - } - dataSource = new CachingDataSource(dataSource, 32 * 1024, 20); - } else { - dataSource = new FileSource(filename); - } + sp<DataSource> dataSource = DataSource::CreateFromURI(filename); - if (dataSource == NULL) { + if ((strncasecmp(filename, "sine:", 5) + && strncasecmp(filename, "rtsp://", 7)) && dataSource == NULL) { fprintf(stderr, "Unable to create data source.\n"); return 1; } @@ -516,10 +607,28 @@ int main(int argc, char **argv) { } mediaSource = new SineSource(sampleRate, 1); } else { - sp<MediaExtractor> extractor = MediaExtractor::Create(dataSource); - if (extractor == NULL) { - fprintf(stderr, "could not create extractor.\n"); - return -1; + sp<MediaExtractor> extractor; + + if (!strncasecmp("rtsp://", filename, 7)) { + if (looper == NULL) { + looper = new ALooper; + looper->start(); + } + + rtspController = new ARTSPController(looper); + status_t err = rtspController->connect(filename); + if (err != OK) { + fprintf(stderr, "could not connect to rtsp server.\n"); + return -1; + } + + extractor = rtspController.get(); + } else { + extractor = MediaExtractor::Create(dataSource); + if (extractor == NULL) { + fprintf(stderr, "could not create extractor.\n"); + return -1; + } } size_t numTracks = extractor->countTracks(); @@ -562,7 +671,20 @@ int main(int argc, char **argv) { mediaSource = extractor->getTrack(i); } - playSource(&client, mediaSource); + if (gWriteMP4) { + writeSourceToMP4(mediaSource); + } else if (seekTest) { + performSeekTest(mediaSource); + } else { + playSource(&client, mediaSource); + } + + if (rtspController != NULL) { + rtspController->disconnect(); + rtspController.clear(); + + sleep(3); + } } client.disconnect(); diff --git a/cmds/surfaceflinger/Android.mk b/cmds/surfaceflinger/Android.mk index bfa58a1cbf7f..1df32bbc272d 100644 --- a/cmds/surfaceflinger/Android.mk +++ b/cmds/surfaceflinger/Android.mk @@ -10,7 +10,7 @@ LOCAL_SHARED_LIBRARIES := \ libutils LOCAL_C_INCLUDES := \ - $(LOCAL_PATH)/../../libs/surfaceflinger + $(LOCAL_PATH)/../../services/surfaceflinger LOCAL_MODULE:= surfaceflinger diff --git a/cmds/surfaceflinger/main_surfaceflinger.cpp b/cmds/surfaceflinger/main_surfaceflinger.cpp index d65072132783..78b1007f5e3c 100644 --- a/cmds/surfaceflinger/main_surfaceflinger.cpp +++ b/cmds/surfaceflinger/main_surfaceflinger.cpp @@ -1,18 +1,25 @@ -#include <binder/IPCThreadState.h> -#include <binder/ProcessState.h> -#include <binder/IServiceManager.h> -#include <utils/Log.h> +/* + * Copyright (C) 2010 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. + */ +#include <binder/BinderService.h> #include <SurfaceFlinger.h> using namespace android; -int main(int argc, char** argv) -{ - sp<ProcessState> proc(ProcessState::self()); - sp<IServiceManager> sm = defaultServiceManager(); - LOGI("ServiceManager: %p", sm.get()); - SurfaceFlinger::instantiate(); - ProcessState::self()->startThreadPool(); - IPCThreadState::self()->joinThreadPool(); +int main(int argc, char** argv) { + SurfaceFlinger::publishAndJoinThreadPool(); + return 0; } diff --git a/cmds/svc/src/com/android/commands/svc/PowerCommand.java b/cmds/svc/src/com/android/commands/svc/PowerCommand.java index d3ec3d98b357..e1d661991601 100644 --- a/cmds/svc/src/com/android/commands/svc/PowerCommand.java +++ b/cmds/svc/src/com/android/commands/svc/PowerCommand.java @@ -64,7 +64,7 @@ public class PowerCommand extends Svc.Command { = IPowerManager.Stub.asInterface(ServiceManager.getService(Context.POWER_SERVICE)); try { IBinder lock = new Binder(); - pm.acquireWakeLock(PowerManager.FULL_WAKE_LOCK, lock, "svc power"); + pm.acquireWakeLock(PowerManager.FULL_WAKE_LOCK, lock, "svc power", null); pm.setStayOnSetting(val); pm.releaseWakeLock(lock, 0); } diff --git a/cmds/system_server/library/Android.mk b/cmds/system_server/library/Android.mk index 1813d3e5ab0c..457cbd4ada8d 100644 --- a/cmds/system_server/library/Android.mk +++ b/cmds/system_server/library/Android.mk @@ -7,14 +7,16 @@ LOCAL_SRC_FILES:= \ base = $(LOCAL_PATH)/../../.. LOCAL_C_INCLUDES := \ - $(base)/camera/libcameraservice \ - $(base)/libs/audioflinger \ - $(base)/libs/surfaceflinger \ + $(base)/services/camera/libcameraservice \ + $(base)/services/audioflinger \ + $(base)/services/surfaceflinger \ + $(base)/services/sensorservice \ $(base)/media/libmediaplayerservice \ $(JNI_H_INCLUDE) LOCAL_SHARED_LIBRARIES := \ libandroid_runtime \ + libsensorservice \ libsurfaceflinger \ libaudioflinger \ libcameraservice \ diff --git a/cmds/system_server/library/system_init.cpp b/cmds/system_server/library/system_init.cpp index 1d57fdcc4c77..a29ba733a0f0 100644 --- a/cmds/system_server/library/system_init.cpp +++ b/cmds/system_server/library/system_init.cpp @@ -19,6 +19,7 @@ #include <CameraService.h> #include <AudioPolicyService.h> #include <MediaPlayerService.h> +#include <SensorService.h> #include <android_runtime/AndroidRuntime.h> @@ -69,6 +70,9 @@ extern "C" status_t system_init() SurfaceFlinger::instantiate(); } + // Start the sensor service + SensorService::instantiate(); + // On the simulator, audioflinger et al don't get started the // same way as on the device, and we need to start them here if (!proc->supportsProcesses()) { |