From f4d280ce40ba0aa50d6b2c70d8031ddf7678d179 Mon Sep 17 00:00:00 2001 From: Zhomart Mukhamejanov Date: Tue, 17 Apr 2018 13:20:22 -0700 Subject: sample_updater: add non-streaming demo SampleUpdater app was tested manually on a device. There are unit tests for utility classes. SampleUpdater app demonstrates how to use Android Update Engine to apply A/B (seamless) update. This CL contains demo of non-stream update using async update_engine, which is accessed directly from an activity. This app also shows logs from update_engine on the UI. Instructions can be found in `README.md`. - Create a UI with list of configs, current version, control buttons and a progress bar - Add PayloadSpec and PayloadSpecs for working with update zip file - Add UpdateConfig for working with json config files - Add applying non-streaming update Test: tested manually and unit tests for utilities Change-Id: I05d4a46ad9cf8b334c9c60c7dd4da486dac0400a Signed-off-by: Zhomart Mukhamejanov --- sample_updater/.gitignore | 9 + sample_updater/Android.mk | 11 +- sample_updater/AndroidManifest.xml | 27 +- sample_updater/README.md | 73 ++++- sample_updater/res/layout/activity_main.xml | 171 ++++++++++- sample_updater/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3056 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 5024 bytes sample_updater/res/raw/sample.json | 22 ++ sample_updater/res/values/strings.xml | 21 ++ .../android/update/ui/SystemUpdateActivity.java | 68 ----- .../android/systemupdatersample/PayloadSpec.java | 122 ++++++++ .../android/systemupdatersample/UpdateConfig.java | 183 ++++++++++++ .../systemupdatersample/ui/MainActivity.java | 314 +++++++++++++++++++++ .../updates/AbNonStreamingUpdate.java | 52 ++++ .../util/PackagePropertyFiles.java | 42 +++ .../systemupdatersample/util/PayloadSpecs.java | 117 ++++++++ .../systemupdatersample/util/UpdateConfigs.java | 82 ++++++ .../util/UpdateEngineErrorCodes.java | 84 ++++++ .../util/UpdateEngineStatuses.java | 51 ++++ sample_updater/tests/Android.mk | 32 +++ sample_updater/tests/AndroidManifest.xml | 31 ++ sample_updater/tests/build.properties | 1 + .../systemupdatersample/UpdateConfigTest.java | 79 ++++++ .../systemupdatersample/ui/MainActivityTest.java | 48 ++++ .../systemupdatersample/util/PayloadSpecsTest.java | 117 ++++++++ .../util/UpdateConfigsTest.java | 63 +++++ 26 files changed, 1723 insertions(+), 97 deletions(-) create mode 100644 sample_updater/.gitignore create mode 100644 sample_updater/res/mipmap-hdpi/ic_launcher.png create mode 100644 sample_updater/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 sample_updater/res/raw/sample.json create mode 100644 sample_updater/res/values/strings.xml delete mode 100644 sample_updater/src/com/android/update/ui/SystemUpdateActivity.java create mode 100644 sample_updater/src/com/example/android/systemupdatersample/PayloadSpec.java create mode 100644 sample_updater/src/com/example/android/systemupdatersample/UpdateConfig.java create mode 100644 sample_updater/src/com/example/android/systemupdatersample/ui/MainActivity.java create mode 100644 sample_updater/src/com/example/android/systemupdatersample/updates/AbNonStreamingUpdate.java create mode 100644 sample_updater/src/com/example/android/systemupdatersample/util/PackagePropertyFiles.java create mode 100644 sample_updater/src/com/example/android/systemupdatersample/util/PayloadSpecs.java create mode 100644 sample_updater/src/com/example/android/systemupdatersample/util/UpdateConfigs.java create mode 100644 sample_updater/src/com/example/android/systemupdatersample/util/UpdateEngineErrorCodes.java create mode 100644 sample_updater/src/com/example/android/systemupdatersample/util/UpdateEngineStatuses.java create mode 100644 sample_updater/tests/Android.mk create mode 100644 sample_updater/tests/AndroidManifest.xml create mode 100644 sample_updater/tests/build.properties create mode 100644 sample_updater/tests/src/com/example/android/systemupdatersample/UpdateConfigTest.java create mode 100644 sample_updater/tests/src/com/example/android/systemupdatersample/ui/MainActivityTest.java create mode 100644 sample_updater/tests/src/com/example/android/systemupdatersample/util/PayloadSpecsTest.java create mode 100644 sample_updater/tests/src/com/example/android/systemupdatersample/util/UpdateConfigsTest.java diff --git a/sample_updater/.gitignore b/sample_updater/.gitignore new file mode 100644 index 000000000..487263f73 --- /dev/null +++ b/sample_updater/.gitignore @@ -0,0 +1,9 @@ +*~ +*.bak +*.pyc +*.pyc-2.4 +Thumbs.db +*.iml +.idea/ +gen/ +.vscode diff --git a/sample_updater/Android.mk b/sample_updater/Android.mk index 2b0fcbeec..2786de44f 100644 --- a/sample_updater/Android.mk +++ b/sample_updater/Android.mk @@ -15,13 +15,18 @@ # LOCAL_PATH := $(call my-dir) - include $(CLEAR_VARS) -LOCAL_PACKAGE_NAME := SystemUpdateApp +LOCAL_PACKAGE_NAME := SystemUpdaterSample LOCAL_SDK_VERSION := system_current -LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_TAGS := samples + +# TODO: enable proguard and use proguard.flags file +LOCAL_PROGUARD_ENABLED := disabled LOCAL_SRC_FILES := $(call all-java-files-under, src) include $(BUILD_PACKAGE) + +# Use the following include to make our test apk. +include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/sample_updater/AndroidManifest.xml b/sample_updater/AndroidManifest.xml index 66414b5d3..5bbb21c84 100644 --- a/sample_updater/AndroidManifest.xml +++ b/sample_updater/AndroidManifest.xml @@ -15,17 +15,22 @@ --> + package="com.example.android.systemupdatersample"> - - - - - - - - + - + + + + + + + + + diff --git a/sample_updater/README.md b/sample_updater/README.md index a06c52d4b..467ef5d4a 100644 --- a/sample_updater/README.md +++ b/sample_updater/README.md @@ -1 +1,72 @@ -# System update sample app. +# SystemUpdaterSample + +This app demonstrates how to use Android system updates APIs to install +[OTA updates](https://source.android.com/devices/tech/ota/). It contains a sample +client for `update_engine` to install A/B (seamless) updates and a sample of +applying non-A/B updates using `recovery`. + +A/B (seamless) update is available since Android Nougat (API 24), but this sample +targets the latest android. + + +## Running on a device + +The commands expected to be run from `$ANDROID_BUILD_TOP`. + +1. Compile the app `$ mmma bootable/recovery/sample_updater`. +2. Install the app to the device using `$ adb install `. +3. Add update config files. + + +## Update Config file + +Directory can be found in logs or on UI. Usually json config files are located in +`/data/user/0/com.example.android.systemupdatersample/files/configs/`. Example file +is located at `res/raw/sample.json`. + + +## Development + +- [x] Create a UI with list of configs, current version, + control buttons, progress bar and log viewer +- [x] Add `PayloadSpec` and `PayloadSpecs` for working with + update zip file +- [x] Add `UpdateConfig` for working with json config files +- [x] Add applying non-streaming update +- [ ] Add applying streaming update +- [ ] Prepare streaming update (partially downloading package) +- [ ] Add tests for `MainActivity` +- [ ] Add stop/reset the update +- [ ] Verify system partition checksum for package +- [ ] HAL compatibility check +- [ ] Change partition demo +- [ ] Add non-A/B updates demo + + +## Running tests + +1. Build `$ mmma bootable/recovery/sample_updater/` +2. Install app + `$ adb install $OUT/system/app/SystemUpdaterSample/SystemUpdaterSample.apk` +3. Install tests + `$ adb install $OUT/testcases/SystemUpdaterSampleTests/SystemUpdaterSampleTests.apk` +4. Run tests + `$ adb shell am instrument -w com.example.android.systemupdatersample.tests/android.support.test.runner.AndroidJUnitRunner` +5. Run a test file + ``` + $ adb shell am instrument \ + -w com.example.android.systemupdatersample.tests/android.support.test.runner.AndroidJUnitRunner \ + -c com.example.android.systemupdatersample.util.PayloadSpecsTest + ``` + + +## Getting access to `update_engine` API and read/write access to `/data` + +Run adb shell as a root, and set SELinux mode to permissive (0): + +```txt +$ adb root +$ adb shell +# setenforce 0 +# getenforce +``` diff --git a/sample_updater/res/layout/activity_main.xml b/sample_updater/res/layout/activity_main.xml index bd7d68677..3cd772107 100644 --- a/sample_updater/res/layout/activity_main.xml +++ b/sample_updater/res/layout/activity_main.xml @@ -1,20 +1,163 @@ - + 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. +--> + android:orientation="vertical" + android:padding="4dip" + android:gravity="center_horizontal" + android:layout_width="fill_parent" + android:layout_height="fill_parent"> + + + + + + + + + + + + + + + + + + + +