'분류 전체보기'에 해당되는 글 171건

  1. 2024.01.02 libJpeg 에도 버전이 있나?
  2. 2022.08.09 Flutter 처음 시작하기, hello world 1
  3. 2022.08.05 플러터(flutter) 개발환경 구성
  4. 2022.01.03 MacBook M1 에 안드로이드 개발환경 설정하기
  5. 2019.12.06 vivo 계정 만들기 ( with e-mail ) 1
  6. 2019.12.04 샤오미 계정 생성 방법 ( with 이메일 ) 2
  7. 2019.08.20 veridex 툴을 사용하여 non-SDK API 사용 확인법
  8. 2019.06.20 추가하지도 않은 libRSSupport.so 파일이 apk에?
  9. 2019.06.19 [Kotlin] kotlin-stdlib, kotlin-stdlib-jdk7, kotlin-stdlib-jdk8 차이점
  10. 2017.11.17 android studio 저장시 자동 codeStyle 적용 설정

libJpeg 에도 버전이 있나?

개발 2024. 1. 2. 21:04

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

우리가 흔하게 쓰고 있는 libjpeg 라이브러리가 있습니다. 이미지를 jpeg 형식으로 인코딩하거나 디코딩 해주는 라이브러리 입니다. 

요기의 홈페이지 주소는 http://ijg.org/ 입니다. 

방문해보면 아래처럼 정말 단순한 화면만 표시되는데요.. ( 아직도 요런 페이지가 있다니 ㅋㅋ ) 

Independent JPEG Group

흠.. 여기서 도대체 버전별 정보를 어디서 찾으라는 거냐? ㅋ 

원하는 정보를 쉽게 찾을수 없어서 wikipia를 방문해보면 아래처럼 잘 정리되어 있습니다.  ( https://en.wikipedia.org/wiki/Libjpeg

VersionReleasedNew featuresITU T.81 JPEG CompatibleProprietary non-compatible extensions

1 1991
  • First release
  • Baseline or optimized JPEG
  • GIF or PPM output
2 1991
  • Internal improvements
  • More input/output formats
3 1992 Internal and image quality improvements
4 1992 Internal and speed improvements
4a 1993-02-18  
5 1994-09-24 Internal improvements and revised API
5a 1994-12-07  
5b 1995-03-15  
6 1995-08-02
  • Progressive JPEG
  • jpegtran (convert between baseline and progressive)
6a 1996-02-07  
6b 1998-03-27
  • jpegtran extended to lossless rotate
(used by libjpeg-turbo and mozjpeg)
7 2009-06-27
  • jpegtran extended to lossless crop
  • T.851 Arithmetic Coding[19]
  • Scaled DCT[20]
8 2010-01-10
  • SmartScale extension (ITU rejected)[21][22]
  • jpegtran extended to use SmartScale
  • Internal fixes
8a 2010-02-28 RGBA
8b 2010-05-16 Memory corruption & build fixes
8c 2011-01-16 Option for selecting DCT block size (SmartScale)
8d 2012-01-15 RGB JPEG (no color transform to YCbCr)
9 2013-01-13
  • YCoCg color
  • Lossless compression (1x1 DCT)[23]
9a 2014-01-19
  • "JFIFv2" scRGB Wide color gamut (standard unknown)
  • 8-12 bit color (standardJPEG)
9b 2016-01-17 Computation improvements
9c 2018-01-14 jpegtran -wipe
9d 2020-01-12
  • Code cleanup
  • Huffman optimization
  • x64 support (MSVC)
  • jpegtran -drop
9e 2022-01-16 ARM and ARM64 support (MSVC)

Legend:

Old version, not maintained Older version, still maintained Current stable version

여기서 주의깊게 봐야할 버전이 바로바로 6b ( v.6.2 ) 버전 이다. 

1998년에 나온 버전으로 아주 오래되었지만, 아직도 유지가 되는 버전인데.. 

그 이유는 libjpeg-turbo 라는 프로젝트와 mozjpeg 라는 프로젝트에서 해당 버전의 libjpeg를 기반으로 개발되었기 때문이다. 

그리고 6b 버전이후 거의 10년만에 업데이트된 버던7에서는 무손실 jpegtran 기능과 무슨 arithmetic coding 적용과 scaled DCT 으로 성능개선이 된것이 전부이다. 

이후 버전 8 부터 버그랑 몇가지 기능들이 추가되기는 했지만, 하위버전 호환성을 유지하면서 jpeg에 새롭고 혁신적인 것이 추가되기는 어려운 상황으로 보인다. web 환경에 특화되어 있는 google에서 발표한 webP 형식처럼 새로운 술은 새부대가 아니고서는 혁신을 담아내기는 어려울듯 싶다. 

이후 버전9 에서는 YCoCg 칼라스페이스 추가와 광색역(wide color gamut) 그리고 계산성능향상 ( computation improvements ) 등등의 변화가 추가되었다. 

최신버전인 9e 버전에서는 msvc 빌드환경에서 arm / arm64 빌드가 지원된다고 한다. 

추가로 6b 에서 파생되었다는 2가지 프로젝트에 대해서 간단하게 알고만 넘어가보자. 

libjpeg-turbo

  • libjpeg-turbo는 SIMD 지침을 사용하여 기본 JPEG 인코딩 및 디코딩을 가속화하는 libjpeg의 포크입니다.
  • 일반적으로 libjpeg 보다 2~4배정도 인코딩 속도가 빠릅니다. ( 디코딩 속도는 대략 1.5배정도 ) 
  • 현재 널리 사용되는 Linux 배포판(Fedora, Debian, Mageia, openSUSE 등), Mozilla 및 Chrome을 포함하여 많은 프로젝트에서 libjpeg 대신 libjpeg-turbo를 사용하고 있습니다.
  • libjpeg-turbo는 SmartScale을 지원하지 않기로 결정했습니다. 
  • 왜냐하면 SmartScale은 ITU-T 표준이 아니고 자체 연구에서 이 기능(및 DCT 스케일링)이 비효율적이라고 판단했기 때문libjpeg v7, v8 및 v9는 이전 릴리스와의 ABI 호환성을 중단했습니다.

mozjpeg

  • mozjpeg는 Josh Aas와 Mozilla Research의 다른 사람들이 수행한 libjpeg-turbo의 포크입니다. 
  • 이미지 품질을 유지하면서 코딩 효율성 향상을 통해 파일 크기(약 10%)를 줄여서 저장할수 있게 합니다. 
  • 저장된 파일 크기가 작다는 것은 web 환경에서 전송 시간을 줄일수 있어서  웹페이지 로딩 시간을 단축할 수 있습니다.
  • 이를 위해 JPEG 표준과의 완전한 호환성을 유지하고, 인코딩에 많은 시간이 소요되는 방식입니다. 

 

 

 

 

 



:

Flutter 처음 시작하기, hello world

Flutter 2022. 8. 9. 23:12

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

플러터 개발 환경을 구성했으면, 가장 모든 프로그램 언어의 기본 국룰인  "hello, world" 를 만들어 보자~ 

먼저 Android studio를 실행해서 새로운 플러터 프로젝트를 생성한다. 

New Flutter Project

 

그리고 적절하게 이름을 입력해준다. 

Platforms 중에서 'web' 도 그냥 체크해 주었다. 

finish를 누르니.. 이런.. 

invliad dart package name

dart package 이름으로 대문자는 사용을 못하나 보다. 

프로젝트 이름을 hello_world로 변경하고 만든다. 

 

초기로 생성되는 파일들은 위와 같다. 

기본적으로 main.dart 파일이 자동으로 생성되고, 처음 프로젝트 생성시 선택한 platforms 별로 자동으로 생성된 것을 볼 수있다. 

그렇다. 이렇게 flutter로 만들면, Android, iOS, web 으로 실행해 볼 수가 있는 것이다. 좋구나~ 

그리고 바로 오른쪽 위에 있는 초록색 run 아이콘을 ( play 아이콘과 비슷한 ) 누르면 실행이 된다. 실행시 web, mobile, desktop 을 선택할 수도 있으니 좋구나~ 

실행하면, 아래처럼 바로 실행이 된다. ㅋㅋ

 

이제 flutter의 장점인 hot load 를 사용해보자 

main.dart 에서 title인 'Flutter Demo Home Page'를 찾아서 'hello world' 로 변경해보자. 

변경후 저장버튼을 누르면 실행되어 있는앱에 바로 반영된다. 오호~ 

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'hello world'), // 여기변경 
    );
  }
}

 

혹시 저장했는데 바로 반영이 안되면 상단의 번개모양 아이콘 ( hot reload ) 버튼을 눌러준다. 



:

플러터(flutter) 개발환경 구성

Flutter 2022. 8. 5. 01:08

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

플러터는 하나의 원소스 멀티플랫폼을 추구하는 GUI 프레임 워크이다. 

하나의 소스로 android, iOS, Windows, Linux 및 웹용 애플리게이션을 만들수 있으므로, 요즘같은 시대에 매력적인 프레임워크라고 할 수있다.  

플러터_멀티플랫폼

 

또하나의 장점으로는 동일한 사용자 경험( User Experience )을 제공할수 있다는 것이다. 모바일 플랫폼인 android와 iOS만 하더라도 각각의 OS 가 추구하는 디자인이 다르고, UI 철학도 다른데 플러터를 이용하면 같은 UI 를 제공할 수 있게되므로 하나의 서비스라면 android, iOS, Windows 에 통일된 UX를 하나의 소스로 구현하게 되므로 생산성 향상및 서비스의 완성도도 올라간다고 할 수 있다.

[ 개발환경 구성 ] 

개발환경 구성은 크게 3단계로 구성된다. 

  • flutter SDK 다운로드 및 설치 
  • flutter 환경변수 설정 
  • Android Studio에서 flutter 플러그인 설치 

 

먼저 SDK를 다운받아보자. 

macOS는 cpu가 2가지 이므로 자신의 cpu에 맞는 플러터를 다운받는다. 

Intel cpu : https://storage.googleapis.com/flutter_infra_release/releases/stable/macos/flutter_macos_3.0.5-stable.zip

Apple Silicon : https://storage.googleapis.com/flutter_infra_release/releases/stable/macos/flutter_macos_arm64_3.0.5-stable.zip

최신버전은 아래에서 확인하고 다운을 받도록 하자. 

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

zip 파일을 적당한 곳에 압축을 해제하고 아래처럼 언집을 한다. 

cd ~/hanburn
unzip ~/Downloads/flutter_macos_3.0.5-stable.zip

 

다음으로는 어디서든지 flutter를 실행 할 수 있도록 환경변수에 추가해 준다.  아래의 hanburn은 유저이름이다. 

export PATH="$PATH:/Users/hanburn/flutter/bin"

 

다음으로는 Android Studio에서 flutter 플러그인을 설치해야 되는데, 혹시 Android 개발환경이 안되어 있는 사람은 아래글을 보고 android 개발 환경을 구성하도록 하자. 

2022.01.03 - [android] - MacBook M1 에 안드로이드 개발환경 설정하기

 

MacBook M1 에 안드로이드 개발환경 설정하기

M1 맥북의 성능이 너무 좋다고 해서 하나 장만하였는데.. 오랜만의 초기 환경설정을 정리해본다. 1. Android Stduio 설치하기 다운받기 : https://developer.android.com/studio 다운받을때, arm용을 받으면 된다..

hanburn.tistory.com

 

안드로이드 스튜디오 설치가 되었으면, 플러터 닥터를 실행해서 안드로이드 연결을 위한 점검을 한다. 

flutter doctor

그러면 자동으로 환경 체크를 하면서 문제가 있으면 문제가 있다고 알려준다. 예를들면 아래와 같은 형식이다. 아래는 Android SDK 경로는 찾았는데, command line tools 를 못찾았으니 친절하게 다운받는 경로도 알려주고 있다. ㅋ 

[-] Android toolchain - develop for Android devices
    • Android SDK at /Users/obiwan/Library/Android/sdk
    ✗ Android SDK is missing command line tools; download from https://goo.gl/XxQghQ
    • Try re-installing or updating your Android SDK,
      visit https://docs.flutter.dev/setup/#android-setup for detailed instructions.

여기까지 설치하였으면 이제는 Android Studio에서 플로터 플러그인을 설치하면 된다. 

Android Studio의 preference를 열고 Plugins를 선택하고 검색창에 flutter를 치면 된다. 제일 상단에 있는 11.9M 크기를 선택해서 설치하면 끝이다.  추가로 flutter 관련된 여러가지 플러그인이 있는데, 요건 차차 사용해보면서 좋은것을 정리해서 따로 포스팅 하도록 하겠다. 

다음으로는 모든 개발의 시작인 hello, world 같은 기본적인 시작을 해보자~ 



:

MacBook M1 에 안드로이드 개발환경 설정하기

android 2022. 1. 3. 16:37

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

M1 맥북의 성능이 너무 좋다고 해서 하나 장만하였는데.. 

오랜만의 초기 환경설정을 정리해본다. 

 

1. Android Stduio 설치하기 

다운받기 : https://developer.android.com/studio

다운받을때, arm용을 받으면 된다. 

android studio M1용

그리고 그냥 설치하면 된다. 

 

2. Java 설치하기 

Android Studio를 설치하면 java는 따로 설치를 안해도 gradle을 위한 embeded 버전이 같이 설치되어 있다. 

Android Studio 상단의 File -> Project Structure 메뉴를 선택하고 

좌측의 SDK Location을 누르고 'Gradle Settings'를 누르면 Embeded JDK가 선택되어 있다. 

여기에 있는 경로를 터미널에서 사용하려면, path 설정에 경로를 추가해도 되는데.. 

최신의 JAVA를 설치하고 싶으면, "Download JDK" 메뉴를 통해서 쉽게 설치할 수 있다. 

여기서 설치하니 바로 터미널에서도 사용가능하다. 

예전에는 jdk 받을려고 오라클 회원가입하고, 까먹고 또 비번찾고 했었는데.. 편리하게 설치할 수 있어서 좋다. 

설치된 경로는 아래와 같다.  

~/Library/Java/JavaVirtualMachines/openjdk-17.0.1

 

3. ADB 경로 설정하기 

관례상 ANDROID_HOME을 설정해준다. Android Studio설치를 기본적으로 했으면 대략 다음 경로일것이다. 

~/Library/Android/sdk

사용하는 쉘이 bash이면 ~/.bash_profile 이나 ~/.bashrc를 수정하면 되고
zsh이면 ~/.zshrc 파일을 수정하면 된다.

export ANDROID_HOME="/Users/user/Library/Android/sdk"
export PATH="$PATH:$ANDROID_HOME/platform-tools/"

상대경로인 "~/Library/Android/sdk" 을 썻더니 안되서 풀경로 "/Users/user/Library/Android/sdk" 를 적었다. 

터미널에 바로 적용하려면 

source ~/.zshrc

그리고 터미널에 adb를 입력해서 실행되면 OK~ 

 



:

vivo 계정 만들기 ( with e-mail )

android 2019. 12. 6. 14:00

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

안드로이드 개발을 하면서, 중국 시장은 참 매력적인 시장이다. 

거대한 인수구는 인도와 비슷하지만, 인도보다는 조금더 사양이 좋은 기계들이 보급되어 있어서~ ㅋㅋ 

그러나 중국 안드로이드 폰은 ASOP 를 가져다가 폰 제조사들이 커스터마이징을 하다보니 이것 저것 문제점들이 많이 생긴다. 

중국에서 만이 사용되는 폰제조사 중에서 vivo폰의 경우에는 계발자 옵션을 통해서 usb로 apk를 넣으려고 하면 vivo 계정이 있어야 한다. 

중국 vivo폰을 중고로 사고, 개발폰으로 사용하는데 개통은 하지 않고 싶을때는 간단하게 이메일(e-mail)을 통해서 vivo 계정을 만들수 있다. 


vivo 계정 만드는곳 : https://passport.vivo.com/in/#/register



나라는 한국을 선택하고 e-mail을 입력하면 되는데.. 

여기에 네이버메일이나 다른 국내 메일주소를 입력하니 모르는 주소라고 입력이 안된다. 그래서 gmail 계정을 입력하니 넘어가네요. 


그러면 등록한 이메일로 확인 메일과 verification code가 도착하는데, 다음 화면에서 입력해주면 된다.


주의 

vivo폰에 계정을 사용해서 로그인을 하고, 다른 계정으로 변경하려면, 기존에 로그인한 계정의 비번을 알아야 한다. 이걸 모르면 계정을 만들어도 내 계정으로 로그인이 안된다. ( 좀 그지 같은데, 엄청난 보안을 강조하고 있는듯 ) 





:

샤오미 계정 생성 방법 ( with 이메일 )

IT활용 2019. 12. 4. 13:33

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

요즘에 샤오미 무선청소기 로봇이나 공기청정기등 샤오미 제품을 사용하는 사람이 늘고 있는데요.. 

( 물론 샤오미 휴대폰도 있고 ) 


샤오미 제품을 사용하기 위해서는 샤오미 홈이라는 앱을 사용하면 휴대폰을 활용해서 좀 더 편리하게 사용할수 있습니다. 그래서 샤오미 계정을 e-mail을 통해서 생성하는 방법을 알아 봅니다. 


먼저 샤오미 계정생성하는 페이지에 접속을 합니다. 

https://account.xiaomi.com/



계정 생성을 위해서는 로그인 버튼 아래에 있는 "계정생성"을 클릭합니다. 

그러면 아래화면처럼 국가는 자동으로 입력되고 e-mail을 입력합니다. 


"Mi 계정생성"을 누르고 다음 페이지로 가서 비밀번호를 설정합니다. 

그러면 입력한 이멜일 주소로 확인 메일이 오는데, 확인메일을 클릭하면 됩니다. 


주의점 

1. 샤오미 계정은 한번 생성하면 삭제가 불가능함. 

2. 샤오미 계정을 잘 사용하는것이 아니라면 비밀번호를 잊기가 쉽다. 그래서 등록한 이메일을 이용해서 비번을 재설정 할수 있으므로 이메일은 꼭 기억하자. 


아래는 비밀번호 찾기 화면 










:

veridex 툴을 사용하여 non-SDK API 사용 확인법

android 2019. 8. 20. 22:31

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

Android 9.0 ( APL Level 28 ) 부터 public API가 아닌 API 사용에 대해서 제한이 생긴다.  그럼 pubic API가 아닌건 어떤 것일까? 

Android의 View.java 파일을 보면 아래처럼 @hide로 주석이 달려 있는 코드들이 있다. 

/**
* Set an observer to collect stats for each frame rendered for this view.
*
* @hide
*/
public void addFrameMetricsListener(Window window,
Window.OnFrameMetricsAvailableListener listener,
Handler handler) {
if (mAttachInfo != null) {
if (mAttachInfo.mThreadedRenderer != null) {
if (mFrameMetricsObservers == null) {
mFrameMetricsObservers = new ArrayList<>();
}

FrameMetricsObserver fmo = new FrameMetricsObserver(window,
handler.getLooper(), listener);
mFrameMetricsObservers.add(fmo);
mAttachInfo.mThreadedRenderer.addFrameMetricsObserver(fmo);
} else {
Log.w(VIEW_LOG_TAG, "View not hardware-accelerated. Unable to observe frame stats");
}
} else {
if (mFrameMetricsObservers == null) {
mFrameMetricsObservers = new ArrayList<>();
}

FrameMetricsObserver fmo = new FrameMetricsObserver(window,
handler.getLooper(), listener);
mFrameMetricsObservers.add(fmo);
}
}

이런 함수(또는 필드)들은 public 접근자로 되어 있는데도 사용할 수 가 없다. 바로 이런것들이 non-public function 가 되는 것이고, 이러한 함수와 필드(변수)를 통틀어서 non-SDK Interface 라고 부른다. 


이렇게 숨겨진 함수들을 java의 reflection을 통해서 사용하는 방법이 있다. 그런데, 어떤 특정 기능을 구현할때 이런 함수들을 사용하면 상당히 편리한 경우가 있는데, 구글에서는 이런 편법적인 사용을 금지한 것이다. 이유는 public 으로 오픈한 함수가 아니라서 구글에서는 해당 함수이름을 변경하거나 삭제하거나 맘대로 하게 되는데, 특정 App에서 non-SDK Interface를 사용하였다면 문제가 발생하기 때문이다. 

그리고 구글에서는  non-SDK Interface에 대해서 아래처럼 3가지로 구분하고 있다. 


블랙리스트 : 앱의 target API와 상관없이 사용하면 안되는 리스트 

다크그레이 리스트 : target API를 28로 설정하는 경우에 사용에 제한이 되는 리스트 

라이트그레이 리스트 : target API를 28로 설정하는 경우에 사용은 가능하지만 잠제적으로 문제가 될 수 있는 리스트 


그리고 android 9.0부터는 이러한 non-SDK를 사용했을때 발생하는 문제는 아래와 같다. 

액세스 수단결과
필드를 참조하는 Dalvik 명령어NoSuchFieldError 발생
메소드를 참조하는 Dalvik 명령어NoSuchMethodError 발생
Class.getDeclaredField() 또는 Class.getField()를 통한 리플렉션NoSuchFieldException 발생
Class.getDeclaredMethod()Class.getMethod()를 통한 리플렉션NoSuchMethodException 발생
Class.getDeclaredFields()Class.getFields()를 통한 리플렉션결과에 비 SDK 구성원 없음
Class.getDeclaredMethods()Class.getMethods()를 통한 리플렉션결과에 비 SDK 구성원 없음
env->GetFieldID()를 통한 JNINULL이 반환되고 NoSuchFieldError발생
env->GetMethodID()를 통한 JNINULL이 반환되고 NoSuchMethodError 발생


target API를 28로 설정하것이 아니면 일단은 블랙리스트의 사용 여부만 검점하면 되는데, 이건 검사해 주는 도구가 veridex 도구 이다. 

또는 StrictMode의  detectNonSdkApiUsage 을 사용해도 되는데, 이방법은 실행시간에 오류를 알려 주게 되므로 모든 기능을 다 사용해 봐야 어느 정도 검증을 할 수 있게 된다. 그래서 target API를 28로 올리는 시점에는 veridex로 한번 체크하는것을 권한다. 



위의 경로에서 다운받고 압축을 푼 뒤에, 아래의 명령으로 실행하면 된다. 

./appcompat.sh --dex-file=test.apk


apk를 압축해제한후 직접 dex파일을 지정해도 되지만, 편리하게 그냥 apk 이름을 넣으면 알아서 검사를 해준다. 검사결과는 대략 아래처럼 표시된다. 


--- 중략 ---

다행이도 아직 target API가 28이 아니라서 큰 문제는 없다. 

그리고 veridex사용지 주의점이 있는데 완벽하게 체크해주는게 아니라는.. 

2019.8.20 기준으로 veridex의 한계점은 아래와 같다. 

  • JNI를 통한 호출은 감지할 수 없습니다.
  • 리플렉션을 통한 호출의 경우 일부만 감지할 수 있습니다.
  • 비활성 코드 경로 분석이 API 수준 검사로 제한됩니다.

즉, 완벽한게 아니라서, veridex로 검사하고, StrictMode로 같이 체크하는 수 밖에.. ㅠㅠ 






:

추가하지도 않은 libRSSupport.so 파일이 apk에?

android 2019. 6. 20. 20:54

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

app 용량이 커지고 있어서.. 빌드된 apk를 풀어서 분석하던 도중에.. native lib 에 새로운 파일이 보였다. 

lib/armeabi-v7a/librsjni_androidx.so

lib/armeabi-v7a/libsjni.so

lib/armeabi-v7a/libRSSupport.so


lib/arm64-v8a/librsjni_androidx.so

lib/arm64-v8a/libsjni.so

lib/arm64-v8a/libRSSupport.so


이중에서 libRSSupport.so 파일의 용량이 제일 크고, 다 합치면 4MB를 넘는 것이었다.. 

소스코드에서는 찾을수 없는 파일이었고, 이름으로 유추해보면 RenderScript 관련된 파일 같은데, 

검색을 조금 해보니 다음과 같은 결과를 찾았다. 

렌더스크립트를 사용하기 위해서 gradle에 아래처럼 설정을 해주면 자동으로 들어가는 파일이었다. 

android {
    compileSdkVersion 
28

    defaultConfig 
{
        minSdkVersion 
9
        targetSdkVersion 
19

        renderscriptTargetApi 
18
        renderscriptSupportModeEnabled 
true

    
}
}

renderscriptSupportModeEnabled 항목을 true로 하면, buildtool 버전에 따라서 알맞는 버전의 so 파일이 같이 바인딩되어서 apk에 포함되는데, buildtool 버전을 28.0.3 사용하고 있다면 대략 64bit 기준으로 2.2MB 정도되는 so 파일이 포함된다. 

설명 : renderscriptSupportModeEnabled - Specifies that the generated bytecode should fall back to a compatible version if the device it is running on does not support the target version.

추가되는 파일 : https://android.googlesource.com/platform/prebuilts/fullsdk-linux/build-tools/28.0.3/+/androidx-paging-release/renderscript/lib/packaged/arm64-v8a/libRSSupport.so 

그런데 신기한점은 내가 renderscript를 사용안하고 있는데, 해당 so 파일이 포함되었다. ㅠㅠ 

조금더 찾아 보니, 원인은 glide-transformations 이었다. 

해당 현상이 issue로도 등록되어 있는데 ( https://github.com/wasabeef/glide-transformations/issues/133 ) 아직 문제해결은 안되어 있는 상태다.  glide-transformations에서 제공하는 BlurTransformation 에서 rs를 사용하는듯 하다.  사용안하는 기능때문에 32bit, 64bit 합쳐서 4MB가 추가된다니 좀 아까워서..  gradle 설정에서 아래를 추가해보고 확인해 봤다. 

renderscriptSupportModeEnabled false


그래도 추가된다.  그지같다. 

결론 : 사용하고 있는 transform 코드만 가져다 붙이고 glide-transforamtions 의존성을 제거하는 방법 밖에 없다.. ㅠㅠ




:

[Kotlin] kotlin-stdlib, kotlin-stdlib-jdk7, kotlin-stdlib-jdk8 차이점

android 2019. 6. 19. 11:44

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

코틀린을 사용해보려고 프로젝트에 라이브러리를 추가하려고 검색해보니 아래의 3가지 버전이 있네요. 

implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"

implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"

implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"

 

안드로이드 스튜드오에서 기본으로 코틀린 사용 체크하고 만들어지는 기본 세팅에서는 "kotlin-stdlib-jdk7" 으로 설정되던데.. 궁금해서 검색해봐도 잘 안나와서 각각 변경해보면서 추가된 라이브러리를 비교해 봤습니다. 

kotlin-stdlib

당연히 가장 기본이 되는 표준 라이브러리 이고, dependency에 따라서 kotllin-stdlib-common 추가 됩니다. 

kotlin-stdlib

 

kotlin-stdlib-jdk7

kotlin-stdlib-jdk7

jdk7 관련된 라이브러리가 추가로 보이는데, 달랑 2개의 클래스가 있을 뿐이네요.  짐작해보면 jdk7에서 지원하는 AutoCloseable 관련된 확장함수 추가가 전부인것 같네요. 

kotlin-stdlib-jdk8

kotlin-stdlib-jdk8

jdk7이 자동으로 추가되면서, jdk8 언어에서 지원하는 몇가지 기능들에 대한 지원이 추가된것 같네요. 프로젝트에서 아래와 같이 java8을 타겟으로 설정해서 사용하고 있으면 이걸 추가해서 사용하면 될것 같네요. 

compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

 

추가로 kotlin-stdlib-jre7 같은것도 있었는데, 이름이 kotlin-stdlib-jdk7 으로 변경된것 같으니 jre 버전 사용중이었다면 jdk 버전으로 변경하면 됩니다. 



:

android studio 저장시 자동 codeStyle 적용 설정

android 2017. 11. 17. 10:55

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

안드로이드 스튜디오로 개발을 할때 (또는 IntelliJ) 팀간에 같은 코드스타일을 적용해야합니다. 

팀이 아니라면 필요 없을수도 있지만, 팀이라면 거의 필수 입니다. 


팀이면 git 같은 SVC 을 사용할것이고, 그러면 commit한 내용에 대해서 변경사항을 볼 수 있습니다. 

그런데, coding convention 과 code fomatter가 다르다면, 파일 전체가 변경되었다고 표시되는 경우가 있습니다. 


Android Studio 에서는 아래의 단축키를 누르면 code style이 적용됩니다. 

예를들어서 아래와 같은 코드가 있을때.. 

public class JPerson {



private String name;

public JPerson() {
if(name==null){
name = "Hong Gil Dong";
}
}
}

다음과 같이 띠어쓰기와 줄간격, 탭간격들이 조절됩니다. 

public class JPerson {


private String name;

public JPerson() {
if (name == null) {
name = "Hong Gil Dong";
}
}
}

차이점이 보이시나요? ㅋㅋ 

그리고 추가로 import 문의 순서도 정렬을 해주고, 안쓰는 import 문도 제거가 되게 하려면 Reformat File Dailog 에서 Optimize import에 체크해주면 됩니다. (단축키 : shift + option + command + L ) 


그러면,파일을 저장할때마다 reformat을 수행하는것이 번거롭기 때문에 매크로를 이용해서 reforamt 과 save를 같이 되도록 만든다음에 해당 매크로의 단축키를 지정하면 편리하게 이용할수 있습니다. 


1. Reformat File 다이얼로그( 단축키 shift+option+command+L) 에서 Optimize import에 체크 

2. menu edit → macro → start macro recording

3. 아래 단축키 차레로 누른다. 

   - reformat file ( 단축키 option+command+L)

   - save ( 단축키 ( command + S) 

4. menu edit → macro → stop macro recording

5. macro의 이름을 적당이 붙인다. (예, reformat and save ) 

5. 설정 → keymap 에서 save의 단축키를 위에서만든 macro로 변경한다. 


저는 위의 사진처럼, 기존의 저장 단축키 commad + S 에  새로만든 매크로를 연결하였습니다.  그럼 저장되기 전에 자동으로 reformat이 되고 저장이 됩니다. 





: