Bug 37422 - Release Build Still Creates ".__override__ " Directory
Summary: Release Build Still Creates ".__override__ " Directory
Status: VERIFIED FIXED
Alias: None
Product: Android
Classification: Xamarin
Component: General (show other bugs)
Version: 6.0.1 (C6SR1)
Hardware: PC Mac OS
: Highest critical
Target Milestone: C6SR2
Assignee: dean.ellis
URL:
Depends on:
Blocks:
 
Reported: 2016-01-05 20:09 UTC by Jimmy [MSFT]
Modified: 2016-03-03 11:39 UTC (History)
6 users (show)

See Also:
Tags: BZSRC6S1
Is this bug a regression?: ---
Last known good build:


Attachments
logcat (10.23 KB, text/plain)
2016-01-05 20:09 UTC, Jimmy [MSFT]
Details

Description Jimmy [MSFT] 2016-01-05 20:09:15 UTC
Created attachment 14450 [details]
logcat

### Overview

A release build of an Android app will still create a writeable “.__override__” directory in the app’s data directory. According to this post[1], the directory is supposed to be created only for debug builds, _not_ release.

I did some testing and this seems to be a regression in 6.0 and still in the latest alpha build since the issue doesn’t occur in 5.1: https://gist.github.com/jimmgarrido/59f80b59ea742c62091e

[1] https://forums.xamarin.com/discussion/comment/50436/#Comment_50436


### Environment Info
=== Xamarin Studio ===

Version 5.10.1 (build 6)
Installation UUID: 94ce5106-6a72-4691-b34e-cd5857b1db66
Runtime:
	Mono 4.2.1 (explicit/6dd2d0d)
	GTK+ 2.24.23 (Raleigh theme)

	Package version: 402010102

=== Xamarin.Profiler ===

Version: 0.24.0.0
Location: /Applications/Xamarin Profiler.app/Contents/MacOS/Xamarin Profiler

=== Apple Developer Tools ===

Xcode 7.2 (9548)
Build 7C68

=== Xamarin.iOS ===

Version: 9.4.0.0 (Business Edition)
Hash: 7322991
Branch: master
Build date: 2015-12-08 16:20:29-0500

=== Xamarin.Android ===

Version: 6.0.1.5 (Business Edition)
Android SDK: /Users/jimmygarrido/Library/Developer/Xamarin/android-sdk-macosx
	Supported Android versions:
		2.3   (API level 10)
		4.0.3 (API level 15)
		4.1   (API level 16)
		4.4   (API level 19)
		5.0   (API level 21)
		5.1   (API level 22)
		6.0   (API level 23)

SDK Tools Version: 24.4.1
SDK Platform Tools Version: 23.1
SDK Build Tools Version: 22.0.1

Java SDK: /usr
java version "1.7.0_79"
Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)

=== Xamarin Android Player ===

Version: 0.6.5
Location: /Applications/Xamarin Android Player.app

=== Xamarin.Mac ===

Version: 2.4.0.109 (Business Edition)

=== Build Information ===

Release ID: 510010006
Git revision: 0b60eecdb531933734519c13257d16a780274aab
Build date: 2015-12-04 20:28:20-05
Xamarin addins: 9876fd7c9837977178411ec7375b4352c0a0d6af
Build lane: monodevelop-lion-cycle6-baseline

=== Operating System ===

Mac OS X 10.11.2
Darwin Jimmys-MacBook-Pro.local 15.2.0 Darwin Kernel Version 15.2.0
    Fri Nov 13 19:56:56 PST 2015
    root:xnu-3248.20.55~2/RELEASE_X86_64 x86_64
Comment 2 Jonathan Pryor 2016-01-05 22:26:35 UTC
> According to this post[1], the directory is supposed to be created only for debug
> builds, _not_ release.

Correct.

> I did some testing and this seems to be a regression in 6.0

There's a difference between *log files* saying it's *looking* for a file there, vs. *the directory actually existing*.

Repro:

1. Create new project (default template).
2. Set Configuration to Release
3. Build + Run

`adb logcat` contains:

> 01-05 16:58:33.098 25736 25736 W monodroid: Trying to load sgen from: /storage/emulated/0/Android/data/scratch.bxc37422/files/.__override__/libmonosgen-2.0.so


i.e. it's *looking* for a file in the `.__override__` directory.

However:

> $ adb shell ls -l /storage/emulated/0/Android/data/scratch.bxc37422/files/.__override__
> /storage/emulated/0/Android/data/scratch.bxc37422/files/.__override__: No such file or directory

The directory doesn't exist.

> $ adb shell ls -l /storage/emulated/0/Android/data/scratch.bxc37422
> /storage/emulated/0/Android/data/scratch.bxc37422: No such file or directory

Nor does an app-specific external storage directory.

That said...

> 01-05 17:18:42.333 29613 29613 W monodroid: Trying to load sgen from: /data/user/0/scratch.bxc37422/files/.__override__/libmonosgen-2.0.so

> $ adb shell ls -a /data/user/0/scratch.bxc37422/files/.__override__

*That* is troubling; there's no error message. It therefore exists.

Additional analysis shows that the Debug runtime is being embedded into the app, which is *not* what should be happening.

Thank you for the report.
Comment 3 Jonathan Pryor 2016-01-05 22:43:49 UTC
Enable diagnostic build output, and see:

>                 Mandroid Task
> ...
>                   Debug: True

That's not good. :-(

The Debug value is $(AndroidUseDebugRuntime).

Rebuild the app with the $(AndroidUseDebugRuntime) property set to False fixes the issue:

$ xbuild /p:Configuration=Release /p:AndroidUseDebugRuntime=False /t:SignAndroidPackage App.csproj

So a "workaround" exists, but it's a workaround that shouldn't be necessary.

The problem is in (either? both?) Xamarin.Android.Common.targets and the App.csproj file.

Xamarin.Android.Common.targets:

> 	<AndroidUseDebugRuntime Condition="'$(AndroidUseDebugRuntime)' == '' And '$(AndroidUseSharedRuntime)' == 'False' And '$(EmbedAssembliesIntoApk)' == 'True' And '$(DebugType)' != 'Full'" >False</AndroidUseDebugRuntime>
> 	<AndroidUseDebugRuntime Condition="'$(AndroidUseDebugRuntime)' == ''" >True</AndroidUseDebugRuntime>

The default App.csproj as generated by Xamarin Studio 5.10.1:

> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
>   <DebugType>full</DebugType>
>   <Optimize>true</Optimize>
>   <OutputPath>bin\Release</OutputPath>
>   <ErrorReport>prompt</ErrorReport>
>   <WarningLevel>4</WarningLevel>
>   <AndroidUseSharedRuntime>false</AndroidUseSharedRuntime>
>   <ConsolePause>false</ConsolePause>
> </PropertyGroup>

We can manually walk through the //AndroidUseDebugRuntime/@Condition expression, and see that the first line will *not* be executed, i.e. $(AndroidUseDebugRuntime) will be True (the 2nd line), because $(DebugType) is Full. (Why is $(DebugType) defaulting to True?!)

Is this a recent Xamarin Studio change?
Comment 4 Jonathan Pryor 2016-01-06 14:33:08 UTC
> Is this a recent Xamarin Studio change?

David Karlaš did some exploration, and it doesn't seem that Xamarin Studio has changed behavior here.

He suggests that we also check for '$(DebugSymbols)'=='True' in addition to (instead of?) '$(DebugType)'=='Full'.
Comment 5 dean.ellis 2016-01-18 12:00:07 UTC
Fixed in monodroid/master/532f5db7
Comment 6 Danish Akhtar 2016-03-01 08:54:47 UTC
***********************
Reproduce Status
***********************
I have reproduced this issue with stable XA 6.0.1-10. Here is the adb logcat for the same: https://gist.github.com/Abhishekk360/b4e1d2d718e023312697

***********************
Verify Status 
***********************
I have checked this issue with master XA 6.1.99.16, C6 XA 6.0.2.0 and observed that now, ".__override__ " directory. is not exists in adb logcat, while build and run application in Release mode. Here is the adblogcat: https://gist.github.com/Abhishekk360/6d1e922f162aad67dbdf

Hence closing this issue.
Comment 7 Danish Akhtar 2016-03-03 11:39:46 UTC
Today, I have checked this issue with C6SR2 XA 6.0.2.1 and observed that ".override " directory. is not exists in adb logcat, while build and run application in Release mode. 

Here is the adb logcat: https://gist.github.com/Abhishekk360/ca6368ebf6393801a823

Environment info: https://gist.github.com/Abhishekk360/a5b9b07d6cc082dc8311

Note You need to log in before you can comment on or make changes to this bug.