[Flutter] GetX 컨트롤러 관리 관련 간단 정리

Flutter|2021. 11. 16. 15:54

1. 생성

Get.put(dependency, {tag, permanent = false, builder});
Get.lazyPut(builder, {tag, fenix = false});
Get.putAsync(builder, {tag, permanent = false});

가장 자주 쓰는 것은 put. 

 

2. 삭제

Get.delete<S>({tag, force = false});

delete의 경우, Future<bool>을 return한다.

 

3. 접근

Get.find<S>(). ...

위와 같은 형태로 S 안에 있는 함수와 변수에 접근할 수 있다.

 

4. 줄여쓰기

class Controller extends GetxController {
  static Controller get to => Get.find();
  static Future<bool> get del => Get.delete<Controller>();
}

위와 같은 형태로 작성하면, Get.find<Controller>(). ...는 Controller.to. ...로, Get.delete<Controller>();는 Get.del;로 사용할 수 있다.

GetX package에서 get/lib/get_instance/src/extension_instance.dart를 보면 아래와 같이 나와있으므로 참고함.

/// Finds a Instance of the required Class `<S>`(or [tag])
/// In the case of using `Get.create()`, it will generate an Instance
/// each time you call `Get.find()`.
S find<S>({String? tag}) => GetInstance().find<S>(tag: tag);

/// Deletes the `Instance<S>`, cleaning the memory and closes any open
/// controllers (`DisposableInterface`).
///
/// - [tag] Optional "tag" used to register the Instance
/// - [force] Will delete an Instance even if marked as `permanent`.
Future<bool> delete<S>({String? tag, bool force = false}) async =>
    GetInstance().delete<S>(tag: tag, force: force);

댓글()

[Flutter] java.security.NoSuchAlgorithmException: Algorithm HmacPBESHA256 not available

Flutter|2021. 8. 25. 18:38

계속 java.security.NoSuchAlgorithmException: Algorithm HmacPBESHA256 not available라며 apk build가 되지 않는 상황이 발생. (debug는 문제없음)

확인해보니, JDK 버전과 관련이 있는 문제인 것 같다.

 

1. build에 사용되는 binary file의 위치를 확인한다.

flutter doctor -v 명령어를 이용하면 되는데, Android toolchain - Java binary at: 부분에 나온 경로를 확인하면 된다.

 

2. keytool 경로 명시

이후 keytool로 key를 생성할 때 그냥 keytool만 사용하는 것이 아니라 1에서 확인한 경로를 명시하여 keytool을 사용.

내 경우에는

"C:\Program Files\Android\Android Studio\jre\bin\keytool" -genkey -v -keystore ~/key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias pckey

로 생성했다.

 

3. 새로 생성한 key에 맞춰 key.properties를 변경하면 완료.

 

문제가 해결된 후, No key with alias 'key' found in keystore ~\key.jks 이런 오류도 떴는데...

전에 쓰던 명령어는 keytool -genkey -v -keystore ~/key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key여서, 비교해보니 원래 key라고 쓰던 부분을 pckey라고 썼길래 key.properties에서 keyAlias=keykeyAlias=pckey로 고쳐줬더니 문제 없이 빌드되었다.

 

이후 환경변수도 flutter doctor -v로 확인한 binary 경로로 제대로 바꿔주었다.

댓글()

[Flutter] app(apk) build

Flutter|2021. 8. 18. 17:55

release 버전의 build가 목적이므로, 이미 keystore 등의 준비가 모두 된 상태라 가정한 순서. 사용중인 주요 api로는 firebase가 있으며, flutter와 firebase의 공식 문서를 참고했다.

 

1. keytool

keytool -genkey -v -keystore c:/Users/USER\_NAME/key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key

Android의 경우에는 이 명령어를 사용하여 키를 생성한다고 하는데,

Warning:
JKS 키 저장소는 고유 형식을 사용합니다. "keytool -importkeystore -srckeystore c:/Users/USER_NAME/key.jks -destkeystore c:/Users/USER_NAME/key.jks -deststoretype pkcs12"를 사용하는 산업 표준 형식인 PKCS12로 이전하는 것이 좋습니다.

라는 warning이 떠서...error로 오인하고

keytool -importkeystore -srckeystore c:/Users/USER_NAME/key.jks -destkeystore c:/Users/USER_NAME/key.jks -deststoretype pkcs12

를 시도했는데, 이번엔 -genkey를 쓸 때마다

keytool 오류: java.lang.Exception: 키 쌍이 생성되지 않았으며 <key> 별칭이 존재합니다.
java.lang.Exception: 키 쌍이 생성되지 않았으며 <key> 별칭이 존재합니다.
        at sun.security.tools.keytool.Main.doGenKeyPair(Unknown Source)
        at sun.security.tools.keytool.Main.doCommands(Unknown Source)
        at sun.security.tools.keytool.Main.run(Unknown Source)
        at sun.security.tools.keytool.Main.main(Unknown Source)

가 발생. PKCS12로 이전하라는 말 대로 했을 때

Warning:
"c:/Users/USER_NAME/key.jks"을(를) Non JKS/JCEKS(으)로 이전했습니다. JKS 키 저장소가 "c:/Users/USER_NAME/key.jks.old"(으)로 백업되었습니다.

이런 warning이 떴던 걸 기억해서 해당 경로에 있는 key.jks와 key.jks.old 파일을 모두 삭제 후 시도하니 성공. 나중에 build하고 보니, PKCS12 warning은 무시해도 build와 설치에 지장은 없었다.

 

2. keystore 참조

PROJECT_ROOT/android/key.properties 생성 후

storePassword=PASSWORD
keyPassword=PASSWORD
keyAlias=key
storeFile=C:/Users/USER_NAME/key.jks

저대로 입력하면 끝. 각자 설정했던 keystore의 비밀번호, key의 비밀번호, key.jks가 위치한 경로를 적어주면 된다. keyAlias=key는 그대로 둘 것.

 

3. Gradle PROJECT_ROOT/android/app/build.gradle

  • 앱 서명을 위한 수정
def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties')
if (keystorePropertiesFile.exists()) {
  keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}

위 코드는 android{ ... } 위에 추가한다.

 

buildTypes {
   release {
       // TODO: release 빌드 버전을 위한 서명 구성을 추가하세요.
       // 현재는 `flutter run --release`가 디버그용 키로 서명되어 동작합니다.
       signingConfig signingConfigs.debug
   }
}

위는 아래와 같이 변경한다.

signingConfigs {
   release {
       keyAlias keystoreProperties['keyAlias']
       keyPassword keystoreProperties['keyPassword']
       storeFile file(keystoreProperties['storeFile'])
       storePassword keystoreProperties['storePassword']
   }
}
buildTypes {
   release {
       signingConfig signingConfigs.release
   }
}

 

  • 난독화와 축소를 위한 수정
android {

    ...

    buildTypes {
        release {
            signingConfig signingConfigs.release
            minifyEnabled true
            useProguard true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

딱 저대로 추가하면 된다. 물론 이걸 위해서는 proguard-rules.pro의 작성이 필요하다. 이 외에도 다른 최적화를 위한 옵션 변경이 있는 것 같은데, 자세히 알아봐야 할 듯. 앱 빌드 할 때 shrinkResources true를 추가로 작성해보기는 했다.

 

4. Proguard

PROJECT_ROOT/android/app/proguard-rules.pro 생성, 아래와 같은 규칙 추가.

## Flutter wrapper
-keep class io.flutter.app.** { *; }
-keep class io.flutter.plugin.**  { *; }
-keep class io.flutter.util.**  { *; }
-keep class io.flutter.view.**  { *; }
-keep class io.flutter.**  { *; }
-keep class io.flutter.plugins.**  { *; }
-dontwarn io.flutter.embedding.**

 

5. Build

  • 앱 번들로 빌드: flutter build appbundle
  • apk로 빌드: flutter build apk --split-per-abi

빌드된 경로(aab, apk 등이 있는 경로)는 build 후 console창에 표시된다. 

 

6. Install

flutter install을 통한 설치가 가능하다고는 하지만, 일반적으로 앱 설치하듯 apk만 옮겨서 바로 설치해도 무방하다.

 

 

Android 앱 출시 준비하기

Flutter 앱을 개발하는 동안, 커멘드 라인에서의 `flutter run`을 실행하거나IDE에 있는 툴바 **Run** 과 **Debug**를 선택하여 앱을 테스트할 수 있습니다. Flutter는 기본적으로 앱의 _debug_ 버전을 빌드합니

flutter-ko.dev

 

Firebase 출시 체크리스트

이 문서에는 Firebase 앱을 출시하기 전에 고려해야 할 사항의 체크리스트가 있습니다. 연결된 앱 업데이트 Android: Firebase Console(OAuth 클라이언트 ID용)의 프로젝트 설정에 앱의 서명 인증서에 출시 S

firebase.google.com

 

앱 축소, 난독화 및 최적화  |  Android 개발자  |  Android Developers

사용하지 않는 코드와 리소스를 삭제하기 위해 출시 빌드에서 코드를 축소하는 방법을 알아보세요.

developer.android.com

 

댓글()