Commit 047038b9 authored by Adam Barth's avatar Adam Barth

Support non-rooted Android devices

Now we use a debuggable APK and chmod the installation directory to be world
readable/writable.

Fixes https://github.com/flutter/engine/issues/126
parent 4477f725
...@@ -682,8 +682,12 @@ class AndroidDevice extends Device { ...@@ -682,8 +682,12 @@ class AndroidDevice extends Device {
return false; return false;
} }
String _getDeviceDataPath(ApplicationPackage app) {
return '/data/data/${app.id}';
}
String _getDeviceSha1Path(ApplicationPackage app) { String _getDeviceSha1Path(ApplicationPackage app) {
return '/sdcard/${app.id}/${app.name}.sha1'; return '${_getDeviceDataPath(app)}/${app.name}.sha1';
} }
String _getDeviceApkSha1(ApplicationPackage app) { String _getDeviceApkSha1(ApplicationPackage app) {
...@@ -728,14 +732,8 @@ class AndroidDevice extends Device { ...@@ -728,14 +732,8 @@ class AndroidDevice extends Device {
print('Installing ${app.name} on device.'); print('Installing ${app.name} on device.');
runCheckedSync([adbPath, 'install', '-r', app.localPath]); runCheckedSync([adbPath, 'install', '-r', app.localPath]);
runCheckedSync([adbPath, 'shell', 'run-as', app.id, 'chmod', '777', _getDeviceDataPath(app)]);
Directory tempDir = Directory.systemTemp; runCheckedSync([adbPath, 'shell', 'echo', '-n', _getSourceSha1(app), '>', _getDeviceSha1Path(app)]);
String sha1Path = path.join(
tempDir.path, (app.localPath + '.sha1').replaceAll(path.separator, '_'));
File sha1TempFile = new File(sha1Path);
sha1TempFile.writeAsStringSync(_getSourceSha1(app), flush: true);
runCheckedSync([adbPath, 'push', sha1Path, _getDeviceSha1Path(app)]);
sha1TempFile.deleteSync();
return true; return true;
} }
...@@ -897,16 +895,7 @@ class AndroidDevice extends Device { ...@@ -897,16 +895,7 @@ class AndroidDevice extends Device {
} }
if (tracePath != null) { if (tracePath != null) {
// adb root exits with 0 even if the command fails, runSync([adbPath, 'shell', 'run-as', apk.id, 'chmod', '777', tracePath]);
// so check the output string
String output = runSync([adbPath, 'root']);
if (new RegExp(r'.*cannot run as root.*').hasMatch(output)) {
_logging
.severe('Unable to download trace "${path.basename(tracePath)}"\n'
'You need to be able to run adb as root '
'on your android device');
return null;
}
runSync([adbPath, 'pull', tracePath]); runSync([adbPath, 'pull', tracePath]);
runSync([adbPath, 'shell', 'rm', tracePath]); runSync([adbPath, 'shell', 'rm', tracePath]);
return path.basename(tracePath); return path.basename(tracePath);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment