- Backup / transfer personal data (texts, photos, videos, apps, etc)
- Read [ROM][7.1.0_r5][NDE63U][Grouper|Tilapia][F2FS/EXT4]Android 7.x AOSP by AndDiSa
- download aosp_grouper-7.1-ota-eng-20161127.ds.zip (219 MB)
- check MD5 signature (FCIV or a similar tool):
fciv -add aosp_grouper-7.1-ota-eng-20161127.ds.zip -md5
- Install Android SDK / platform-tools
- Install TWRP (Team Win Recovery Project) for Nexus 7 2012 Wifi
(twrp-3.0.2-0-grouper.img, 2016-04-04, 93 MB)
Follow Fastboot Install Method (No Root Required) section.
- Boot into recovery mode (TWRP) with:
adb reboot-bootloader
Use Volume Up or Down keys to select "Recovery Mode", then press "Power".
- Now in TWRP, choose Wipe > Swipe to fatory reset
- Back to TWRP main screen > Advanced > ADB Sideload > Swipe to Start Sideload
- Sideload new ROM from your PC:
adb sideload aosp_grouper-7.1-ota-eng-20161127.ds.zip Total xfer: 1.00x
Note: E: unknown error [log] causes or implications are yet unknown, ignoring for now.
- Go to Open GApps, choose ARM + Android 7.1 + Pico.
- download open_gapps-arm-7.1-pico-20161205.zip, 5 December 2016, 121 MB
- check MD5 signature (FCIV or a similar tool):
fciv -add aosp_grouper-7.1-ota-eng-20161127.ds.zip -md5
- Sideload Open GApps:
- go back and reselect Sideload option
- select Wipe Dalvik Cach
- Swipe to Start Sideload
adb sideload open_gapps-arm-7.1-pico-20161205.zip Total xfer: 1.19x
- Reboot (TWRP Main > Reboot > System).
Tuesday, December 6, 2016
Android 7.1 Nougat on Nexus 7 2012 WiFi
Wednesday, November 16, 2016
Windows 10 Anniversary Update on ASUS R2H - "End of the Road"
My ASUS R2H came with Windows XP Tablet Edition, qualifying for a free upgrade to Windows Vista, followed by quite a number of pre-release, preview, trial and final versions of Windows 7, Windows 8 and 8.1, and finally Windows 10. In spite of the fact that the actual support from ASUS and Intel ended with Windows Vista, it has been possible to run for much longer thanks to Windows support for legacy devices from Microsoft.
It is finally time to declare End of the Road for Windows with so appropriately release named: Windows 10 Anniversay Update (version 1607, build 14393.447)
ASUS R2H-BG059T
- 7" screen (800x480), touchscreen / stylus
- Intel Celeron M 353 Dothan
- 1.25 GB RAM (256 MB soldered + 1 GB module)
- Intel Mobile 915GM Express Chipset
- Intel Graphics GMA 900
- Hitachi Travelstar HTC426060G8CE00 (1.8", 4200 rpm, 60 GB)
- ASUS WL-159G WiFi (Atheros / ZyDAS ZD1211)
- ASUS BT-183 Bluetooth
- ASUS Driver & Tools support page
Windows 10 Anniversary Update
version 1607, build 14393.447
- How to get the Windows 10 Anniversary Update
- Windows 10 (Multiple Editions), Version 1607 (Updated Jul 2016) (x86) - DVD (English)
➤ Graphics
Graphics performance of the old Intel GMA 900 is quite poor with Microsoft Basic Display Adapter driver (v10.0.14393.0, 21 Jun 2006).
ASUS graphics driver for Windows Vista (v6.14.10.4764, 15 Mar 2007) will not install anymore, XPDM (XP Display Model) drivers are not supported starting with Windows 8.
➤ Touch screen
Calibrate using Digitiser Calibration Tool (tabcal.exe)
➤ Audio
ASUS audio driver for Windows Vista (v6.10.1.6030, 15 Mar 2007)
➤ Webcam
➤ Thumbstick
➤ Fingerprint
Works fine with Windows (AuthenTec) driver (v3.4.4.84, 11 Oct 2012). Enrol your fingerprint(s) in Settings > Accounts > Sign-In Options. Fingerprint Set Up button might be disabled if you haven't configured a text password yet - should do that first and then come back to it.
➤ Bluetooth
Works fine with generic Microsoft driver (10.0.14393.351, 21 Jun 2006). ASUS Bluetooth driver for Windows Vista (v5.10.02, 12 Feb 2007) would not install.
➤ WiFi
Works with Windows (Atheros) provided driver (v2.2.0.27, 29 Jul 2008). You can install ASUS Wireless driver for Windows Vista (v2.0.0.130, 17 Aug 2007) but after installing ASUS Wireless Console (v2.0.8, 7 Mar 2007)
➤ Ethernet
Works with Windows (Realtek) provided driver (v10.9.422.2016, 22 Apr 2016). You may try to install the ASUS LAN driver for Windows Vista (V6.190.115.2007, 24 Jul 2007).
➤ GPS
Enable GPS receiver (NMEA 0183 on COM1, 4800 baud) with device_switch.exe part of ASUS Device Switch (v1.0.0.1, 25 Jul 2007) or the open source eqivalent gpsCtrl.exe (dandar3/ASUS-R2H-gpsCtrl on GitHub).
Tested with GPSDirect (Sensor Driver > Install, followed by Tests > Sensor Explorer On) and MTTTY Serial Terminal (COM1, 4800, 8-N-1, followed by File > Connect).
Tested with GPSDirect (Sensor Driver > Install, followed by Tests > Sensor Explorer On) and MTTTY Serial Terminal (COM1, 4800, 8-N-1, followed by File > Connect).
Saturday, November 5, 2016
Eclipse: Integrate Firebase Analytics into your Android app
With official support moving away from Eclipse towards Android Studio and Gradle, new things like Firebase Analytics have become unavailable to developers wanting to continue using Eclipse for their app development. In this post, I will go through the libraries and the configuration required so you can integrate it in your Eclipse project.
You will observe compile errors like Tag ... attribute name has invalid character '$' after importing libraries like android-google-firebase-iid or android-google-firebase-common. To resolve the issue you will have to manually replace
Firebase Analytics libraries
dandar3/android-google-firebase-README project (GitHub) gives you an overview of the available Firebase libraires ready to use with your Eclipse project. Have a look at the two YouTube videos at the end covering the installation of the Subversive plugin and the steps to easily import an entire project set like Firebase Analytics into your workspace.
You will observe compile errors like Tag ... attribute name has invalid character '$' after importing libraries like android-google-firebase-iid or android-google-firebase-common. To resolve the issue you will have to manually replace
${applicationId}
with your application id (Java package) in all AndroidManifest.xml files (use CTRL+H > File Search > Replace...) Importing google-services.json
There is no Eclipse plugin to do the work that the Google Services Gradle plugin does for Android Studio (I have started working on one, but I can't say when this will be available), so you would have to read the Firebase documentation and follow the Processing the JSON File information to manually create your own values.xml.
If you're having trouble with getting this right you could use Android Studio to import firebase/quickstart-android GitHub project, deploy your google-services.json into it and then copy the generated values.xml out.
If you're having trouble with getting this right you could use Android Studio to import firebase/quickstart-android GitHub project, deploy your google-services.json into it and then copy the generated values.xml out.
You can also try the web conversion tool I wrote, the conversion is done in your browser through JavaScript like you would do it manually. You need to download your google-services.json from Firebase Console, then use the tool to open it and will generate your values.xml just like you would manually do it.
This is the undocumented part that can only be observed by looking at the AndroidManifest.xml generated by Google Services Gradle plugin (app\intermediates\manifests\full\debug\AndroidManifest.xml).
Without these changes you would get all sorts of errors in logcat when running your app, some of them listed below:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="default_web_client_id" translatable="false">{YOUR_CLIENT}/oauth_client/[first client_type 3]</string> <string name="gcm_defaultSenderId" translatable="false">project_info/project_number</string> <string name="firebase_database_url" translatable="false">project_info/firebase_url</string> <string name="google_app_id" translatable="false">{YOUR_CLIENT}/client_info/mobilesdk_app_id</string> <string name="google_api_key" translatable="false">{YOUR_CLIENT}/services/api_key/current_key</string> <string name="google_storage_bucket" translatable="false">project_info/storage_bucket</string> </resources>
AndroidManifest.xml changes
This is the undocumented part that can only be observed by looking at the AndroidManifest.xml generated by Google Services Gradle plugin (app\intermediates\manifests\full\debug\AndroidManifest.xml).
<?xml version="1.0" encoding="utf-8"?> <manifest> [...] <!-- Required permission for App measurement to run. --> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> <permission android:name="${applicationId}.permission.C2D_MESSAGE" android:protectionLevel="signature" /> <uses-permission android:name="${applicationId}.permission.C2D_MESSAGE" /> <application> [...] <receiver android:name="com.google.android.gms.measurement.AppMeasurementReceiver" android:enabled="true" android:exported="false" > </receiver> <receiver android:name="com.google.android.gms.measurement.AppMeasurementInstallReferrerReceiver" android:enabled="true" android:permission="android.permission.INSTALL_PACKAGES" > <intent-filter> <action android:name="com.android.vending.INSTALL_REFERRER" /> </intent-filter> </receiver> <service android:name="com.google.android.gms.measurement.AppMeasurementService" android:enabled="true" android:exported="false" /> <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> <provider android:name="com.google.firebase.provider.FirebaseInitProvider" android:authorities="${applicationId}.firebaseinitprovider" android:exported="false" android:initOrder="100" /> <receiver android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver" android:exported="true" android:permission="com.google.android.c2dm.permission.SEND" > <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> <category android:name="${applicationId}" /> </intent-filter> </receiver> <!-- Internal (not exported) receiver used by the app to start its own exported services without risk of being spoofed. --> <receiver android:name="com.google.firebase.iid.FirebaseInstanceIdInternalReceiver" android:exported="false" /> <!-- FirebaseInstanceIdService performs security checks at runtime, no need for explicit permissions despite exported="true" --> <service android:name="com.google.firebase.iid.FirebaseInstanceIdService" android:exported="true" > <intent-filter android:priority="-500" > <action android:name="com.google.firebase.INSTANCE_ID_EVENT" /> </intent-filter> </service> </application> </manifest>
Without these changes you would get all sorts of errors in logcat when running your app, some of them listed below:
11-04 15:56:22.970 E/FA ( 1539): AppMeasurementReceiver not registered/enabled 11-04 15:56:22.971 E/FA ( 1539): AppMeasurementService not registered/enabled ... 11-04 16:01:23.188 W/FA ( 1694): Failed to retrieve Firebase Instance Id ... 11-04 16:01:36.391 E AndroidRuntime: Process: com.google.firebase.quickstart.analytics, PID: 1718 11-04 16:01:36.391 E AndroidRuntime: java.lang.RuntimeException: Unable to start receiver com.google.android.gms.measurement.AppMeasurementReceiver: java.lang.SecurityException: Neither user 10067 nor current process has android.permission.WAKE_LOCK.
Testing
Enable verbose / debug logging for Firebase Analytics (docs):
adb logcat -c adb shell setprop log.tag.FA VERBOSE adb shell setprop log.tag.FA-SVC VERBOSE adb logcat -v time -s FA FA-SVC
If everything looks fine you may notice the upload scheduling is nothing close to Google Analytics (1h to 12h) - Steve Ganem, Product Manager at Firebase Analytics, confirms on StackOverflow he is aware of the need for quicker reporting.
11-05 21:01:21.560 V/FA ( 1418): Upload scheduled in approximately ms: 3599998
One way to trigger the initial upload found by Yapaxi user on the same thread, is to Clear data for your app. That will not make the information immediately on the Firebase Console web app, it could take up to an hour or more before the reports are made available.
--------- beginning of system --------- beginning of main 11-05 21:25:17.413 I/FA ( 1761): App measurement is starting up, version: 9877 11-05 21:25:17.413 I/FA ( 1761): To enable debug logging run: adb shell setprop log.tag.FA VERBOSE 11-05 21:25:17.413 D/FA ( 1761): Debug-level message logging enabled 11-05 21:25:17.413 D/FA ( 1761): AppMeasurement singleton hash: 96720111 11-05 21:25:17.418 V/FA ( 1761): Collection enabled 11-05 21:25:17.418 V/FA ( 1761): App package, google app id: com.google.firebase.quickstart.analytics, 1:348775509088:android:a9b2141120408d37 [...] 11-05 21:25:27.931 V/FA ( 1761): Uploading data. app, uncompressed size, data: com.google.firebase.quickstart.analytics, 445, 11-05 21:25:27.931 V/FA ( 1761): batch { 11-05 21:25:27.931 V/FA ( 1761): bundle { 11-05 21:25:27.931 V/FA ( 1761): protocol_version: 1 11-05 21:25:27.931 V/FA ( 1761): platform: android 11-05 21:25:27.931 V/FA ( 1761): gmp_version: 9877 11-05 21:25:27.931 V/FA ( 1761): uploading_gmp_version: 9877 11-05 21:25:27.931 V/FA ( 1761): config_version: 1477992761690000 11-05 21:25:27.931 V/FA ( 1761): gmp_app_id: 1:348775509088:android:a9b2141120408d37 11-05 21:25:27.931 V/FA ( 1761): app_id: com.google.firebase.quickstart.analytics [...] 11-05 21:25:27.931 V/FA ( 1761): } 11-05 21:25:27.931 V/FA ( 1761): } 11-05 21:25:27.931 V/FA ( 1761): Uploading data. size: 431 11-05 21:25:28.039 V/FA ( 1761): Upload scheduled in approximately ms: 3599999 11-05 21:25:28.042 V/FA ( 1761): Successful upload. Got network response. code, size: 204, 0
That's it - check your data up on Firebase Console an hour or so later.
Friday, September 30, 2016
How to import Android libraries from GitHub/dandar3 into Eclipse workspace
Showing you today an easier way of importing Android Support and Google Play Services libraries for Android from github.com/dandar3 repositories into your Eclipse workspace.
Prerequisites:
Navigate to:
Choose the project you want to import (e.g. android-support-v7-appcompat).
Scroll down to SVN Checkout section, right-click the Team Project Set URL and choose Copy link to copy it to clipboard.
Switch to Eclipse then navigate to File > Import > Team > Team Project Set.
Paste the address into the URL field (if not already pre-populated from clipboard), then click Finish.
The download (import) may take a short while dependening on your Internet connection.
Once finished, wait for Eclipse to rebuild all projects or manually choose Project > Clean > Clean all projects and check the Start a build immediately both with Build the entire workspace option.
Then you can add the library (or libraries) as a dependency to your application.
Prerequisites:
- Install Eclipse Subversive SVN plugin first
https://www.youtube.com/watch?v=04L4rkykWZw
Navigate to:
- Android Support Library (overview project)
http://github.com/dandar3/android-support-library-README
or - Google Play Services (overview project)
http://github.com/dandar3/android-google-play-services-README
Choose the project you want to import (e.g. android-support-v7-appcompat).
Scroll down to SVN Checkout section, right-click the Team Project Set URL and choose Copy link to copy it to clipboard.
Switch to Eclipse then navigate to File > Import > Team > Team Project Set.
Paste the address into the URL field (if not already pre-populated from clipboard), then click Finish.
The download (import) may take a short while dependening on your Internet connection.
Once finished, wait for Eclipse to rebuild all projects or manually choose Project > Clean > Clean all projects and check the Start a build immediately both with Build the entire workspace option.
Then you can add the library (or libraries) as a dependency to your application.
Tuesday, September 6, 2016
Eclipse: Setting "derived" folders - AutoDeriv plugin
Using Eclipse with Java or Android projects you may notice that "Open Resource" (CTRL+SHIFT+R on Windows) is showing files from bin (or gen or other) folders, that were copied or generated by the build process, that you really
don't want to edit as they will get overwritten on next build, resulting only in frustration and wasted time if you do.
Eclipse documentation for Derived resources:
AutoDeriv plugin comes to help as it relies on configuration stored in a .derived file in your project that can be commited in a source repository. When the project is created the plugin will automatically mark as derived the resources matched in the configuration file.
The plugin also has a preferences page where you can change certain things like presentation.
References:
Eclipse documentation for Derived resources:
Many resources get created in the course of translating, compiling, copying, or otherwise processing files that the user creates and edits. Derived resources are resources that are not original data, and can be recreated from their source files. It is common for derived files to be excluded from certain kinds of processing.You can manually update derived the flag on each resource in Properties page but as the resource will not be persisted in a source repository the flag won't as well. So that when you are checking out or downloading the project it will not be set, or when manually removing and recreating the particular resource in the case of a folder.
AutoDeriv plugin comes to help as it relies on configuration stored in a .derived file in your project that can be commited in a source repository. When the project is created the plugin will automatically mark as derived the resources matched in the configuration file.
The plugin also has a preferences page where you can change certain things like presentation.
References:
- Eclipse - Derived Resources
- AutoDeriv (homepage)
- AutoDeriv (GitHub)