개발시, 오류수정은, 오류를 찾는것이 90%요. 나머지 고치는것이 10%입니다.

로그는 한 줄기의 빛...!


안드로이드 앱 개발시 APK패키징 이후, APK 수동 배포시 알 수 없게도. 아래와 같이 오류메시지를 뱉고는 더이상 진행 불가했습니다.



이렇게 될 경우, 안드로이드 스튜디오와 같은 개발툴에 연결된 상태도 아니기 때문에 딱히 왜 그런지에 대한 이유도 얻기 힘듭니다.

구글링 해보니, manifest 파일이 잘 못되었거나, 패키지명이 잘못되었거나. 지웠던파일이 지워지지 않고 남아있었다. 라던가.. 

다양한 이유가 있다고합니다.

저의 경우는 모두 아니였습니다.


결론 부터 이야기하자면, 제 경우는 앱 패키징할 때, 

아래와 사이닝 옵션창에서 V2만 체크되어서 그러한 문제가 발생했던 것이었습니다.


V1, V2모두 체크해야 한다.

V1, V2모두 체크해야 한다.


안드로이드 7.0에서는 APK설치시 문제없었으나, 6.0에서 설치시 말썽을 일으키더군요.

아래는 Gradle 빌드 설정 정보입니다.




build.gradle 파일 내용 -------------


android {
compileSdkVersion 27
buildToolsVersion "27.0.0"
defaultConfig {
applicationId "com.myapp"
minSdkVersion 17
targetSdkVersion 27
versionCode 1
versionName "1.0"
vectorDrawables.useSupportLibrary = true
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
ext {
supportLibraryVersion = '27.0.0'
playServicesVersion = '11.0.4'
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}

# 이하 중략 #

2017.11.19 기준.최신 SDK입니다.



포스팅 하려는 이유는 이 같은 문제로만 한정하지 않고, 설치 오류가 보다 더 다양한 문제가 있을 수 있다고 생각이 들었습니다.

그 경우, 원인을 찾아야 해결 할 수 있으므로 원인 찾는 법에 대해서 이야기하고자 합니다.


우선 테스트 기기를 PC에 꽂아 주고, CMD창에서 adb shell logcat 명령어로 기기의 상태를 볼 수 있습니다.

물론 Android SDK가 path 걸려 있어야지요.

거기다가 필터를 걸어 볼 수 있는데 대략 이런 식입니다.

adb shell logcat [보고자하는TAG:디버그이상은 D, (E,I,W.등등)] *:S    #*:S 를 넣어줘야 그외는 다 제외시켜주고 보여줍니다.


자세한 설명은 https://developer.android.com/studio/command-line/logcat.html?hl=ko 에 있습니다.

설치와 관련된 경우 PackageManager 태그를 통해 정보를 보여주니까 이렇게 필터를 걸면 되겠습니다.





아래는 필터를 걸지 않고 그냥 봤는데, 아무튼 설치오류와 관련된 정보를 알 수 있었습니다.


재미있는 것이. 어찌 E(Error) 표시가 아니고 W(Warning)으로 표시됩니다.


오류메시지를 확인했으니, 해결방법은 금방 찾죠.

https://stackoverflow.com/questions/44386464/android-app-installation-failed-package-com-my-app-has-no-certificates-at-entry



두어번 했는데도, 과정이 나한테는 너무 복잡하고 한방에 잘 되지 않아서, 트러블 슈팅했던 것들은 남겨주고자한다.

opendkim까지 잘 설정해야 지메일에서 스팸으로 안빠지고 메일이 잘 도착한다.





확인사항,


1.도메인 TXT에는

v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC7L41itYZtbf9aAUNFVhau17jg6LnPKWFCj8inG13jgj0bLULd31y7qjtN8YddnUzZqN+dtDoXKg/c2t1Wq6HQFi6I7DNv1ipJOmAPbs05zRwprXClgb/aj2bzhHUm5NzCNwsyvRT8CSLagH2FpSNMXIKVTCIeKdLhkzAAt68j2QIDAQAB

형식으로 입력하면 된다.


2. opendkim 파일에 수정할 것 좀 있다.

특히 Mode    v --> sv로 바꾸고

나머지 설명은 아래 링크 참조해서 읽어서 잘 확인한다.


3. 에러는 /var/log/maillog 에 보이므로,  tail -f 해서 보도록 하자. 에러로그를 봐야 원인을 알 수 있다. 권한문제등등.


4. 메일서버 호스트를 굳이 mail.domain.com 형식으로 할필요는 없다.

호스트이름도 domain.com으로 다 통일해서 설정하였다.


5. socket형식으로 해서는 제대로 되지 않았다.

opendkim.conf  설정


/etc/postfix/main.cf

smtpd_milters           = inet:localhost:12301



6. 보내는 메일주소 맞추기

/etc/postfix/main.cf 파일 수정


smtpd_milters           = inet:localhost:12301

# mtpd_milters           =  /var/run/opendkim/opendkim.sock

non_smtpd_milters       = $smtpd_milters

milter_default_action   = accept

milter_protocol         = 2

virtual_alias_maps = hash:/etc/postfix/virtual


vi /etc/postfix/virtual 

p@domain    user2031

형식으로 작성하고난뒤


sudo postmap /etc/postfix/virtual

service postfix restart #centos 6.6 


한다. 이걸해야 p@domain 으로 서버에서 메일을 보낼 수있다.






메일의 원본내용을 봤을때 DKIM이 PASS가 떠야한다!








참고.

https://takeshiyako.blogspot.kr/2016/01/spf-dkim-postfix-centos.html

https://kr.minibrary.com/278/

https://serverfault.com/questions/640316/milter-service-needs-transportendpoint-instead-of-var-run-opendkim-opendkim-s

개발환경 : windows10 pro 64bit / Visual Studio 2015 Community / .net 4.7 / WebApi

운영환경 : windows7 pro 64bit / IIS 7


환경셋팅하고 게시하니 아래와 같은 오류가 났다.

'/' 응용 프로그램에 서버 오류가 있습니다.

파일이나 어셈블리 'Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.8.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' 또는 여기에 종속되어 있는 파일이나 어셈블리 중 하나를 로드할 수 없습니다. 액세스가 거부되었습니다.

설명: 현재 웹 요청을 실행하는 동안 처리되지 않은 예외가 발생했습니다. 스택 추적을 검토하여 발생한 오류 및 코드에서 오류가 발생한 위치에 대한 자세한 정보를 확인하십시오. 

예외 정보: System.IO.FileLoadException: 파일이나 어셈블리 'Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.8.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' 또는 여기에 종속되어 있는 파일이나 어셈블리 중 하나를 로드할 수 없습니다. 액세스가 거부되었습니다.

소스 오류: 

현재 웹 요청을 실행하는 동안 처리되지 않은 예외가 생성되었습니다. 아래의 예외 스택 추적을 사용하여 예외의 원인 및 위치 정보를 확인할 수 있습니다.


어셈블리 로드 추적: 다음 정보는 'Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.8.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' 어셈블리를 로드할 수 없는 이유를 알아내는 데 도움이 됩니다.

경고: 어셈블리 바인딩 로깅이 꺼져 있습니다.
어셈블리 바인딩 오류 로깅 기능을 사용하려면 레지스트리 값 [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD)를 1로 설정하십시오.
참고: 어셈블리 바인딩 오류 로깅 기능을 사용하도록 설정하면 그렇지 않은 경우보다 성능이 약간 떨어집니다.
이 기능을 끄려면 레지스트리 값 [HKLM\Software\Microsoft\Fusion!EnableLog]를 제거하십시오.


스택 추적: 

[FileLoadException: 파일이나 어셈블리 'Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.8.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' 또는 여기에 종속되어 있는 파일이나 어셈블리 중 하나를 로드할 수 없습니다. 액세스가 거부되었습니다.]
   System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMarkHandle stackMark, IntPtr pPrivHostBinder, Boolean loadTypeFromPartialName, ObjectHandleOnStack type) +0
   System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean loadTypeFromPartialName) +95
   System.RuntimeType.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark) +53
   System.Type.GetType(String typeName) +42
   System.CodeDom.Compiler.CompilerInfo.get_IsCodeDomProviderTypeValid() +14
   System.Web.Compilation.CompilationUtil.GetRecompilationHash(CompilationSection ps) +2528
   System.Web.Configuration.CompilationSection.get_RecompilationHash() +109
   System.Web.Compilation.BuildManager.CheckTopLevelFilesUpToDateInternal(Int64 cachedHash) +526
   System.Web.Compilation.BuildManager.CheckTopLevelFilesUpToDate(Int64 cachedHash) +57
   System.Web.Compilation.BuildManager.ExecutePreAppStart() +148
   System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters, PolicyLevel policyLevel, Exception appDomainCreationException) +878

[HttpException (0x80004005): 파일이나 어셈블리 'Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.8.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' 또는 여기에 종속되어 있는 파일이나 어셈블리 중 하나를 로드할 수 없습니다. 액세스가 거부되었습니다.]
   System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +525
   System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +124
   System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +700



버전 정보: Microsoft .NET Framework 버전:4.0.30319; ASP.NET 버전:4.7.2117.0




해결:

원인은 Visual Studio 기본 프로젝트 템플릿의 문제. 운영환경 설정에서는 로슬린 컴파일러가 설정안되서 생긴 문제인듯하다.

필요없으니 제거하면된다.


web.config 에서 아래 부분을 주석처리하거나 삭제한다.

  <!--

  <system.codedom>

    <compilers>

      <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.8.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:1659;1699;1701"/>

      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.8.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+"/>

    </compilers>

  </system.codedom>-->



참고 링크 : https://stackoverflow.com/questions/36338138/file-load-exception-microsoft-codedom-providers-dotnetcompilerplatform




그다음 또 아래와 같은 오류가 났다.

'/' 응용 프로그램에 서버 오류가 있습니다.

'System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 어셈블리에서 'System.ServiceModel.Activation.HttpModule' 형식을 로드할 수 없습니다.

설명: 현재 웹 요청을 실행하는 동안 처리되지 않은 예외가 발생했습니다. 스택 추적을 검토하여 발생한 오류 및 코드에서 오류가 발생한 위치에 대한 자세한 정보를 확인하십시오. 

예외 정보: System.TypeLoadException: 'System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 어셈블리에서 'System.ServiceModel.Activation.HttpModule' 형식을 로드할 수 없습니다.

소스 오류: 

현재 웹 요청을 실행하는 동안 처리되지 않은 예외가 생성되었습니다. 아래의 예외 스택 추적을 사용하여 예외의 원인 및 위치 정보를 확인할 수 있습니다.


스택 추적: 

[TypeLoadException: 'System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 어셈블리에서 'System.ServiceModel.Activation.HttpModule' 형식을 로드할 수 없습니다.]
   System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMarkHandle stackMark, IntPtr pPrivHostBinder, Boolean loadTypeFromPartialName, ObjectHandleOnStack type) +0
   System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean loadTypeFromPartialName) +95
   System.RuntimeType.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark) +53
   System.Type.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase) +44
   System.Web.Compilation.BuildManager.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase) +61
   System.Web.Configuration.ConfigUtil.GetType(String typeName, String propertyName, ConfigurationElement configElement, XmlNode node, Boolean checkAptcaBit, Boolean ignoreCase) +49

[ConfigurationErrorsException: 'System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 어셈블리에서 'System.ServiceModel.Activation.HttpModule' 형식을 로드할 수 없습니다.]
   System.Web.Configuration.ConfigUtil.GetType(String typeName, String propertyName, ConfigurationElement configElement, XmlNode node, Boolean checkAptcaBit, Boolean ignoreCase) +558
   System.Web.Configuration.ConfigUtil.GetType(String typeName, String propertyName, ConfigurationElement configElement, Boolean checkAptcaBit) +30
   System.Web.Configuration.Common.ModulesEntry.SecureGetType(String typeName, String propertyName, ConfigurationElement configElement) +57
   System.Web.Configuration.Common.ModulesEntry..ctor(String name, String typeName, String propertyName, ConfigurationElement configElement) +54
   System.Web.HttpApplication.BuildIntegratedModuleCollection(List`1 moduleList) +191
   System.Web.HttpApplication.GetModuleCollection(IntPtr appContext) +1086
   System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext, HttpContext context, MethodInfo[] handlers) +123
   System.Web.HttpApplication.InitSpecial(HttpApplicationState state, MethodInfo[] handlers, IntPtr appContext, HttpContext context) +169
   System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext, HttpContext context) +396
   System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext) +333

[HttpException (0x80004005): 'System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 어셈블리에서 'System.ServiceModel.Activation.HttpModule' 형식을 로드할 수 없습니다.]
   System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +525
   System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +124
   System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +700



버전 정보: Microsoft .NET Framework 버전:4.0.30319; ASP.NET 버전:4.7.2117.0



이건 iis 재설정해줘야한다. 왜그런지는 몰겠고. 닷넷하고 iis 설정해보면 고질적으로 나타나는 문제다.(요즘은 잘모르겠다만 윈7환경때까진 진짜 많이 나왔다.)


우선 CMD창에서 아래 디렉토리로 이동한다.


cd %windir%\Microsoft.NET\Framework\v4.0.30319

64비트 환경인경우 아래다.

cd %windir%\Microsoft.NET\Framework64\v4.0.30319 

디렉토리를 이동하였으면 아래명령어를 쳐주면..된다.

aspnet_regiis.exe /iru






참고링크:

https://support.microsoft.com/ko-kr/help/2015129/error-message-after-you-install-the--net-framework-4-0-could-not-load


+ Recent posts