설정

일반

맨 밑에서 가까운 VPN및 기기 관리

가장 아래에 있는 이메일 클릭

상단의 파란색 글씨 클릭 확인

블로그 이미지

dev김

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

,

설정

개인정보 보호 및 보안

가장 아래에서 두번째 개발자 모드

개발자 모드 스위치 클릭

블로그 이미지

dev김

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

,

 

 

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년이 좀 안되게 근무했었고 그 이상의 공백을 가지고 있다. 다시 현업에 복귀하기 위한 노력의 흔적을 담으려고 한다.

,

맥에 ruby가 기본적으로 깔려있는데 업데이트 하기 위해 설치할 것들이 많다.

먼저 홈브루를 설치해준다.

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

설치가 완료되면 아래를 터미널에 입력해서 버전을 확인해보자.

brew --version

홈브루를 최신상태로 업데이트 하자

brew update

홈브루를 이용해 rbenv를 설치하자.

brew install rbenv

rbenv가 설치되면 rbenv로 루비를 인스톨한다.

 

rbenv install 2.7.5
rbenv global 2.7.5

아래 두 명령이 같은 버전이라면 완료다.

rbenv versions
ruby --version

하지만 두 버전이 다르다면 .zshrc를 생성 혹은 수정해줘야 한다.

sudo nano ~/.zshrc

제일 밑에 아래 내용을 넣어준다.

eval "$(rbenv init - zsh)"

저장한 후 아래 명령을 입력하고 다시 버전을 확인해 보자.

source ~/.zshrc
블로그 이미지

dev김

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

,

맥의 터미널과 iterm2는 z shell을 사용한다.

~/.zshrc 파일을 생성하거나 수정해서 아래 줄에 아래 내용을 넣어준다.

sudo nano ~/.zshrc
export PATH="$PATH:/Users/username/flutter/bin"

/Users/username/flutter/bin을 원하는 주소로 변경하면 된다.

 

터미널을 종료했다가 다시 실행하면 PATH가 원하는대로 작동한다.

 

bash shell을 사용한다면 ~/.bashrc 혹은 ~/.bash_profile 에 작성해야 한다.

블로그 이미지

dev김

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

,

https://docs.flutter.dev/get-started/install/macos

 

위 페이지의 내용을 한글로 축약한 것이다.

먼저 sdk를 받는다. 자신의 맥이 intel기반인지 silicon(m1~)기반인지 확인하고 받아야 한다.

https://storage.googleapis.com/flutter_infra_release/releases/stable/macos/flutter_macos_3.13.9-stable.zip

나는 인텔 기반이라 이걸 받았다.

 

압축을 풀어서 원하는 곳으로 이동해준다.

터미널을 키고 ls하면 flutter 폴더가 보이는 곳으로 이동한다.

export PATH="$PATH:`pwd`/flutter/bin"

터미널에서 위를 입력한다. 현재 디렉토리/flutter/bin을 PATH에 임시로 추가하는 내용이다.

컴퓨터를 재부팅하면 사라진다. 사라지지 않게 하려면

맥은 zshell을 사용하는데 ~/.zshrc 파일에 PATH를 추가해야 한다.

아래 링크에서 자세한 내용을 확인하기 바란다.

맥에서 환경변수 저장하기

 

flutter doctor

이걸 실행하면 플러터를 환경설정하는데 필요한 전반적인 것들을 체크해주고 알려준다.

 

나는 안드로이드 스튜디오, xcode, 인텔리제이, 크롬이 설치된 상태에서 진행했다.

그랬더니 안드로이드,xcode 2가지만 요구했다.

안드로이드는 command line tools (latest)와 아래를 요구했다.

안드로이드 스튜디오에의 tools메뉴에서 sdk manager를 실행해서 sdk tools에서 위의 것을 설치해주었다.

flutter doctor --android-licenses

라이센스에 동의하는 내용이다.

 

그리고 xcode는 cocoapods를 설치하라는 내용이다.

sudo gem install cocoapods

그런데 여기서도 문제가 생겼다. 인스톨 하는데 필요한 루비가 2.7.4이상인데 2.6.10인가 그랬다.

그래서 루비를 업데이트 해주었다.

 

맥에서 루비 업데이트 하기

 

나머지 내용은 따로 작성하겠다.

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

맥에서 flutter ios, 안드로이드, 웹 설정하기  (0) 2023.11.15
블로그 이미지

dev김

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

,

최근에 ios도 개발해보려고 오래된 맥북을 중고로 샀다.

그런데 개발하려면 xcode를 깔아야 하는데 xcode를 사용하려면 최신 버전의 바로 아래단계이상을 써야한다.

최신이 소노마인데 그 아래인 벤츄라를 써야한다.

그런데 이 맥북은 벤츄라를 지원안하는 모델이었다.

그래서 알아보다가 지원종료된 맥북에 최신 os를 설치할 수  있는 패치를 발견했다.

오픈 코어라는 패치를 이용해 지원종료를 우회해서 깔수 있게 해준다.

최신 os엔 오류가 많을지도 모른다는 생각에 그 바로 밑인 벤츄라를 깔았다.

 

설치하기 위해선 지원종료된 맥이 필요하다.

맥os 상에서 진행을 해야한다.

 

다운로드 https://github.com/dortania/OpenCore-Legacy-Patcher/releases

설치 안내 https://dortania.github.io/OpenCore-Legacy-Patcher/START.html

 

먼저 설치할 수 있는 모델인지 확인하라고 나온다.

https://dortania.github.io/OpenCore-Legacy-Patcher/MODELS.html

 

설치 안내 페이지의 링크들을 꼼꼼히 클릭해서 보길 바란다.

특정 모델에 관한 예외사항도 있는데 여기 설명하지 않은 내용도 있다.

 

다운로드 페이지에서 최신에서 바로 아래단계의 opencore patcher를 받았다.

압축을 풀고 앱을 실행시킨다.

실행된 앱에서 create macos installer를 클릭해 usb에 설치 디스크를 만든다.

usb는 16기가 이상을 사용해야 하는데 다이소에서 5천원에 산 32기가를 사용했다.

download macos installer 를 클릭하고 선택화면에서 설치할 macos를 선택해준다.

mac비밀번호를 입력하라는 창이 나오면 입력해준다.

인스톨할 맥os를 선택해주고 usb를 선택해준다.

 

그 다음은 아까 다운로드 받은 앱에서 build and install opencore를 클릭한다.

install opencore를 클릭하고 install to disk를 클릭해준다.

os를 설치할 ssd 혹은 hdd를 선택하고 efi 디스크를 선택해준다.

설치가 완료되면 재부팅을 하게 되는데 그 때 option키를 누르고 있어야 한다.

그럼 선택창이 나오는데 그 중에 efi boot 를 선택하고 ctrl키를 누르고 엔터를 입력한다.

 

설치하면서 재부팅이 여러번 됐었다. 벽돌되는지 걱정하지 말고 기다려보자.

 

설치가 완료되면 맥os화면으로 넘어간다. 몇가지를 설정해준 뒤에 

다운로드한 앱을 실행해 root patch를 클릭하고 start root patch를 클릭한다.

 

opencore를 설치하면 실행되는 로그인 프로그램이 세가지 있는데 opencore 어쩌고와 myk 어쩌고와 rm 이다.

찜찜하다면 opencore를 사용하지 않거나 해당 프로그램을 실행되지 않게 하는 것도 방법이다.

블로그 이미지

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년이 좀 안되게 근무했었고 그 이상의 공백을 가지고 있다. 다시 현업에 복귀하기 위한 노력의 흔적을 담으려고 한다.

,