2024년 7월 17일 수요일

앱 업데이트를 출시하려면 2024년 8월 31일까지 대상 API 수준을 업데이트하세요

 앱이 Android 14(API 수준 34) 이상을 타겟팅해야 함

 

앱 업데이트를 출시할 수 없게 됩니다(46일 남음).
 
제발 그냥 되면 좋겠다.

1. Edit - Player - Target API Level 변경.

 
   다행히도 현재 사용중인 2021.3.23f1 LTS 버전에서 API 34를 설정할 수 있다.


   그리고, 빌드도 깔끔하게 잘 끝났다. 
   그렇게 해피 엔딩일 줄 알았건만 ...

   안드로이드 14 단말기에서 앱이 시작되자마자 강제 종료된다.
   그것도 모르고 구글 스토어에 등록 후 배포를 해버렸다. 이런 젠장...

   <
    --------- beginning of crash
2024-07-16 21:50:36.564 19644-19644/com.ships.api34fuck E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.ships.api34fuck, PID: 19644
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.ships.api34fuck/com.unity3d.player.UnityPlayerActivity}: java.lang.SecurityException: com.ships.api34fuck: One of RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED should be specified when a receiver isn't being registered exclusively for system broadcasts
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4164)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4322)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:139)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:96)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2685)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loopOnce(Looper.java:230)
        at android.os.Looper.loop(Looper.java:319)
        at android.app.ActivityThread.main(ActivityThread.java:8919)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:578)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1103)
     Caused by: java.lang.SecurityException: com.ships.api34fuck: One of RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED should be specified when a receiver isn't being registered exclusively for system broadcasts
        at android.os.Parcel.createExceptionOrNull(Parcel.java:3069)
        at android.os.Parcel.createException(Parcel.java:3053)
        at android.os.Parcel.readException(Parcel.java:3036)
        at android.os.Parcel.readException(Parcel.java:2978)
        at android.app.IActivityManager$Stub$Proxy.registerReceiverWithFeature(IActivityManager.java:6157)
        at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1913)
        at android.app.ContextImpl.registerReceiver(ContextImpl.java:1853)
        at android.app.ContextImpl.registerReceiver(ContextImpl.java:1841)
        at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:772)
        at com.unity3d.player.UnityPlayer.<init>(Unknown Source:343)
        at com.unity3d.player.UnityPlayerActivity.onCreate(UnityPlayerActivity.java:40)
        at android.app.Activity.performCreate(Activity.java:8975)
        at android.app.Activity.performCreate(Activity.java:8944)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1456)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4146)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4322) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:139) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:96) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2685) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loopOnce(Looper.java:230) 
        at android.os.Looper.loop(Looper.java:319) 
        at android.app.ActivityThread.main(ActivityThread.java:8919) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:578) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1103) 
     Caused by: android.os.RemoteException: Remote stack trace:
        at com.android.server.am.ActivityManagerService.registerReceiverWithFeature(ActivityManagerService.java:16680)
        at android.app.IActivityManager$Stub.onTransact$registerReceiverWithFeature$(IActivityManager.java:11613)
        at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:2961)
        at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:3199)
        at android.os.Binder.execTransactInternal(Binder.java:1375)
 
cs
>

   One of RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED should be 
   specified when a receiver isn't being registered exclusively 
   for system broadcasts

   대충 정리해 보면 안드로이드 14부터는 브로드캐스트 리시버를 등록할 때 반드시 
   위 2가지 플래그 중 하나를 명시적으로 지정해야 한다는 얘기라는데 어디서 해야 할까?

2. [ANDROID] TARGET API 34 CRASH ON LAUNCH

 

   UUM-48068

   유니티 버그다. 
 
   2021 LTS 버전의 경우 2021.3.33f1 버전에서 수정했다고 한다.
   2021.3.40f1 최신 버전을 다운 받자.

3. java.lang.SecurityException: "Writable dex file is not allowed."


   <
 
2024-07-16 22:38:39.421 24558-24807/com.ships.api34fuck E/mes.api34fuck: Attempt to load writable dex file: /data/user/0/com.ships.api34fuck/cache/app_resources_lib.jar
2024-07-16 22:38:39.422 24558-24807/com.ships.api34fuck D/CompatibilityChangeReporter: Compat change id reported: 218865702; UID 10377; state: ENABLED
2024-07-16 22:38:39.422 24558-24807/com.ships.api34fuck A/mes.api34fuck: java_vm_ext.cc:591] JNI DETECTED ERROR IN APPLICATION: JNI NewStringUTF called with pending exception java.lang.SecurityException: Writable dex file '/data/user/0/com.ships.api34fuck/cache/app_resources_lib.jar' is not allowed.
    java_vm_ext.cc:591]   at java.lang.Object dalvik.system.DexFile.openDexFileNative(java.lang.String, java.lang.String, int, java.lang.ClassLoader, dalvik.system.DexPathList$Element[]) (DexFile.java:-2)
    java_vm_ext.cc:591]   at java.lang.Object dalvik.system.DexFile.openDexFile(java.lang.String, java.lang.String, int, java.lang.ClassLoader, dalvik.system.DexPathList$Element[]) (DexFile.java:406)
    java_vm_ext.cc:591]   at void dalvik.system.DexFile.<init>(java.lang.String, java.lang.ClassLoader, dalvik.system.DexPathList$Element[]) (DexFile.java:128)
    java_vm_ext.cc:591]   at void dalvik.system.DexFile.<init>(java.io.File, java.lang.ClassLoader, dalvik.system.DexPathList$Element[]) (DexFile.java:101)
    java_vm_ext.cc:591]   at dalvik.system.DexFile dalvik.system.DexPathList.loadDexFile(java.io.File, java.io.File, java.lang.ClassLoader, dalvik.system.DexPathList$Element[]) (DexPathList.java:438)
    java_vm_ext.cc:591]   at dalvik.system.DexPathList$Element[] dalvik.system.DexPathList.makeDexElements(java.util.List, java.io.File, java.util.List, java.lang.ClassLoader, boolean) (DexPathList.java:397)
    java_vm_ext.cc:591]   at void dalvik.system.DexPathList.<init>(java.lang.ClassLoader, java.lang.String, java.lang.String, java.io.File, boolean) (DexPathList.java:166)
    java_vm_ext.cc:591]   at void dalvik.system.BaseDexClassLoader.<init>(java.lang.String, java.lang.String, java.lang.ClassLoader, java.lang.ClassLoader[], java.lang.ClassLoader[], boolean) (BaseDexClassLoader.java:160)
    java_vm_ext.cc:591]   at void dalvik.system.BaseDexClassLoader.<init>(java.lang.String, java.io.File, java.lang.String, java.lang.ClassLoader) (BaseDexClassLoader.java:105)
    java_vm_ext.cc:591]   at void dalvik.system.DexClassLoader.<init>(java.lang.String, java.lang.String, java.lang.String, java.lang.ClassLoader) (DexClassLoader.java:55)
    java_vm_ext.cc:591] 
    java_vm_ext.cc:591]     in call to NewStringUTF
2024-07-16 22:38:39.563 24558-24614/com.ships.api34fuck D/Unity: ANativeWindow: (2208/1768) RequestedResolution: (1919/1537) RenderingResolution: (1919/1537) EGLSurface: (1919/1537)
2024-07-16 22:38:39.577 24558-24807/com.ships.api34fuck A/mes.api34fuck: runtime.cc:691] Runtime aborting...
 
... 중간 생략 ...
 
2024-07-16 22:38:39.578 24558-24807/com.ships.api34fuck E/CRASH: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
2024-07-16 22:38:39.578 24558-24807/com.ships.api34fuck E/CRASH: Version '2021.3.40f1 (6fcab7dbbbc1)', Build type 'Development', Scripting Backend 'il2cpp', CPU 'arm64-v8a'
2024-07-16 22:38:39.578 24558-24807/com.ships.api34fuck E/CRASH: Build fingerprint: 'samsung/q2qksx/q2q:14/UP1A.231005.007/F926NKSS3IXF2:user/release-keys'
2024-07-16 22:38:39.578 24558-24807/com.ships.api34fuck E/CRASH: Revision: '9'
2024-07-16 22:38:39.578 24558-24807/com.ships.api34fuck E/CRASH: ABI: 'arm64'
2024-07-16 22:38:39.578 24558-24807/com.ships.api34fuck E/CRASH: Timestamp: 2024-07-16 22:38:39+0900
2024-07-16 22:38:39.578 24558-24807/com.ships.api34fuck E/CRASH: pid: 24558, tid: 24807, name: Thread-17  >>> com.ships.api34fuck <<<
2024-07-16 22:38:39.578 24558-24807/com.ships.api34fuck E/CRASH: uid: 10377
2024-07-16 22:38:39.578 24558-24807/com.ships.api34fuck E/CRASH: signal 6 (SIGABRT), code -1 (SI_QUEUE), fault addr --------
2024-07-16 22:38:39.578 24558-24807/com.ships.api34fuck E/CRASH:     x0  0000000000000000  x1  00000000000060e7  x2  0000000000000006  x3  0000006c4012bdb0
2024-07-16 22:38:39.578 24558-24807/com.ships.api34fuck E/CRASH:     x4  fefeff6b3f11afb7  x5  fefeff6b3f11afb7  x6  fefeff6b3f11afb7  x7  7f7f7f7f7f7fffff
2024-07-16 22:38:39.578 24558-24807/com.ships.api34fuck E/CRASH:     x8  00000000000000f0  x9  00000070fa275278  x10 0000000000000001  x11 00000070fa2bda48
2024-07-16 22:38:39.578 24558-24807/com.ships.api34fuck E/CRASH:     x12 000000000000e3b2  x13 0000000000000000  x14 0000006c4012abb0  x15 0000000034155555
2024-07-16 22:38:39.578 24558-24807/com.ships.api34fuck E/CRASH:     x16 00000070fa326d18  x17 00000070fa301560  x18 0000006c223b4000  x19 0000000000005fee
2024-07-16 22:38:39.578 24558-24807/com.ships.api34fuck E/CRASH:     x20 00000000000060e7  x21 00000000ffffffff  x22 0000000000000058  x23 0000006dff8a3881
2024-07-16 22:38:39.578 24558-24807/com.ships.api34fuck E/CRASH:     x24 0000000000000058  x25 0000000000000001  x26 0000000000000000  x27 0000006e00416000
2024-07-16 22:38:39.578 24558-24807/com.ships.api34fuck E/CRASH:     x28 b400006f2125fe50  x29 0000006c4012be30
2024-07-16 22:38:39.578 24558-24807/com.ships.api34fuck E/CRASH:     sp  0000006c4012bd90  lr  00000070fa2ae744  pc  00000070fa2ae770
2024-07-16 22:38:39.578 24558-24807/com.ships.api34fuck E/CRASH: backtrace:
2024-07-16 22:38:39.578 24558-24807/com.ships.api34fuck E/CRASH:       #00 pc 000000000005b770  /apex/com.android.runtime/lib64/bionic/libc.so (abort+168) (BuildId: 544bc6c8e3556e98efbc4406b97f6a3e)
2024-07-16 22:38:39.587 24558-24558/com.ships.api34fuck I/BLASTBufferQueue_Java: update, w= 2208 h= 1768 mName = ViewRootImpl@b54c3b7[UnityPlayerActivity] mNativeObject= 0x70412456f0 sc.mNativeObject= 0x6fd1236dd0 format= -3 caller= android.view.ViewRootImpl.updateBlastSurfaceIfNeeded:3017 android.view.ViewRootImpl.relayoutWindow:10131 android.view.ViewRootImpl.performTraversals:4110 android.view.ViewRootImpl.doTraversal:3288 android.view.ViewRootImpl$TraversalRunnable.run:11344 android.view.Choreographer$CallbackRecord.run:1689 
2024-07-16 22:38:39.587 24558-24558/com.ships.api34fuck I/ViewRootImpl@b54c3b7[UnityPlayerActivity]: Relayout returned: old=(0,0,2208,1768) new=(0,0,2208,1768) relayoutAsync=false req=(2208,1768)0 dur=5 res=0x400 s={true 0x6f612484b0} ch=false seqId=1
2024-07-16 22:38:39.587 24558-24759/com.ships.api34fuck D/Unity: Requested framebuffer: resolution[1919x1537], rgba[8/8/8/8], depth+stencil[on], samples[2]
2024-07-16 22:38:39.587 24558-24759/com.ships.api34fuck D/Unity: Created framebuffer: resolution[1919x1537], rgba[8/8/8/8], depth+stencil[24/8], samples[2] (MSAA)
2024-07-16 22:38:39.596 24558-24759/com.ships.api34fuck I/BLASTBufferQueue: [SurfaceView[com.ships.api34fuck/com.unity3d.player.UnityPlayerActivity]@0#1](f:0,a:0,s:0) onFrameAvailable the first frame is available
2024-07-16 22:38:39.920 24558-24807/com.ships.api34fuck E/CRASH: Forwarding signal 6
2024-07-16 22:38:39.921 24558-24807/com.ships.api34fuck A/libc: Fatal signal 6 (SIGABRT), code -1 (SI_QUEUE) in tid 24807 (Thread-17), pid 24558 (mes.api34fuck)
cs
>
 
   최신 버전을 다운 로드 받고 빌드 후 산뜻한 마음으로 실행해 보지만...
 
   기다리고 있는 건 엄청나게 긴 비정상 종료 로그 뿐이다.
 
 
   프로젝트에서 firebase를 사용 중인데, v11.5.0 버전에서 이 문제를 수정했다고 한다. 
   Release note에는 다음과 같이 적혀 있다.
 
   Made dynamic code files read only to comply with new Android 14 security 
   requirements. This fixes a crash at API level 34+.

   이제는 firebase sdk를 변경해야 한다.
   
   SDK 적용 과정은 생략한다.
 

4. Compilation error.

 

  


 
   <
e: Incompatible classes were found in dependencies. Remove them from the classpath or use '-Xskip-metadata-version-check' to suppress errors
e: C:/Users/bpbuild/.gradle/caches/modules-2/files-2.1/androidx.annotation/annotation/1.5.0/857678d6b4ca7b28571ef7935c668bdb57e15027/annotation-1.5.0.jar!/META-INF/annotation.kotlin_module: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.7.1, expected version is 1.4.2.
e: C:/Users/bpbuild/.gradle/caches/transforms-2/files-2.1/0462de0991e1719bb7d18e3b0b4e2e05/jetified-kotlin-stdlib-1.7.10.jar!/META-INF/kotlin-stdlib.kotlin_module: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.7.1, expected version is 1.4.2.
e: C:/Users/bpbuild/.gradle/caches/transforms-2/files-2.1/0e265759c7a59a05ebf9753eee05994d/jetified-kotlinx-coroutines-core-jvm-1.6.4.jar!/META-INF/kotlinx-coroutines-core.kotlin_module: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.6.0, expected version is 1.4.2.
e: C:/Users/bpbuild/.gradle/caches/transforms-2/files-2.1/1cdda7c3d485f1f235d4b1e31acef50d/jetified-kotlinx-coroutines-android-1.6.4.jar!/META-INF/kotlinx-coroutines-android.kotlin_module: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.6.0, expected version is 1.4.2.
e: C:/Users/bpbuild/.gradle/caches/transforms-2/files-2.1/4392fe96859757760b3f844ac2be4b9c/jetified-firebase-common-ktx-20.3.3-api.jar!/META-INF/com.google.firebase-firebase-common-ktx.kotlin_module: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.7.1, expected version is 1.4.2.
e: C:/Users/bpbuild/.gradle/caches/transforms-2/files-2.1/6e9d1a71a7474ead3f2f456317743dc6/jetified-kotlin-stdlib-common-1.7.10.jar!/META-INF/kotlin-stdlib-common.kotlin_module: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.7.1, expected version is 1.4.2.
e: C:/Users/bpbuild/.gradle/caches/transforms-2/files-2.1/7313c44b501b0f498584f0a9f0d80994/jetified-firebase-sessions-1.0.2-api.jar!/META-INF/com.google.firebase-firebase-sessions.kotlin_module: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.7.1, expected version is 1.4.2.
e: C:/Users/bpbuild/.gradle/caches/transforms-2/files-2.1/79bf8eaee136af22f96187e860727684/jetified-kotlinx-coroutines-play-services-1.6.4.jar!/META-INF/kotlinx-coroutines-play-services.kotlin_module: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.6.0, expected version is 1.4.2.
e: C:/Users/bpbuild/.gradle/caches/transforms-2/files-2.1/8df95c2cfe5c084eff52d1efd5ce6065/jetified-kotlin-stdlib-jdk7-1.7.10.jar!/META-INF/kotlin-stdlib-jdk7.kotlin_module: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.7.1, expected version is 1.4.2.
e: C:/Users/bpbuild/.gradle/caches/transforms-2/files-2.1/b30a90b1a7168542ebcb25dc175bf446/jetified-firebase-encoders-json-18.0.1-api.jar!/META-INF/com.google.firebase-encoders-firebase-encoders-json.kotlin_module: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.7.1, expected version is 1.4.2.
e: C:/Users/bpbuild/.gradle/caches/transforms-2/files-2.1/dd44a9797daa2b933e8e7003cac2d6eb/jetified-kotlin-stdlib-jdk8-1.7.10.jar!/META-INF/kotlin-stdlib-jdk8.kotlin_module: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.7.1, expected version is 1.4.2.
e: D:\api34fuck(2021.3.40f1)\Library\Bee\Android\Prj\IL2CPP\Gradle\unityLibrary\src\main\java\com\bega\resolution\Resolution.kt: (16, 2): Class 'kotlin.Suppress' was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.7.1, expected version is 1.4.2.
The class is loaded from C:/Users/bpbuild/.gradle/caches/transforms-2/files-2.1/0462de0991e1719bb7d18e3b0b4e2e05/jetified-kotlin-stdlib-1.7.10.jar!/kotlin/Suppress.class
e: D:\api34fuck(2021.3.40f1)\Library\Bee\Android\Prj\IL2CPP\Gradle\unityLibrary\src\main\java\com\bega\resolution\Resolution.kt: (23, 80): Class 'kotlin.Unit' was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.7.1, expected version is 1.4.2.
The class is loaded from C:/Users/bpbuild/.gradle/caches/transforms-2/files-2.1/0462de0991e1719bb7d18e3b0b4e2e05/jetified-kotlin-stdlib-1.7.10.jar!/kotlin/Unit.class
 
FAILURE: Build failed with an exception.
 
* What went wrong:
Execution failed for task ':unityLibrary:compileDebugKotlin'.
> Compilation error. See log for more details
 
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
 
* Get more help at https://help.gradle.org
 
BUILD FAILED in 12s
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
 
UnityEditor.BuildPipeline:BuildPlayer (UnityEditor.BuildPlayerOptions)
XBuilder:BuildIng () (at Assets/Scripts/Editor/XBuilder.cs:633)
XBuilder:Build () (at Assets/Scripts/Editor/XBuilder.cs:359)
 
 
cs
> 

   이번엔 아예 빌드가 되지 않는다. 또 다시 검색 시작 ...


   가변 해상도 대응을 위해 안드로이드의 해상도를 가져오는 플러그인을 
   Kotlin source plugin으로 사용하고 있는게 문제였다.

5. Dependency Hell~~~~.


   AGP(Android Gradle Plugin) - Gradle - Java - Kotlin Plugin - Kotlin ...

   이쯤되면 포기하고 싶다. 
   위 어느 것 하나 제대로 알고 있는 게 없다.

   검색 결과를 보면 대충 3 가지로 요약된다.

       1. Unity 최신 버전을 사용해라.
       2. Android Studio로 내보내기 해서 버전을 잘 맞춰서 거기서 빌드해라.
       3. 플러그인이 진짜로 필요한지 확인하고 없애라.

6. Kotlin to Java.

 

   위에 적었듯이 어느 하나 전문적이지 않은 나로서는 2번은 선택하기 어렵다. 
   마찬가지로 1번은 Unity 메이저 버전이 바뀌기 때문에 부담스럽다.

   그래서, 3번을 최종적으로 고려하고 있을 때 문득 떠오른 생각.
   의존성 지옥에서 Kotlin 이라도 제거한다면, Java로 변경하면 어떨까?

7. codeium.

 

   보통 Java to Kotlin 또는 Kotlin to Java를 검색하면 Android Studio를 
   사용하는 방법이 나온다. 하지만, 그건 역시 내가 Android Studio를 사용해야 한다.
   그래서 생성형 AI에 요청해 봤다.
 
   Eureka!
   이래서 다들 생성형 AI 노래를 부르는 구나 싶었다.
 
   이제 Kotlin source plugin을 Java source plugin으로 변경하고 빌드해보자. 
 

8. 결론.

 

   급한 불은 끄게 되었다.  
   굳이 필요 없다면 플러그인 사용을 자제하는 게 맞지 않을까?

2024년 3월 6일 수요일

CentOS 7 - Subversion - hooks

 pre-revprop-change.



잘못 작성된 로그 메세지를 수정하고 싶었다.



1. hooks 경로에 pre-revprop-change 파일을 생성해 준다.







2. 하지만...




   255 에러는 pre-revprop-change를 실행할 수 없는 경우에 해당한다.
   분명히 파일이 존재하고 실행 권한을 주었음에도...

3. 다시 SELinux


   /var/log/audit/audit.log 파일을 보면 다음과 같은 에러 메세지가 보인다.

   
1
type=AVC msg=audit(1709713871.470:18248): avc:  denied  { execute } for  pid=24633 comm="svnserve" name="pre-revprop-change"
cs

   하지만, 이번엔 audit2allow 도구도 크게 도움이 되지 않는다.



   저걸 허용해 주라는 얘기인데 getsebool에는 없다.

4. 해결 방법.


   거두절미 다 생략하고 해결 방법만 정리해 보면.

   
1
2
3
grep svnserve /var/log/audit/audit.log |audit2allow -M selinux_svnserve
 
semodule -i selinux_svnserve.pp
cs


5. 그럼에도 불구하고 안된다.


   다음에 다시 해결해 보자. 

6. audit2why


   
1
audit2why < /var/log/audit/audit.log
cs

   특별히 뭘 더 한 것은 아니고 위 툴로 에러 확인 후 처음부터 다시 해 봤더니 된다.



2024년 2월 1일 목요일

Failed to update Android SDK package list.

Unity 안드로이드 빌드.


Unity 2021.3.34f1 LTS migration.


1. 설치.


   그냥 허브에서 하면 된다.

2. 빌드.


   글 제목과 같은 에러가 바로 발생.

3. 원인.


   구글 안드로이드 SDK 버그로 설치 경로에 공백이 들어간 경우 경로를 찾지 못해서.
   D:\Program Files\... 경로 아래에 설치되어 있어서.

4. 해결 방법.


   - 유니티를 다른 경로에 재설치한다. 예를 들면, \Unity\.
   - 혹은, cmdline-tools를 조금 수정한다.

5. cmdline-tools 수정.


   SDK 설치 경로의 sdkmanager.bat 파일을 열어서 다음 스크립트를 변경한다.


   set DEFAULT_JVM_OPTS=-Dcom.android.sdklib.toolsdir=%~dp0\..

   다음과 같이 

   set DEFAULT_JVM_OPTS="-Dcom.android.sdklib.toolsdir=%~dp0\.."

6. 참고 링크.


2020년 3월 25일 수요일

CentOS 7 - Subversion 설치.

Subversion 설치하기.


7.x 버전에서 달라진 systemctl 및 firewall 때문에 정리.


1. Subversion 설치



  
yum install subversion
cs


2. Repository root 생성.


   Repository root로 사용할 경로를 생성한다.
  
  
mkdir -p /var/opt/svn/repositories/
cs


3. svnserve 설정 파일 수정.


  
vi /etc/sysconfig/svnserve
cs


  
# OPTIONS is used to pass command-line arguments to svnserve.
#
# Specify the repository location in -r parameter:
OPTIONS="--threads -r /var/opt/svn/repositories"
cs


4. Repository 설정.


   실제 프로젝트에 사용할 repository 설정은 똑같아서 생략합니다.
   authz, passwd, svnserve.conf 파일을 수정합니다.

5. Firewall 등록.


  
firewall-cmd --permanent --zone=public --add-port=3690/tcp
firewall-cmd --reload
cs


6. 서비스 등록 및 시작.


  
systemctl enable svnserve.service
systemctl start svnserve.service
cs


7. 하지만, 


   기대한 것과 다르게 정상적으로 repository에 접근할 수 없습니다.
   SELinux 관련 에러가 발생하고 로그를 확인해 보면 문제가 있음을 확인 가능합니다.


8. SELinux


   repositories 경로 권한 문제로 파일의 security context를 변경해야 합니다.


  
chcon -R -t svnserve_content_t /var/opt/svn/repositories
cs


  

2020년 3월 16일 월요일

Unity Google Sign In ...

Google Sign-In Unity Plugin

 

하란대로 하면 안되서 정리한다 ㅠㅠ.

 

1. Plugin download.


   Google Sign-In Unity Plugin release에서 최신 버전을 다운로드 받는다.
   google-signin-plugin-1.0.4.unitypackage 및 GoogleSignIn-sample.unitypackage 파일을
   다운로드 받는다.

2. Unity 프로젝트 생성 및 패키지 임포트.

 


   작업에 사용한 Unity 버전은 2019.3.0f6 버전으로 다음 위치에서 패키지를 임포트합니다.


   하지만, 기대와 다르게 임포트하자마자 에러를 만나게 됩니다.


   에러 내용은 다음과 같습니다.

Library\PackageCache\com.unity.textmeshpro@2.0.1\Scripts\Editor\TMP_PackageUtilities.cs(310,17): error CS0433: The type 'Task' exists in both 'Unity.Tasks, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' and 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'

   해결 방법은 다음 링크에 나와있는대로 패키지의 parse 폴더를 제외합니다.
   error CS0433: The type 'Task' exists in both Unity.Tasks,....


   그리고 나면 또 다른 에러가 엄청나게 나옵니다.


   해당 에러에 대한 힌트는 다음 링크에서 확인 가능합니다.
   ArgumentException: Requested value 'x86' was not found

   간단하게 요약하면 unity-jar-resolver 패키지를 설치하면 됩니다.
   최신 버전은 v1.2.137 이고 zip 파일을 다운로드 하고 압축을 푼 뒤에
   play-services-resolver-1.2.137.0 패키지를  설치해주면 됩니다.

   다음 그림과 같이 버전이 낮은 파일이 이미 사용중일 수 있지만
   최신 버전으로 업데이트 합니다.


   그리고 나면 더이상 쓸모없는 파일을 삭제할 지 묻는 다이얼로그 윈도우가 뜨게 되는데,
   삭제하겠다고 선택하면 됩니다.


   그럼 더 이상 에러는 발생하지 않습니다.
   마지막으로 제일 처음 다운로드 받았던 샘플 패키지를 임포트하면 준비는 끝났습니다.

3. Keystore 생성.


   먼저 File - Build Settings - Platform을 Android로 변경한 뒤,
   App signing을 위해 키를 생성합니다.



   키 분실의 우려가 있으므로 프로젝트 아래 적당한 경로에 저장하고
   버전 관리 시스템을 사용할 수 있도록 합니다.

   구글 앱 서명 방식이 변경되어 앱 서명 인증서와  업로드 인증서로 나뉘고 구글에서 
   관리하도록 변경되어 분실을 하게 되더라도 복구할 방법이 현재는 존재합니다.


   위 그림과 같이 키스토어에 키를 하나 생성합니다.
   그리고 나면 최종적으로 다음과 같이 설정됩니다.


   그리고 Player - Other Settings에서 사용할 Package Name을 설정해 주면 됩니다.


4. Google APIs.


   Google Sign-In api 사용을 위해 사용자 인증 정보를 생성합니다.
   Google API console에서 사용자 인증 정보 - 사용자 인증 정보 만들기를 선택한 뒤,
   OAuth 클라이언트 ID를 선택하고 마지막으로 Android 선택 후 내용을 채워주면 됩니다.


   생성한 뒤 Unity에서 Web Client Id를 설정합니다.
   Canvas를 선택하고 Signin Sample Script 컴포넌트에 설정합니다.


   그리고 빌드한 뒤 apk 배포 후 테스트 해보면 역시나 안된다.


   이름도 거룩하다, DeveloperError ...

5. Google Sign-In for Android.


   Google Sign-In for Android 페이지에서 아래로 스크롤 하다 보면
   Configure a project 버튼을 찾을 수 있습니다.





   최종적으로 Web client (Auto-created for Google Sign-in) 이름으로 생성된
   OAuth 2.0 클라이언트 ID가 생기고 이 아이디를 사용해야 로그인이 됩니다.

   참고로, Google API console에서 클라이언트 ID를 생성할 때 Android가 아니라 
   웹 애플리케이션을 선택해서 만들어도 됩니다.

   이제 만들어진 클라이언트 ID로 빌드하게 되면 로그인이 드디어 됩니다.


2020년 1월 7일 화요일

Grafana & graphite 그리고 모니터링 #06.

CentOS 7.x 버전에 설치하기.

 

이전에 기록했던 CentOS 6.x 버전에 설치하기대로 설치가 안된다.

 

1. Docker 설치

 

  
1
yum install docker
cs


2. pip upgrade

 

  
1
pip install --upgrade pip
cs


3. Docker 설정 변경

 

   /etc/sysconfig/docker 파일에서 다음 그림과 같이 설정을 수정


4. Docker 시작하기.


  
1
2
3
systemctl enable docker.service
systemctl start docker.service
systemctl status docker.service
cs



5. Docker image build.

 

  
1
docker build -f ./Dockerfile --tag graphite:1.0 ./
cs



6. Rpmdb checksum is invalid: dCDPT(pkg checksums): libXext.x86_64 0:1.3.3-3.el7 - u


   하지만, 실패 ㅠㅠ



   여러가지 해결 방법이 존재한다.

7. 해결 방법

 

   제일 처음에 다음과 같이 Docker overlay fs 추가하거나,

  
1
RUN yum -y install yum-plugin-ovl
cs


   다른 방법으로

  
1
RUN yum install -y graphite-web;yum clean all
cs


   혹은

  
1
RUN rpm --rebuilddb && yum install -y graphite-web
cs