IOS

먼저 ios는 xcode를 깔아준다.

앱스토어에선 버전이 낮으면 못 받았는데 웹에선 받을 수 있다.

설치가 되고 잘 동작하는지는 확인하지 못했다.

xcode웹에서 받기

터미널에서 아래를 입력해준다.

sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
sudo xcodebuild -runFirstLaunch

터미널에서 아래를 실행시킨다.

sudo xcodebuild -license

앱을 빌드해보기 위해 터미널에서 시뮬레이터를 실행시킨다.

open -a Simulator

cocoapods을 설치해준다. dart가 ios에서 라이브러리 관리를 위해 사용하는 것 같다.

sudo gem install cocoapods

안드로이드

안드로이드 스튜디오를 설치한다.

터미널에 아래를 입력해 라이센스에 동의해준다.

flutter doctor --android-licenses

안드로이드 및 연결된 기기를 볼 수 있는 명령이다.

flutter devices

 

 

https://docs.flutter.dev/platform-integration/web/building

'개발정보 > flutter' 카테고리의 다른 글

맥에서 flutter 개발환경 세팅하기  (0) 2023.11.15
블로그 이미지

dev김

안드로이드 개발자로 만 4년이 좀 안되게 근무했었고 그 이상의 공백을 가지고 있다. 다시 현업에 복귀하기 위한 노력의 흔적을 담으려고 한다.

,

매니페스트 파일의 application 태그 위에 입력해준다.

<queries>
	<intent>
		<action android:name="android.intent.action.TTS_SERVICE"/>
	</intent>
</queries>

 

코틀린을 기준으로 작성하였다.

Context 객체와 InitListener를 요구하는데 람다 블럭 안에서

스테이터스가 성공인지 확인해서 성공이면 TTS를 사용하면 된다.

    lateinit var tts: TextToSpeech
    tts = TextToSpeech(context) { status ->
        if (status == TextToSpeech.SUCCESS) {
            tts.language = Locale.KOREAN;
            tts.setPitch(1.0f)
            tts.setSpeechRate(1.0f)
            tts.speak(context.getString(R.string.contacts), TextToSpeech.QUEUE_FLUSH, null, null)
        }
    }

 

블로그 이미지

dev김

안드로이드 개발자로 만 4년이 좀 안되게 근무했었고 그 이상의 공백을 가지고 있다. 다시 현업에 복귀하기 위한 노력의 흔적을 담으려고 한다.

,

젯팩 컴포즈를 배운 뒤에 appwidget도 관련된 api가 있는지 찾아보았는데 있었다.

젯팩 컴포즈에선 glance라는 api를 사용한다.

glance를 사용하기 위해선 어떻게 해야하는지 알아보겠다.

 

먼저 모듈의 build.gradle.kts에 아래 의존성을 추가해준다.

    implementation("androidx.glance:glance:1.0.0")
    // For AppWidgets support
    implementation("androidx.glance:glance-appwidget:1.0.0")

이외에도 wear tiles를 사용하려면(웨어 디바이스에 사용되는거 같다.) 다른 부분도 추가해야 한다.

 

아래 적당한 패키지에 아래 클래스들을 추가한다.

 

class ContactReceiver : GlanceAppWidgetReceiver() {
    override val glanceAppWidget: GlanceAppWidget = ContactWidget()
}

GlanceAppWidgetReceiver 는 사실 AppWidgetProvider를 상속받아서 만들어졌다.

AppWidgetProvider 에서 했던 작업을 여기서 해도 될 것이다.

class ContactWidget : GlanceAppWidget() {

    override suspend fun provideGlance(context: Context, id: GlanceId) {
        // Load data needed to render the AppWidget.
        // Use `withContext` to switch to another thread for long running
        // operations.

        provideContent {
            // create your AppWidget here
            Contact()
        }
    }

    @Composable
    private fun Contact() {
        val context = LocalContext.current
        Button(
            text = context.getString(R.string.contacts),
            style = TextStyle(
                fontWeight = FontWeight.Bold,
                fontSize = 70.sp,
                textAlign = TextAlign.Center
            ),
            modifier = GlanceModifier.fillMaxSize().padding(0),
            onClick = actionStartActivity<MainActivity>()
        )
    }
}

Contact 컴포저블이 위젯으로 보여지는 부분이다.

이 부분을 수정해서 레이아웃을 설정할 수 있다.

 

stringResource는 젯팩 컴포즈의 컴포저블에서만 동작하는데 glance는 고유의 컴포저블을 사용한다.

때문에 stringResource를 사용하자 오류가 발생했다.

임포트할때도 glance와 관련된 항목인지 확인하고 해야한다.

stringResource대신 context.getString을 사용하면 된다.

 

매니페스트에 아래 항목을 추가해준다.

<receiver android:name=".glance.ContactReceiver" android:exported="true">
    <intent-filter>
    <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
    </intent-filter>
    <meta-data android:name="android.appwidget.provider" android:resource="@xml/contact_app_widget_info" />
</receiver>

 

res의 xml 폴더의 contact_app_widget_info.xml에 아래 항목을 작성해준다.

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="250dp"
    android:minHeight="40dp"
    android:updatePeriodMillis="86400000"
    android:initialLayout="@layout/glance_default_loading_layout">
</appwidget-provider>

어차피 glance로 레이아웃을 출력할 것이라 initialLayout은 glance기본 레이아웃을 이용했다.

minHeight minWidth가 위젯의 크기가 되는데 이건 1X4칸이다

N칸의 크기는 70*N-30 dp이다.

1->40dp

2->110dp

3->180dp

4->250dp

블로그 이미지

dev김

안드로이드 개발자로 만 4년이 좀 안되게 근무했었고 그 이상의 공백을 가지고 있다. 다시 현업에 복귀하기 위한 노력의 흔적을 담으려고 한다.

,

첫번째 오류

익셉션으로 인해 테스트 화면으로 진입하지 못했다.

(테스트 화면에는 실행할 함수들이 1/1 이런식으로 표시가 되어있다.)

그럴 때에는 보통 이렇게 설정이 되어 있었다.

    androidTestImplementation "androidx.compose.ui:ui-test-junit4"

현재 가장 최신 버전인 1.4.1버전을 지정해 줘도 같은 오류가 발생했다.

    androidTestImplementation "androidx.compose.ui:ui-test-junit4:1.3.2"

위와 같이 설정을 바꿔주니 실행이 잘 되었다.

아마도 최신 버전의 junit4를 사용해서 문제가 생기는 것 같다.

 

두번째 오류

위와 같이 설정을 해서 테스트 화면으로 진입은 했지만 activity not found exception이 발생했다며 진행되지 않았다.

검색을 해보니 아래 사이트를 발견했다.

https://github.com/android/android-test/issues/196

 

Unable to find explicit activity class BootstrapActivity · Issue #196 · android/android-test

Description Making my first attempts at using ActivityScenario, and I immediately stumbled upon this exception android.content.ActivityNotFoundException: Unable to find explicit activity class {com...

github.com

For Android 13 devices, this is fixed in androidx.test:core:1.5.0-alpha02, see: #1412

아무래도 특정 버전의 api에서 문제가 발생했던 거 같다.

androidTestImplementation "androidx.test:core-ktx:1.5.0"

위와 같이 설정을 해주니 정상적으로 실행이 되었다.

블로그 이미지

dev김

안드로이드 개발자로 만 4년이 좀 안되게 근무했었고 그 이상의 공백을 가지고 있다. 다시 현업에 복귀하기 위한 노력의 흔적을 담으려고 한다.

,

이전 게시물과 마찬가지로 글이 별로 없어서 직접 작성한다.

적응형 아이콘을 만들어 보려고 아래에서 affinity designer용 템플릿을 받았다.

https://cyrilmottier.com/2017/07/06/adaptive-icon-template/

 

포어그라운드 이미지를 익스포트해서 안드로이드 스튜디오에서 열어보니 구멍이 뚫려 있던 부분이 막혀서 나온다.

그래서 구멍을 어떻게 뚫어야 할지 찾아보았다.

구멍이 막힌 이유는 안드로이드가 non zero 타입만 지원을 하기 때문이었다.

even odd타입으로 작업되어 있는 소스였나보다.

 

 

 

어피니티 디자이너에선 뚫려있게 나온다.

먼저 구멍을 뚫어야 하는 레이어를 선택해준다.

레이어 메뉴의 제일 아래에서 두번째인 fill mode를 winding(non-zero)로 바꿔준다.

그럼 뚫려있던 구멍이 막혀보인다.

 

 

왼쪽 메뉴에서 흰색 화살표 모양의 node tool 버튼을 눌러준다.

 

 

그리고 구멍을 뚫어야 할 부분을 선택해준다. 파란색 점이 선택된 부분이다.

 

 

펜 모양의 펜 툴 버튼을 클릭해준다.

 

 

빨간색 박스가 있는 reverse curve버튼을 클릭해준다.

 

 

아래와 같이 구멍이 뚫렸다.

다른 부분도 똑같이 해주면 된다.

'ETC' 카테고리의 다른 글

무선 마우스 사용시 느려지고 끊길 때  (0) 2023.02.23
Affinity Designer 공백 까지 export하기  (0) 2022.12.03
게임 리소스 사이트 모음  (0) 2019.01.30
블로그 이미지

dev김

안드로이드 개발자로 만 4년이 좀 안되게 근무했었고 그 이상의 공백을 가지고 있다. 다시 현업에 복귀하기 위한 노력의 흔적을 담으려고 한다.

,

먼저 아래 링크에서 cocos2d-x를 다운받아준다.

cocos2d-x 4.0 다운받기

 

다운받은 cocos2d-x를 적당한 곳에 압축을 풀자.

마땅히 떠오르지 않는다면 C:\cocos2d-x 압축을 풀자.

 

그리고 코코스를 설정하기 위해 python을 설치해준다.

3점과 2점대가 다르다고 하니 2점대 버전을 설치해야 한다.

현재 가장 최신 버전인 2.7.18을 설치한다.

 

python 2.7.18 다운받기

 

파이선을 설치한다 설치할 항목을 선택하는 곳에서 전부 선택해서 설치해준다.

마지막 항목이 python을 환경변수에 넣어주는데 그래야 명령어 입력이 쉽다.

 

cocos2d 프로젝트들을 관리하기 위한 프로젝트 폴더를 만들자.

생각나는게 없으면 C:\cocos2d_workspace 로 만들자.

 

cmd를 실행시켜 cocos2d-x를 압축 푼 곳으로 이동한다.

처음에 c:\users\계정이름 일텐데 cd ../../cocos2d-x 를 입력해 이동해준다.

 

python setup.py를 입력한다. 탐색기에서 setup.py를 실행해도 될 수 있다.

 

android ndk sdk 설치 위치를 묻는데 입력해줘도 괜찮고 나중에 안드로이드 스튜디오에서 설정할수도 있으니 그냥 엔터를 눌러 스킵해줘도 괜찮다.

 

이제 cocos2d-x 개발환경이 설정되었다.

 

cmd에서 아래 명령어를 실행한다.

 

cocos new [프로젝트명] –p [패키지명] –l [사용할 언어] –d [생성할 경로]

cocos new CocosGame -p com.cocos.game -l cpp -d c:\cocos_workspace\

생성할 경로로 미리 이동하면 -d c:\cocos_workspace\를 생략가능하다

경로가 없으면 만들어주는것 같다.

 

CocosGame 폴더 안에 여러가지 플랫폼에 해당하는 폴더들이 만들어졌을 것이다.

그 중에 proj.android를 안드로이드 스튜디오로 열어준다.

 

그리고 개발을 시작하면 된다.

android sdk manager에서 cmake를 설치해 줘야 한다.

(ndk는 설치 안해줘도 될 것 같은데 요구한다면 해주자.)

 

cocos2d-x는 크로스 플랫폼을 지원해 대개 ios와 안드로이드를 동시에 지원하는 경우가 많다.

그래서 ios를 개발할 수 있고 android도 개발할 수 있는 mac에서 개발하는 것이 좋다.

 

윈도우에서는 안드로이드만 개발이 가능하다.

맥은 없고 새로운 안드로이드 C++ 개발환경을 경험해 보기 위해 시도해보았다.

블로그 이미지

dev김

안드로이드 개발자로 만 4년이 좀 안되게 근무했었고 그 이상의 공백을 가지고 있다. 다시 현업에 복귀하기 위한 노력의 흔적을 담으려고 한다.

,

안드로이드 11 버전 이상에선 무선 디버깅을 공식적으로 지원하는 것으로 알려져있다.

하지만 그 전에 출시된 폰에서도 무선 디버깅을 할 수 있다.

지원하는 최소버전이 있는지는 확인을 못했다.

 

휴대폰 정보에서 빌드번호를 여러번 눌러서 개발자 모드를 활성화시켜준다.

개발자 모드에서 adb 디버깅을 활성화 시켜준다.

 

무선으로 디버깅이 가능하려면 개발 PC와 개발폰이 같은 네트워크안에 있어야 한다.

 

개발폰을 개발PC에 USB로 연결한 후

adb tcpip 5555

(포트 번호는 수정해도 된다.)를 입력한다.

 

개발폰을 PC에서 연결해제 한다.

 

개발폰의 설정 -> 연결 -> Wifi 현재 네트워크에서 ip 정보를 확인한다.

 

adb connect 192.168.0.1:5555

 (:5555)는 생략가능한것 같다.

 

연결 확인은

adb devices

를 통해 할수 있다.

 

무선 디버깅을 연결해제 하려면 다음과 같이 입력하면 된다.

adb disconnect

※주의 adb에 연결된 모든 장치가 해제된다.

블로그 이미지

dev김

안드로이드 개발자로 만 4년이 좀 안되게 근무했었고 그 이상의 공백을 가지고 있다. 다시 현업에 복귀하기 위한 노력의 흔적을 담으려고 한다.

,

javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0xb7a8aa38: Failure in SSL library, usually a protocol error
error:14077102:SSL routines:SSL23_GET_SERVER_HELLO:unsupported protocol (external/openssl/ssl/s23_clnt.c:714 0xa8f6e6e2:0x00000000)

 

안드로이드에서 api20 미만에서 발생하는 오류이고 젤리빈 에뮬레이터에서 발생했다.

안드로이드 20미만에서는 TLSv1 SSLv3만 지원을 하는데 서버 프로토콜이 이를 지원하지 않으면 발생한다

api20미만에서도 구글 플레이 서비스를 이용해 해결할 수 있지만 예전 에뮬레이터에선 구글 플레이가 지원이 안되어서 해결을 못하였다.

 

try {
          ProviderInstaller.installIfNeeded(getContext());
        } catch (GooglePlayServicesRepairableException e) {

          // Indicates that Google Play services is out of date, disabled, etc.

          // Prompt the user to install/update/enable Google Play services.
          GoogleApiAvailability.getInstance()
                  .showErrorNotification(context, e.connectionStatusCode)

          // Notify the SyncManager that a soft error occurred.
          syncResult.stats.numIoExceptions++;
          return;

        } catch (GooglePlayServicesNotAvailableException e) {
          // Indicates a non-recoverable error; the ProviderInstaller is not able
          // to install an up-to-date Provider.

          // Notify the SyncManager that a hard error occurred.
          syncResult.stats.numAuthExceptions++;
          return;
        }

아래 라이브러리를 추가해 주어야 한다.

implementation 'com.google.android.gms:play-services-auth:17.0.0'

요즘은 minsdk를 안드로이드6.0으로 설정하는 추세인거 같은데 그렇다면 발생할 일이 없겠지만 혹시 몰라서 올린다.

 

https://developer.android.com/training/articles/security-gms-provider#java

 

보안 프로바이더를 업데이트하여 SSL 악용으로부터 기기 보호  |  Android 개발자  |  Android Develope

보안 프로바이더를 업데이트하여 SSL 악용으로부터 기기 보호 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Android에서는 보안 네트워크 통신을 제공하기

developer.android.com

 

https://stackoverflow.com/questions/29916962/javax-net-ssl-sslhandshakeexception-javax-net-ssl-sslprotocolexception-ssl-han

블로그 이미지

dev김

안드로이드 개발자로 만 4년이 좀 안되게 근무했었고 그 이상의 공백을 가지고 있다. 다시 현업에 복귀하기 위한 노력의 흔적을 담으려고 한다.

,

Android Emulator closed because of an internal error:
gpu found. vendor id 8086 device id 0x3e92
checking for bad AMD vulkan driver version...
amdvlk64.dll not found. Checking for amdvlk32...
amdvlk32.dll not found. No bad AMD Vulkan driver versions found.
checking for bad vulkan-1.dll version...
vulkan-1.dll version: 1.1.114.0
Not known bad vulkan-1.dll version; continue.

 

이런 메시지를 띄우며 에뮬레이터가 여러번 강제종료 되었다.

 

C:\Users\<your_account>\.android 폴더에 advancedFeatures.ini 를 생성해준다.

advancedFeatures.ini 안에는 아래 내용을 입력한다.

Vulkan = off
GLDirectMen = on
블로그 이미지

dev김

안드로이드 개발자로 만 4년이 좀 안되게 근무했었고 그 이상의 공백을 가지고 있다. 다시 현업에 복귀하기 위한 노력의 흔적을 담으려고 한다.

,

프로젝트가 간단하고 외부 라이브러리 사용도 없다면 간단할 수 있다.

하지만 프로젝트 크기도 크고 외부 라이브러리를 사용했다면 여러 곳에서 문제가 발생할 수 있다.

 

사용중인 안드로이드 스튜디오에서 새로 프로젝트를 만들어서 조금씩 옮겨오는 방법도 있을 것이고

사용중인 안드로이드 스튜디오에서 프로젝트를 최신으로 업데이트하는 방법도 있을 것이다.

그러기엔 시간이 많이 들거 같아서 편법(?)을 사용했다.

 

프로젝트가 잘 실행되던 때의 안드로이드 스튜디오를 설치하고

라이브러리 버전이 최신 개발버전이었는데 그 당시의 배포버전으로 맞춰주었다.

 

https://developer.android.com/studio/archive

 

Android 스튜디오 다운로드 자료실  |  Android 개발자  |  Android Developers

이 페이지에는 Android 스튜디오 출시 관련 다운로드 자료실이 포함되어 있습니다.

developer.android.com

이전 버전의 안드로이드 스튜디오를 받을 수 있는 링크다.

약관 동의 버튼을 눌러주고 프로젝트가 정상적으로 동작하던 때의 버전을 사용하자.

 

github에 공개된 라이브러리라면 github주소/releases 에 보면 버전별로 볼 수 있다.

assets을 눌러보면 언제 업로드되었는지 확인할 수 있다.

프로젝트가 정상적으로 동작하던 때의 라이브러리 버전을 사용하자.

 

2019년 9월까지 정상적으로 작동했던 프로젝트를 이렇게 하니 별 오류없이 금방 되었다.

 

안드로이드 스튜디오를 사용하기 전이라면 좀 더 어려울 수 있을 것 같다.

블로그 이미지

dev김

안드로이드 개발자로 만 4년이 좀 안되게 근무했었고 그 이상의 공백을 가지고 있다. 다시 현업에 복귀하기 위한 노력의 흔적을 담으려고 한다.

,