Fresco: ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‚ฎ์€ ์ด๋ฏธ์ง€ ํ’ˆ์งˆ<image/> RN์˜ ๊ตฌ์„ฑ์š”์†Œ &gt; = 0.57(Fresco &gt;= 1.10.0)

์— ๋งŒ๋“  2019๋…„ 08์›” 22์ผ  ยท  57์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: facebook/fresco

์„ค๋ช…

RN ๋ฌธ์ œ: RN 0.57.x ๋ฒˆ๋“ค๋กœ ์ œ๊ณต๋˜๋Š” ํฐ ์ด๋ฏธ์ง€๋Š” \๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณผ ๋•Œ ํ’ˆ์งˆ์ด ๋‚ฎ์Šต๋‹ˆ๋‹ค.

Android์—์„œ๋งŒ ๋Œ€์šฉ๋Ÿ‰ ๋ฒˆ๋“ค(PNG, GIF ๋ฐ ๊ธฐํƒ€ ํ˜•์‹, JPEG ์•„๋‹˜) ์ด๋ฏธ์ง€๋ฅผ ๋กœ๋“œํ•  ๋•Œ ํ’ˆ์งˆ์ด ๋‚ฎ์Šต๋‹ˆ๋‹ค.

์™ผ์ชฝ ์Šคํฌ๋ฆฐ์ƒท์—์„œ RN 0.56.0์œผ๋กœ ์‹คํ–‰๋˜๋Š” ๋˜‘๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ๋ณด๊ณ  ์˜ค๋ฅธ์ชฝ ์Šคํฌ๋ฆฐ์ƒท์—์„œ RN 0.57.1์„ ๋ด…๋‹ˆ๋‹ค . ์ฝ”๋“œ๋Š” ๋‹จ์ˆœํ•œ ์ด๋ฏธ์ง€ <Image source={require('./assets/ELHall1.png')} resizeMethod="resize" /> ์ด๊ณ  ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋Š” 2111 x 4645 pixels ์ž…๋‹ˆ๋‹ค. ๋‘ ํ”„๋กœ์ ํŠธ ๋ชจ๋‘ react-native init RN057ImageTest ๋ฐ react-native init --version="0.56.0" RN056ImageTest ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กœ ์„ค์น˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ 0.56 ๋ฐ ์ตœ์‹  RN 0.60.x ์ดํ›„์˜ ๋ชจ๋“  ๋ฒ„์ „์—์„œ ๊ณ„์† ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ RN Fresco lib๊ฐ€ 1.9.0์—์„œ 1.10.0์œผ๋กœ 0.56๊ณผ 0.57 ์‚ฌ์ด์—์„œ ๋ณ€๊ฒฝ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํ™•์ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋Œ“๊ธ€ ํ™•์ธ https://github.com/facebook/react-native/issues/21301#issuecomment-520155609.

Fresco ๋ฌธ์ œ์—์„œ ๊ฒ€์ƒ‰ํ•œ ํ›„ ํฐ ์ด๋ฏธ์ง€๋ฅผ ์กฐ๊ฐ ๋‹จ์œ„๋กœ ๋‚˜๋ˆ„๊ณ  ์žฌ๊ตฌ์„ฑํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ด€๋ จ ๋ฌธ์ œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋งŽ์€ ๊ฒฝ์šฐ(๋Œ€๋ถ€๋ถ„์˜ ์ง€๋„ ๊ด€๋ จ ํฐ ์ด๋ฏธ์ง€)๋ฅผ ํ•ด๊ฒฐํ•˜์ง€๋งŒ ํŠนํžˆ ๋™์  ๋กœ๋“œ์˜ ๊ฒฝ์šฐ ๋งค์šฐ ๋ถˆํŽธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. /๋งŒ๋“  ์ด๋ฏธ์ง€. ์ด๊ฒƒ์€ RN 0.56๊นŒ์ง€ ๊ทธ๋ฆฌ๊ณ  0.57๋ถ€ํ„ฐ ์ž‘๋™ํ–ˆ์œผ๋ฉฐ ๊ทธ ์ดํ›„์—๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ƒ์‹

RN: <Image/> ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์ถ”๊ฐ€๋œ ์ดˆ๊ธฐ App.js ์ž…๋‹ˆ๋‹ค.

...
type Props = {};
export default class App extends Component<Props> {
  render() {
    return (
      <View style={styles.container}>
        <Image source={require('./assets/ELHall1.png')} resizeMethod="resize" />
      </View>
    );
  }
}
...

์ถ”๊ฐ€ ์ •๋ณด

์ด ๋Œ“๊ธ€ https://github.com/facebook/react-native/issues/21301#issuecomment-520418832์—์„œ lambdapioneer ๋Š” ์ด๊ฒƒ์ด ํฐ ์ด๋ฏธ์ง€ ์ถ•์†Œ(ํ•˜์œ„ ์ƒ˜ํ”Œ๋ง)์™€ ๊ด€๋ จ์ด ์žˆ์„ ์ˆ˜

Fresco๊ฐ€ ํฐ ์ด๋ฏธ์ง€๋ฅผ ์ถ•์†Œ(ํ•˜์œ„ ์ƒ˜ํ”Œ๋ง)ํ•˜๋Š” ๋ฐฉ๋ฒ•(๋ฉ”๋ชจ๋ฆฌ ๋ฐ ์„ฑ๋Šฅ ๋ฌธ์ œ์— ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์ž„)๊ณผ ๊ด€๋ จ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๊ธฐ๊ฐ„ ๋™์•ˆ .so unsatisfied ๋งํฌ ์˜ค๋ฅ˜๋ฅผ ๋ˆ„๋ฅด๋Š” ๊ฒƒ์„ ์ค„์ด๋Š” ๋ฐ ๋„์›€์ด ๋˜๋„๋ก ๊ธฐ๋ณธ ์ฝ”๋“œ ์ข…์†์„ฑ์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ์ด ์˜์—ญ์— ์•ฝ๊ฐ„์˜ ๋ณ€๊ฒฝ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋งํ•˜์ž๋ฉด, ๋˜ ๋‹ค๋ฅธ ๋Œ€๊ทœ๋ชจ ๊ฐœ์„ ์˜ ๋ถ€์ž‘์šฉ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํ”„๋ ˆ์Šค์ฝ” ๋ฒ„์ „: >= 1.10.0
  • ํ”Œ๋žซํผ ๋ฒ„์ „: RN >= 0.57, ๋ชจ๋“  Android ๋ฒ„์ „
enhancement

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

@CaptainN ๋ฌด๋ก€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ๋‚ด๊ฐ€ ๊ทธ๊ฒƒ์„ํ–ˆ๊ณ  ๋ชจ๋“  ์˜ค๋ฅ˜์— ์ง๋ฉดํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— Fresco๋ฅผ ์„ค์น˜ํ•˜๊ณ  ํŒจ์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ง€์นจ์ด ํฌํ•จ๋œ ์Šคํƒ€ํ„ฐ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ํ›จ์”ฌ ์ ์€ ์‹œ๊ฐ„์ด ์†Œ์š”๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ์žˆ์Šต๋‹ˆ๋‹ค: https://github.com/clytras/RN061FrescoBuild

RN 0.61.5 ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—๋Š” ์ž์„ธํ•œ ์ง€์นจ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ฒดํฌ ์•„์›ƒ์„ ํ”„๋ ˆ์Šค์ฝ”์„, ํด๋ก  v2.1.0 ํ•˜๊ณ  ํŒจ์น˜๋ฅผ ์ ์šฉ DecodeProducer.java ๊ทธ๋ž˜์„œ ๋‹ค์šด ์ƒ˜ํ”Œ๋ง ์ฝ”๋“œ๋ฅผ ์ฃผ์„. Android NDK๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  libraries/fresco/local.properties ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ

์ง€์นจ๊ณผ yarn ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋”ฐ๋ฅด๋ฉด ๊ธฐ์กด RN >= 0.60(_๋˜๋Š” ์ด์ „ ๋ฒ„์ „_) ํ”„๋กœ์ ํŠธ์— fresco lib๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  57 ๋Œ“๊ธ€

์•ˆ๋…•ํ•˜์„ธ์š”, ์ตœ๊ทผ์— ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ™œ๋™์ด ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์—ฌ์ „ํžˆ ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๊ด€์‹ฌ์ด ํ•„์š”ํ•œ๊ฐ€์š”? ๋” ์ด์ƒ ํ™œ๋™์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉด ์ด ๋ฌธ์ œ๊ฐ€ ์ข…๋ฃŒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด ๋ฌธ์ œ์— "๋ฒ„๊ทธ" ๋˜๋Š” "ํ–ฅ์ƒ" ๋ ˆ์ด๋ธ”์„ ๋ถ™์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ €๋Š” ๊ทธ๋Œ€๋กœ ๋‘ก๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ๊ธฐ์—ฌ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

RN 0.56.0 ๋ฐ 0.57.1์€ ์–ด๋–ค Fresco ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ด ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋Š” ์ปค๋ฐ‹ ์ˆ˜๊ฐ€ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” @oprisnik ๋‹˜ ,

https://github.com/facebook/react-native/issues/21301#issuecomment -520155609๊ฐ€ ์ •ํ™•ํžˆ ๋ณด๊ณ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์‚ฌ๋ฌด์‹ค๋กœ ๋Œ์•„์˜ฌ ๋•Œ ์–ด๋–ค ๋ฒ„์ „ ํŒจ์น˜๊ฐ€ ์—…๊ทธ๋ ˆ์ด๋“œ๋˜์—ˆ๋Š”์ง€ ์ •ํ™•ํžˆ ํ™•์ธํ•˜๊ณ  ํ™•์ธํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ๋ฒ„์ „์—์„œ ์ด ๋™์ž‘์ด ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” @clytras , ์ด ์ €์žฅ์†Œ ์—์„œ ํ™”๋ฉด ์˜ ์ด๋ฏธ์ง€ ๋ฅผ ์ฐพ์•˜ ์Šต๋‹ˆ๋‹ค .
๋‚˜๋Š” ๊ทธ๋ฆผ์„ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ๊ทธ๋ฆผ์ด 2111(๋„ˆ๋น„)*4645(๋†’์ด)์ž„์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

Fresco๋Š” OpenGL ์ œํ•œ์— ๋งž๊ฒŒ ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์šด์ƒ˜ํ”Œ๋งํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์ด๋ฏธ์ง€์˜ ์ตœ๋Œ€ ๋„ˆ๋น„/๋†’์ด๋Š” ์ด ์ค„์˜ ํ•˜๋“œ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

๋‚ด ์ƒ๊ฐ์—,
์‰ฌ์šด ๋ฐฉ๋ฒ•์€ ResizeOption์˜ maxBitmapSize ํ•„๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์€ Fresco๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งค์šฐ ํฐ ์ด๋ฏธ์ง€๋ฅผ ํ‘œ์‹œํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์œ„์ ฏ์„ ๋งŒ๋“ค๊ณ  ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งค์šฐ ํฐ ์ด๋ฏธ์ง€๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ์€ ๋งŽ์€ Android ํŒ€์˜ ์„ ํƒ์ž…๋‹ˆ๋‹ค.

@s1rius ์•ˆ๋…•ํ•˜์„ธ์š”, ๊ณต๊ฐœ๋œ ๋ฌธ์ œ ๊ฒŒ์‹œ๋ฌผ์„ ์ฝ์œผ๋ฉด ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์”๋‹ˆ๋‹ค.

์ฝ”๋“œ๋Š” ๋‹จ์ˆœํ•œ ์ด๋ฏธ์ง€์ผ ๋ฟ์ž…๋‹ˆ๋‹ค ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋Š” 2111 x 4645ํ”ฝ์…€์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ Fresco 1.9.0์—์„œ 1.10.0์œผ๋กœ ๋ณ€๊ฒฝ๋œ RN >= 0.57์—์„œ ๋ฐœ์ƒํ•œ ๋™์ž‘ ๋ณ€๊ฒฝ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ์™€ ๊ฐ™์€ ํฐ ์ด๋ฏธ์ง€๋Š” ํ•ด๋‹น ๋ฒ„์ „ ์ด์ „์— ์ „์ฒด ํ’ˆ์งˆ๋กœ ์ž‘๋™ํ•˜๊ณ  ๋กœ๋“œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. RN repo์˜ ๊ธฐ๊ณ ์ž๋“ค์€ ์ด๊ฒƒ์ด RN ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ Fresco lib ๋ฌธ์ œ๋ผ๊ณ  ๋งํ•˜๋ฉด์„œ ๋ฌธ์ œ๋ฅผ ์ข…๋ฃŒํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜๋„์ ์œผ๋กœ ํ–‰๋™์„ ๋ณ€๊ฒฝํ–ˆ๋‹ค๋ฉด ์ด ๋ฌธ์ œ๋ฅผ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ, ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์ง€๋งŒ ์ด๊ฒƒ์ด ๋ฒ„์ „๊นŒ์ง€ ์ž‘๋™ํ•˜๋‹ค๊ฐ€ ๊ฐ‘์ž๊ธฐ ์ด์œ ์— ๋Œ€ํ•œ ์ •๋ณด ์—†์ด ์ž‘๋™์ด ์ค‘์ง€๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”, ์ตœ๊ทผ์— ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ™œ๋™์ด ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์—ฌ์ „ํžˆ ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๊ด€์‹ฌ์ด ํ•„์š”ํ•œ๊ฐ€์š”? ๋” ์ด์ƒ ํ™œ๋™์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉด ์ด ๋ฌธ์ œ๊ฐ€ ์ข…๋ฃŒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด ๋ฌธ์ œ์— "๋ฒ„๊ทธ" ๋˜๋Š” "ํ–ฅ์ƒ" ๋ ˆ์ด๋ธ”์„ ๋ถ™์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ €๋Š” ๊ทธ๋Œ€๋กœ ๋‘ก๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ๊ธฐ์—ฌ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

์žฅ๊ธฐ๊ฐ„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์ด ๋ฌธ์ œ๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๊ฐ€ ์ตœ์‹  ๋ฆด๋ฆฌ์Šค์— ์—ฌ์ „ํžˆ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ์ตœ์‹  ์ •๋ณด๋กœ ์–ธ์ œ๋“ ์ง€ ๋‹ค์‹œ ์—ฌ์‹ญ์‹œ์˜ค.

์ด ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋Š” ์ž ์žฌ์ ์ธ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ https://github.com/facebook/fresco/commit/fa71901055a38a810c190862c7fd582fd3dad2b3์ž…๋‹ˆ๋‹ค.

๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ธ์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@oprisnik ๋‹ค์‹œ ํ•œ ๋ฒˆ ์•ˆ๋…•ํ•˜์„ธ์š”. ์ด ๋ฌธ์ œ๋ฅผ ์กฐ์‚ฌํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” Gradle๊ณผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ๋Œ€์‹  ์†Œ์Šค์—์„œ ์ง์ ‘ ํ”„๋ ˆ์Šค์ฝ”๋ฅผ ์ปดํŒŒ์ผํ•˜๋„๋ก RN์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•์— ์ต์ˆ™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์„ฑ๊ณตํ•˜์ง€ ๋ชปํ•œ ๋‹จ๊ณ„:

  1. react-native-cli ์‚ฌ์šฉํ•˜์—ฌ RN 0.57 ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ
  2. fresco lib๋ฅผ ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ์— ๋ณต์ œ
  3. fresco lib ๋‚ด๋ถ€์˜ v1.10.0 ๋ถ„๊ธฐ๋กœ ์ฒดํฌ์•„์›ƒ
  4. ์ถ”๊ฐ€ android-ndk-r20 ์— ๊ฒฝ๋กœ๋ฅผ <Project>\android\local.properties ( ndk.dir=G:\\Dev\\Android\\android-ndk-r20 )

๊ทธ๋Ÿฐ ๋‹ค์Œ ์†Œ์Šค์—์„œ ํ”„๋ ˆ์Šค์ฝ”๋กœ RN์„ ์ปดํŒŒ์ผํ•˜๊ณ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์žฌ์ •์˜ํ•˜๋Š” SO https://stackoverflow.com/a/52861379/1889685 ์—์„œ ์ด ๋‹ต๋ณ€์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

cd android
./gradlew assembleDebug --include-build /e/Sandbox/RN057ImageTest/fresco/

ํ•˜์ง€๋งŒ ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

> Task :fresco:imagepipeline:ndk_build_bitmaps FAILED
A problem was found with the configuration of task ':fresco:imagepipeline:ndk_build_bitmaps'. Registering invalid inputs and outputs via TaskInputs and TaskOutputs methods has been deprecated and is scheduled to be removed in Gradle 5.0.
 - File 'E:\Sandbox\RN057ImageTest\fresco\imagepipeline\src\main\jni\bitmaps' specified for property '$1' is not a file.

@sunnylqm ์€ ์ด ํ”„๋กœ์„ธ์Šค์— ๋” ์ต์ˆ™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„์ด ์žˆ๋‹ค๋ฉด ์ด๊ฒƒ์„ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋„์›€์ด ๋œ๋‹ค๋ฉด ์ง€๊ธˆ๊นŒ์ง€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”, ์ตœ๊ทผ์— ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ™œ๋™์ด ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์—ฌ์ „ํžˆ ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๊ด€์‹ฌ์ด ํ•„์š”ํ•œ๊ฐ€์š”? ๋” ์ด์ƒ ํ™œ๋™์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉด ์ด ๋ฌธ์ œ๊ฐ€ ์ข…๋ฃŒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด ๋ฌธ์ œ์— "๋ฒ„๊ทธ" ๋˜๋Š” "ํ–ฅ์ƒ" ๋ ˆ์ด๋ธ”์„ ๋ถ™์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ €๋Š” ๊ทธ๋Œ€๋กœ ๋‘ก๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ๊ธฐ์—ฌ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๋นŒ๋“œ๋ฅผ ์‹œ๋„ํ–ˆ์ง€๋งŒ ndk ์˜ค๋ฅ˜๋„ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋Š” ์•ผ๊ฐ„ ๋นŒ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

v2.0.0์„ ์ˆ˜์ • ์—†์ด ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ํ™•์ธ์„ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์œ„์˜ ์ปค๋ฐ‹์— ์˜ํ•ด ํ™œ์„ฑํ™”๋œ ๋‹ค์šด์ƒ˜ํ”Œ๋ง ์„ ๋น„ํ™œ์„ฑํ™”ํ–ˆ์œผ๋ฉฐ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ ์ด๋ฏธ์ง€ URI:
" https://wagonsclub.oss-cn-beijing.aliyuncs.com/static/carousel/carousel1_bg.jpg "

fragment_drawee_simple.xml

  <com.facebook.drawee.view.SimpleDraweeView
      android:id="@+id/drawee_view"
      android:layout_width="match_parent"
      android:layout_height="1000dp"
      />

์›๋ž˜ v2.0.0 ์‡ผ์ผ€์ด์Šค
image

๋น„ํ™œ์„ฑํ™”๋œ ๋‹ค์šด์ƒ˜ํ”Œ๋ง v2.0.0 ์‡ผ์ผ€์ด์Šค
image

@sunnylqm ๋””๋ฒ„๊น…

MainApplication.java onCreate :

<strong i="10">@Override</strong>
public void onCreate() {
  super.onCreate();

  ImagePipelineConfig config = ImagePipelineConfig.newBuilder(this)
    .setDownsampleEnabled(false)
    .build();

  Fresco.initialize(this, config);

  SoLoader.init(this, /* native exopackage */ false);
}

์ด๊ฒƒ์œผ๋กœ ๋‚˜๋Š” Fresco๊ฐ€ ์ด๋ฏธ ์ดˆ๊ธฐํ™”๋˜์—ˆ๋‹ค๋Š” ๋ฉ”์‹œ์ง€๋ฅผ Logcat์—์„œ ๋ฐ›์Šต๋‹ˆ๋‹ค.

MainReactPackage ๋กœ MainPackageConfig MainReactPackage ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜์—ฌ ์‚ฌ์šฉํ•œ ๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์ด์ง€๋งŒ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

protected List<ReactPackage> getPackages() {
  Context context = getApplicationContext();
  ImagePipelineConfig pipelineConfig = ImagePipelineConfig
    .newBuilder(context.getApplicationContext())
    .setDownsampleEnabled(false)
    .build();
  MainPackageConfig config = new MainPackageConfig.Builder().setFrescoConfig(pipelineConfig).build();

  return new ArrayList<>(Arrays.<ReactPackage>asList(
    new MainReactPackage(config),
    new ReactNativeFirebaseAppPackage(),
    new FastImageViewPackage(),
    new RNGestureHandlerPackage(),
    new ReanimatedPackage(),
    new SvgPackage()
  ));
}

@clytras ๋‚˜๋Š” ๋ชจ๋ฅธ๋‹ค. ์†Œ์Šค ์ฝ”๋“œ์—์„œ ๋น„ํ™œ์„ฑํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•‘ @oprisnik

(๊ฐ€) ๊ธฐ๋ณธ ๊ธฐ๋ณธ ํŒจํ‚ค์ง€์˜ ๊ตฌ์„ฑ ๋ฐ˜์‘์„ ํ†ตํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค๊ฐ€ ์„ค์ •๋ฉ๋‹ˆ๋‹ค https://github.com/facebook/react-native/blob/6c0f73b3223968448bb186b82f06f6819068a21d/ReactAndroid/src/main/java/com/facebook/react/shell/MainPackageConfig.java

RN์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ž˜ ๋ชจ๋ฅด๊ฒ ๊ณ  ์‹œ๋„ํ•œ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค.

@oprisnik ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ์ด ๋ฌธ์ œ๊ฐ€ ์—ฌ์ „ํžˆ RN repo์— ์†ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€ ๋‹ค์šด์ƒ˜ํ”Œ๋ง์€ ์˜์‹ฌํ•  ์—ฌ์ง€ ์—†์ด ๋ฉ”๋ชจ๋ฆฌ ๋น„์šฉ์„ ์ค„์ด๊ณ  ํšจ์œจ์„ฑ์„ ๋†’์ด๋ฉฐ ํฐ ์ด๋ฏธ์ง€๋ฅผ ๋กœ๋“œํ•  ๋•Œ ํฌ๋ž˜์‹œ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ์ตœ์ข… ๊ฐœ๋ฐœ์ž๊ฐ€ ์˜ต์…˜/์†์„ฑ ํ˜•ํƒœ๋กœ ์ด๋ฏธ์ง€ ๋‹ค์šด์ƒ˜ํ”Œ๋ง์„ ์›ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ RN์—์„œ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‚ด ์•ฑ์—์„œ ์ผ๋ถ€ ํ‰๋ฉด๋„๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด ํฐ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž๊ฐ€ ํ‰๋ฉด๋„๋ฅผ ํ™•๋Œ€ํ•  ๋•Œ ๊ณ ํ•ด์ƒ๋„๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ•ญ์ƒ ์žฅ์น˜ ๊ธฐ๋Šฅ์„ ํ™•์ธํ•˜๊ณ  RAM์ด ์ ๊ฑฐ๋‚˜ ์ €ํ•ด์ƒ๋„๊ฐ€ ์žˆ๋Š” ์ €๊ฐ€ํ˜• ์žฅ์น˜์ธ ๊ฒฝ์šฐ ๋” ์ž‘๊ณ  ์ €ํ•ด์ƒ๋„ ์ด๋ฏธ์ง€๋ฅผ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

scale ๋ฐ resize ์žˆ๋Š” <Image/> ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ resizeMethod ์†์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. RN ํ˜„์žฌ๋Š” ํ•ด๋‹น ์†์„ฑ์˜ scale ๊ฐ’์„ ์กด์ค‘ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ด๋ฏธ์ง€ ๋‹ค์šด์ƒ˜ํ”Œ๋ง์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ณ  resize ์„ค์ •ํ•  ๋•Œ๋งŒ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

resizeMethod

์ด๋ฏธ์ง€์˜ ํฌ๊ธฐ๊ฐ€ ์ด๋ฏธ์ง€ ๋ณด๊ธฐ์˜ ํฌ๊ธฐ์™€ ๋‹ค๋ฅผ ๋•Œ ์ด๋ฏธ์ง€์˜ ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ ์ž๋™์ž…๋‹ˆ๋‹ค.

resize : ๋””์ฝ”๋”ฉ๋˜๊ธฐ ์ „์— ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ธ์ฝ”๋”ฉ๋œ ์ด๋ฏธ์ง€๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด ์ž‘์—…์ž…๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€๊ฐ€ ๋ณด๊ธฐ๋ณด๋‹ค ํ›จ์”ฌ ํด ๋•Œ scale ๋Œ€์‹  ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

scale : ์ด๋ฏธ์ง€๊ฐ€ ์ถ•์†Œ ๋˜๋Š” ํ™•๋Œ€๋˜์–ด ๊ทธ๋ ค์ง‘๋‹ˆ๋‹ค. resize ๋น„ํ•ด scale ๋Š” ๋” ๋น ๋ฅด๊ณ (์ผ๋ฐ˜์ ์œผ๋กœ ํ•˜๋“œ์›จ์–ด ๊ฐ€์†) ๋” ๋†’์€ ํ’ˆ์งˆ์˜ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€๊ฐ€ ๋ณด๊ธฐ๋ณด๋‹ค ์ž‘์€ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€๊ฐ€ ๋ณด๊ธฐ๋ณด๋‹ค ์•ฝ๊ฐ„ ํฐ ๊ฒฝ์šฐ์—๋„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@oprisnik @sunnylqm์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์ƒ๊ฐ์„ ์ •๋ง ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

@clytras ๋ง์”€ํ•˜์‹  ๋Œ€๋กœ ํ”„๋ ˆ์Šค์ฝ”์—์„œ ์„ค๋ช…์ด ์—†๋Š” ๋™์ž‘ ๋ณ€๊ฒฝ์ž…๋‹ˆ๋‹ค. (์ œ๊ฐ€ ๋ณด์—ฌ์ฃผ๋Š” ๋ฐ๋ชจ๋Š” fresco repo์˜ ์˜ˆ์ œ ์•ฑ์ž…๋‹ˆ๋‹ค) ๊ทธ๋ž˜์„œ RN๊ณผ ์•„๋ฌด ๊ด€๋ จ์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@sunnylqm ๋ฌผ๋ก  ์„ค๋ช… ์—†์ด ํ”„๋ ˆ์Šค์ฝ”์˜ ๋™์ž‘ ๋ณ€๊ฒฝ์ด์ง€๋งŒ RN์€ ์ด ํ”„๋ ˆ์Šค์ฝ” ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”/๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ์„ ํƒ์„ ์ตœ์ข… ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋งก๊ฒจ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์ด๋Ÿฌํ•œ ๋™์ž‘ ๋ณ€๊ฒฝ์€ iOS์—์„œ๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ด์— ๋Œ€ํ•ด ์กฐ์น˜๋ฅผ ์ทจํ•ด์•ผ ํ•˜๊ณ  ํ”„๋ ˆ์Šค์ฝ” ๊ตฌ์„ฑ์€ ๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ์—์„œ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ์ด ๊ตฌ์„ฑ์„ ์ตœ์ข… RN ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๊ณต๊ฐœํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

BTW ์ตœ์‹  RN 0.61.2๋กœ Fresco 2.0.0(๋งˆ์Šคํ„ฐ ๋ธŒ๋žœ์น˜)์„ ์ปดํŒŒ์ผํ•˜๊ณ  DecodeProducer.java ์—์„œ ๋‹ค์šด์ƒ˜ํ”Œ๋ง ์กฐ๊ฑด ๊ฒ€์‚ฌ๋ฅผ ์ฃผ์„ ์ฒ˜๋ฆฌํ•˜์—ฌ ๋‹ค์šด์ƒ˜ํ”Œ๋ง์„ ๋น„ํ™œ์„ฑํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.

fresco repo ๋””๋ ‰ํ† ๋ฆฌ ์•ˆ์— local.properties ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  Windows 64๋น„ํŠธ์šฉ Android NDK Revision 19c x86_64 ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

ndk.dir=G:\\Dev\\Android\\android-ndk-r19c
org.gradle.daemon=true
org.gradle.parallel=true
org.gradle.configureondemand=true

Fresco ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์ปดํŒŒ์ผ๋˜์—ˆ๊ณ  ๋‹ค์Œ์„ ์‹คํ–‰ํ•˜์—ฌ ๋นŒ๋“œ๋œ RN ์•ฑ์— ๋Œ€ํ•ด ์ด๋ฏธ์ง€ ๋‹ค์šด์ƒ˜ํ”Œ๋ง์ด ๋น„ํ™œ์„ฑํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

cd android
.\gradlew assembleDebug --include-build ..\fresco\

์˜ˆ, ์ด์— ๋Œ€ํ•œ ์†”๋ฃจ์…˜์€ RN ์ดˆ๊ธฐํ™” ๋กœ์ง์„ ํ†ตํ•ด ๋˜๋Š” Fresco๊ฐ€ ์ดˆ๊ธฐํ™”๋  ๋•Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•œ ๋‹ค์šด์ƒ˜ํ”Œ๋ง์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@oprisnik ๊ทธ๋Ÿฌ๋ฉด ์ƒ์„ฑ๋œ Android ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ ํ”„๋ ˆ์Šค์ฝ”๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋” ์ข‹๊ณ  ๊นจ๋—ํ•˜๊ณ  ์‰ฌ์šด ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ œ๊ฐ€ ์‹œ๋„ํ•œ ์–ด๋–ค ๋ฐฉ๋ฒ•์œผ๋กœ๋„ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ํ”„๋กœ์ ํŠธ์—์„œ MainReactPackage ๊ตฌ์„ฑ์„ ์ „๋‹ฌํ•˜์—ฌ getPackages ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ ์ดˆ๊ธฐํ™”ํ•˜๊ธฐ ์œ„ํ•ด com.facebook.imagepipeline.core.ImagePipelineConfig , com.facebook.react.shell.MainReactPackage ๋ฐ com.facebook.react.shell.MainPackageConfig ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ณด์•˜์ง€๋งŒ ๊ทธ๊ฒƒ์€ ๋‚ด๊ฐ€ ์‹œ๋„ํ•œ ์ตœ์‹  RN 0.61์ด๋‚˜ RN 0.57์—์„œ ์ €์—๊ฒŒ ํšจ๊ณผ๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

protected List<ReactPackage> getPackages() {
  Context context = getApplicationContext();

  ImagePipelineConfig pipelineConfig = ImagePipelineConfig
    .newBuilder(context.getApplicationContext())
    .setDownsampleEnabled(false)
    .build();

  MainPackageConfig config = new MainPackageConfig.Builder()
    .setFrescoConfig(pipelineConfig)
    .build();

  return new ArrayList<>(Arrays.<ReactPackage>asList(
    new MainReactPackage(config),
    ...
  ));
}

์•„๋งˆ๋„ ๋‚ด๊ฐ€ ๊ฑฐ๊ธฐ์—์„œ ๋ญ”๊ฐ€ ์ž˜๋ชปํ•˜๊ณ  ์žˆ๊ณ  <project>/android/app/build/generated/rncli/src/main/java/com/facebook/react/ ๋””๋ ‰ํ† ๋ฆฌ ์•ˆ์— PackageList.java ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋Š” ์ƒˆ๋กœ์šด >= 0.60 ์—ฐ๊ฒฐ ์‹œ์Šคํ…œ์—์„œ ํ™•์‹คํžˆ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด MainReactPackage ๊ฐ€ ์ธ์ˆ˜ ์—†์ด ์ „๋‹ฌ๋˜์—ˆ๊ณ  ์ž๋™ ์—ฐ๊ฒฐ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ์ข…๋ฅ˜์˜ ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ๋ณด์ด์ง€ ์•Š์ง€๋งŒ fresco ๊ตฌ์„ฑ์œผ๋กœ MainReactPackage ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ „๋‹ฌํ•˜์—ฌ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

React Native์šฉ์œผ๋กœ ์ƒ์„ฑ๋œ Android ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ ์‚ฌ์šฉ์ž ์ง€์ • ๊ตฌ์„ฑ์œผ๋กœ fresco lib๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋ช…ํ™•ํ•˜๊ณ  ๋ฌธ์„œํ™”๋œ ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

https://frescolib.org/docs/resizing.html ์„ ์ฝ๊ณ  ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ–ˆ๋‹ค๋ฉด downsampling ๋Š” resizing ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ @clytras ๋‹น์‹ ์ด ์˜ณ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ resizeMethod๊ฐ€ scale๋กœ ์„ค์ •๋œ๋‹ค๋ฉด ๋‹ค์šด์ƒ˜ํ”Œ๋ง์ด ํ™œ์„ฑํ™”๋˜์–ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.

RN์˜ ์ฝ”๋“œ๋Š” ๋‚˜์—๊ฒŒ ์˜ฌ๋ฐ”๋ฅธ ๊ฒƒ https://github.com/facebook/react-native/blob/aee88b6843cea63d6aa0b5879ad6ef9da4701846/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageView.java#L505 ( ํฌ๊ธฐ ์กฐ์ •/๋‹ค์šด์ƒ˜ํ”Œ๋ง์ด ์—†์Œ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ด๋ฏธ์ง€ ํŒŒ์ดํ”„๋ผ์ธ์— null ๊ฐ’์„ ์ „๋‹ฌํ•จ)
๊ทธ๋Ÿฌ๋‚˜ ํ”„๋ ˆ์Šค์ฝ”์—์„œ๋Š” null resizeOptions https://github.com/facebook/fresco/blob/v2.0.0/imagepipeline/src/main/java/com/facebook/imagepipeline/producers/DecodeProducer.java#L158 - L169
downsampleEnabled ๋ฐ downsampleEnabledForNetwork ๊ฐ€ ๋ชจ๋‘ true์ด๋ฉด resizeOptions๊ฐ€ null์ธ์ง€ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ๋‹ค์šด์ƒ˜ํ”Œ๋ง๋ฉ๋‹ˆ๋‹ค.
https://github.com/facebook/fresco/blob/master/imagepipeline-base/src/main/java/com/facebook/imagepipeline/transcoder/DownsampleUtil.java#L56
๋”ฐ๋ผ์„œ ๋ฌธ์„œ์™€ ์ฝ”๋“œ๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํŠน์ • ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์šด์ƒ˜ํ”Œ๋งํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ณด๋‹ค ์œ ์—ฐํ•œ ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. (์ด์ œ 2๊ฐœ์˜ ์ „์—ญ ๊ตฌ์„ฑ์œผ๋กœ ์ œ์–ด๋จ) @clytras @oprisnik

์ˆ˜๊ณ ํ•˜์…จ์Šต๋‹ˆ๋‹ค @sunnylqm. ๋‚˜๋Š” <Image/> ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ RN ๊ตฌ์„ฑ์„ ์ฐพ๊ณ  ๋”ฐ๋ฅด๊ธฐ ์‹œ์ž‘ํ•˜์—ฌ ์ด๋Ÿฌํ•œ ๊ฒƒ๋“ค์„ ํ™•์ธํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์ง€๋งŒ ๋‹น์‹ ์€ ๋‚˜๋ฅผ ๋„˜์–ด์„ฐ์Šต๋‹ˆ๋‹ค!

์ด๋Ÿฌํ•œ ๋™์ž‘ ๋ณ€๊ฒฝ์ด ์žˆ์œผ๋ฏ€๋กœ ํ”„๋ ˆ์Šค์ฝ”๋Š” resizeOptions ๊ฐ€ null์ด ์•„๋‹Œ ๊ฒฝ์šฐ์—๋งŒ ๋‹ค์šด์ƒ˜ํ”Œ๋ง์„ ํ™•์ธํ•˜๊ณ  ์ ์šฉํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. resizeMethod ๊ฐ€ resize (๋˜๋Š” auto ๋ฐ ๋กœ์ปฌ ์ด๋ฏธ์ง€์˜ ๊ฒฝ์šฐ)๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ์—๋งŒ ์„ค์ •๋˜๋ฉฐ https://github.com/facebook/react- ์—์„œ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค. shouldResize ํ•จ์ˆ˜ ๋˜๋Š” ์ƒˆ resizeMethod ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ๋‹ค์šด์ƒ˜ํ”Œ๋ง์„ ์œ„ํ•œ ์˜ต์…˜์ž…๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”, ์ตœ๊ทผ์— ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ™œ๋™์ด ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์—ฌ์ „ํžˆ ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๊ด€์‹ฌ์ด ํ•„์š”ํ•œ๊ฐ€์š”? ๋” ์ด์ƒ ํ™œ๋™์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉด ์ด ๋ฌธ์ œ๊ฐ€ ์ข…๋ฃŒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด ๋ฌธ์ œ์— "๋ฒ„๊ทธ" ๋˜๋Š” "ํ–ฅ์ƒ" ๋ ˆ์ด๋ธ”์„ ๋ถ™์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ €๋Š” ๊ทธ๋Œ€๋กœ ๋‘ก๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ๊ธฐ์—ฌ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

@clytras ์†”๋ฃจ์…˜์„ ์•Œ๋ ค์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@club9822 ์ง€๊ธˆ ์†”๋ฃจ์…˜์€ ์—ฌ๊ธฐ์—์„œ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ด๋ฏธ์ง€ ๋‹ค์šด์ƒ˜ํ”Œ๋ง์„ ๋จผ์ € ๋น„ํ™œ์„ฑํ™”ํ•œ ํ›„ ์†Œ์Šค์—์„œ ํ”„๋ ˆ์Šค์ฝ” ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. https://github.com/facebook/fresco/issues/2397#issuecomment -541802753

ํ•ต์‹ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•˜์ง€ ์•Š๊ณ  ์ด์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@CaptainN ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์‰ฌ์šด ํ•ด๊ฒฐ์ฑ…์€ ์—†์Šต๋‹ˆ๋‹ค. ์†Œ์Šค๋ฅผ ์ปดํŒŒ์ผํ•˜๋Š” ๊ณผ์ •์ด ํž˜๋“ค๊ณ  ์ง€๋ฃจํ•ด ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ์•ฝ๊ฐ„์˜ ๋ณ€๊ฒฝ๊ณผ ๋ช…๋ น ์‹คํ–‰์˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ์˜ ๋‚ด ๊ฒŒ์‹œ๋ฌผ์„ ๋”ฐ๋ผ ์–ด๋–ป๊ฒŒ ํ•˜๋Š”์ง€ ์•Œ์•„๋ณด์„ธ์š”.

@clytras new PackageList(this, config) ์˜ ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜์—์„œ config๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ๋กœ ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์—ฌ๊ธฐ ๋กœ์ง์ด https://github.com/facebook/fresco/blob/v2.0.0/imagepipeline/src/main/java/com/facebook/imagepipeline/producers/DecodeProducer.java#L158 ๊ตฌ์„ฑ์„ ๋ฌด์‹œํ–ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. -L169 false
์ด๋ž˜์•ผ ํ•˜๋Š”๊ฑฐ ๋งž์ฃ ?

- if (mDownsampleEnabled || !statusHasFlag(status, Consumer.IS_RESIZING_DONE))
+ if (mDownsampleEnabled && !statusHasFlag(status, Consumer.IS_RESIZING_DONE))

@oprisnik

@sunnylqm ์ €๋Š” ์‚ฌ๋ฌด์‹ค์— ์—†์–ด์„œ ์ง€๊ธˆ ํ™•์ธํ•  ์ˆ˜ ์—†์ง€๋งŒ ์ƒˆ๋กœ์šด _RN >= 60_ ์ž๋™ ๋งํฌ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑ์„ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์ง€ ๋ชปํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•ฉ๋‹ˆ๋‹ค. ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋ฅผ ์œ„ํ•ด ์ด์ „ _RN_ ๋ฒ„์ „์—์„œ๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ฉฐ์น  ํ›„์— ํœด๊ฐ€์—์„œ ๋Œ์•„์˜ฌ ๋•Œ ํ™•์ธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ƒํƒœ๊ฐ€ IS_RESIZING_DONE ํ”Œ๋ž˜๊ทธ๊ฐ€ ์•„๋‹ˆ์–ด์„œ mDownsampleEnabled ์™„์ „ํžˆ ์šฐํšŒํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์šด์ƒ˜ํ”Œ๋ง์ด ํ•ญ์ƒ ์ ์šฉ๋œ๋‹ค๋Š” ๊ฒƒ์ด ๋งค์šฐ ๋ถ„๋ช…ํ•˜๊ธฐ ๋•Œ๋ฌธ์— OR ์—์„œ AND ๋ณ€๊ฒฝ์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋‹ค์šด์ƒ˜ํ”Œ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ์‚ฌ์šฉ์ž ์ง€์ • ํ”„๋ ˆ์Šค์ฝ” ๊ตฌ์„ฑ์ด ์ ์šฉ๋˜์–ด ํ”„๋ ˆ์Šค์ฝ”๋กœ ์ „๋‹ฌ๋˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

@clytras gradle ์‚ฌ์šฉ ์ค‘๋‹จ ๋“ฑ์œผ๋กœ ๋ชจ๋“  ์ข…๋ฅ˜์˜ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์ „ ๋นŒ๋“œ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์˜ฌ๋ฆด ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? (์„ค์น˜ํ•  ์œ„์น˜๋ฅผ ์•Œ๋ ค์ฃผ์„ธ์š”)? ์ •๋ง ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์•„ ์žŠ์–ด๋ฒ„๋ ค. ๋ฌผ์–ด๋ณด๋Š” ๊ฒƒ์กฐ์ฐจ ์‹ค๋ก€์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์•Œ์•„๋‚ผ ๊ฒƒ์ด๊ณ , ์•„๋งˆ๋„ PR์„ ํ•  ๊ฒƒ์ด๋‹ค.

@CaptainN ๋ฌด๋ก€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ๋‚ด๊ฐ€ ๊ทธ๊ฒƒ์„ํ–ˆ๊ณ  ๋ชจ๋“  ์˜ค๋ฅ˜์— ์ง๋ฉดํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— Fresco๋ฅผ ์„ค์น˜ํ•˜๊ณ  ํŒจ์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ง€์นจ์ด ํฌํ•จ๋œ ์Šคํƒ€ํ„ฐ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ํ›จ์”ฌ ์ ์€ ์‹œ๊ฐ„์ด ์†Œ์š”๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ์žˆ์Šต๋‹ˆ๋‹ค: https://github.com/clytras/RN061FrescoBuild

RN 0.61.5 ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—๋Š” ์ž์„ธํ•œ ์ง€์นจ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ฒดํฌ ์•„์›ƒ์„ ํ”„๋ ˆ์Šค์ฝ”์„, ํด๋ก  v2.1.0 ํ•˜๊ณ  ํŒจ์น˜๋ฅผ ์ ์šฉ DecodeProducer.java ๊ทธ๋ž˜์„œ ๋‹ค์šด ์ƒ˜ํ”Œ๋ง ์ฝ”๋“œ๋ฅผ ์ฃผ์„. Android NDK๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  libraries/fresco/local.properties ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ

์ง€์นจ๊ณผ yarn ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋”ฐ๋ฅด๋ฉด ๊ธฐ์กด RN >= 0.60(_๋˜๋Š” ์ด์ „ ๋ฒ„์ „_) ํ”„๋กœ์ ํŠธ์— fresco lib๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@clytras ์ •๋ฆฌ ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ •๋ง ๊ฐ์‚ฌ.

์œ„์˜ ์˜๊ฒฌ ์ด ํ–ฅํ›„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๊ฒƒ์ธ์ง€ ์—ฌ๋ถ€์—

@sunnylqm์ด ์ œ์•ˆํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค.

- if (mDownsampleEnabled || !statusHasFlag(status, Consumer.IS_RESIZING_DONE))
+ if (mDownsampleEnabled && !statusHasFlag(status, Consumer.IS_RESIZING_DONE))

๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋ณ€๊ฒฝ ํ›„์— MainApplication.java ๋‚ด๋ถ€์˜ ๊ตฌ์„ฑ๋งŒ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฏธ์ง€ ๋‹ค์šด์ƒ˜ํ”Œ๋ง์„ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์•„๋ฌด๋„ ํ”„๋ ˆ์Šค์ฝ”๋ฅผ ์ปดํŒŒ์ผํ•  ํ•„์š”๊ฐ€ ์—†๊ณ  ํ”„๋ ˆ์Šค์ฝ” ์„ค์ •๋งŒ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

<strong i="12">@Override</strong>
protected List<ReactPackage> getPackages() {
  Context context = getApplicationContext();

  ImagePipelineConfig frescoConfig = ImagePipelineConfig
    .newBuilder(context)
    .setDownsampleEnabled(false)
    .build();

  MainPackageConfig appConfig = new MainPackageConfig
    .Builder()
    .setFrescoConfig(frescoConfig)
    .build();

  @SuppressWarnings("UnnecessaryLocalVariable")
  List<ReactPackage> packages = new PackageList(this, appConfig).getPackages();
  // Packages that cannot be autolinked yet can be added manually here, for example:
  // packages.add(new MyReactNativePackage());
  return packages;
}

ํ•œ ๋ฒˆ๋งŒ ๋ณ€๊ฒฝํ•˜๋ฉด ์œ„์˜ ๊ตฌ์„ฑ ์ฝ”๋“œ๊ฐ€ ์ž‘๋™ํ•˜๊ณ  ๋‹ค์šด์ƒ˜ํ”Œ๋ง์ด ๋น„ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๊ตฌ์„ฑ ์„ .setDownsampleEnabled(true) ๋ฅผ ์„ค์ •ํ•˜๋ฉด ๋‹ค์šด์ƒ˜ํ”Œ๋ง์ด ์ œ๋Œ€๋กœ ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ๋ฒ„๊ทธ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. @oprisnik. ๋ฌผ๋ก  ๋‚˜์—๊ฒŒ ์ด์ƒ์ ์ธ ๊ฒƒ์€ RN์ด resizeMethod ๋ฅผ ์กด์ค‘ํ•˜๊ณ  ๋™์ ์œผ๋กœ ๋‹ค์šด์ƒ˜ํ”Œ๋ง์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด์ง€๋งŒ ๊ทธ๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘ํ•˜๋‹ค

์‚ฌ์‹ค ๋‚˜๋Š” ๋ถ€๋ถ„์ ์œผ๋กœ ํ‹€๋ ธ๋‹ค. ๊ทธ ๋ณ€๊ฒฝ(_์ด๊ฒƒ์€ ์™„์ „ํžˆ ์˜๋ฏธ๊ฐ€ ์žˆ์Œ)์œผ๋กœ RN์€ ์—ฌ๊ธฐ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ .setDownsampleEnabled(false) ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ReactAndroid/src/main/java/com/facebook/react/modules/fresco/FrescoModule.java#L155 , ๋‹ค์šด์ƒ˜ํ”Œ๋ง์„ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด ์œ„์˜ ์ฝ”๋“œ๋กœ fresco๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  .setDownsampleEnabled(true) ํ•ฉ๋‹ˆ๋‹ค. RN์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค์šด์ƒ˜ํ”Œ๋ง์„ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค!

@clytras @CaptainN ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ž‘์—…์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋‚˜๋Š” Expo๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ทธ๊ฒƒ์„ ๊ฒฝํ—˜ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ๋‚ด ์•ฑ์„ ๊บผ๋‚ด์ง€ ์•Š๊ณ  ์†”๋ฃจ์…˜์„ ์ฐพ๊ธฐ๋ฅผ ์ •๋ง๋กœ ๊ณ ๋Œ€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ CLI: 2.0.1
๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ: 0.61.2

์ž‘์€ ์—…๋ฐ์ดํŠธ. ๋‚˜๋Š” ์˜ค๋žซ๋™์•ˆ ์ด ๋ฌธ์ œ์— ์ง๋ฉดํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ๋Œ€๋ถ€๋ถ„์˜ ์ด๋ฏธ์ง€์— ๋Œ€ํ•ด ๋™์ผํ•œ ์ด๋ฏธ์ง€์˜ 3๊ฐ€์ง€ ๋‹ค๋ฅธ ์ถ•์ฒ™( @1x , @2x , @3x)์„ ์‚ฌ์šฉํ•˜๋„๋ก ์ „ํ™˜ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@enguerranws Expo๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒฝํ—˜์ด ์ „ํ˜€ ์—†์Šต๋‹ˆ๋‹ค. @gorvinsky ๋ฐฉ๊ธˆ RN 0.61.5๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธํ–ˆ๋Š”๋ฐ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ๋ฒˆ๋“ค ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ ์ด ๋ฌธ์ œ์— ์ง๋ฉดํ–ˆ์„ ๋•Œ ํ…Œ์ŠคํŠธํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

RN 0.61.5 ํ”„๋กœ์ ํŠธ์™€ ์†Œ์Šค์—์„œ Fresco๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์ด ์žˆ๋Š” react-native-community/cli ํ…œํ”Œ๋ฆฟ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์‚ฌ์šฉ์ž ์ •์˜ ํ”„๋กœ์ ํŠธ ์ด๋ฆ„๊ณผ ์†Œ์Šค์—์„œ Fresco๋ฅผ ์ปดํŒŒ์ผํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์œผ๋กœ ์ œ์ž‘๋œ ์ƒˆ RN ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ์‰ฝ๊ณ  ๋น ๋ฅธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ Android NDK Revision 21์„ ์‚ฌ์šฉํ•˜๋ฉฐ yarn 1.21 ์‚ฌ์šฉํ•˜์—ฌ macOS ๋ฐ Windows์—์„œ ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค.

Github ์ €์žฅ์†Œ: clytras/react-native-fresco
NPM ํ…œํ”Œ๋ฆฟ: @lytrax/react-native-fresco

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

npx @react-native-community/cli<strong i="17">@next</strong> init --template=@lytrax/react-native-fresco <ProjectName>

README ์— ์ž์„ธํ•œ ์„ค์น˜ ์ง€์นจ์ด ์žˆ์Šต๋‹ˆ๋‹ค. yarn fresco-setup ์‚ฌ์šฉํ•˜์—ฌ Fresco๋ฅผ ๋ณต์ œ/ํŒจ์น˜ํ•œ ๋‹ค์Œ Android NDK๋ฅผ ์„ค์น˜ํ•˜๊ณ  Android NDK ๊ฒฝ๋กœ๋กœ android/libraries/fresco/local.properties ๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ์ปค๋ฐ‹์ด react-native์—์„œ ์ˆ˜์ •๋˜๋‚˜์š”? (์ง€๊ธˆ์€ ์ถœ์‹œ๋˜์ง€ ์•Š์Œ)

https://github.com/facebook/react-native/commit/f535c8b4bb4474ffe0a0765270cbca8d839deca8

์„ค๋ช…์—๋Š” "setDownsampleEnabled" ์†์„ฑ์ด ์žˆ๋Š” PipelineConfig๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค.

https://frescolib.org/docs/configure-image-pipeline.html

@enguerranws Expo๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒฝํ—˜์ด ์ „ํ˜€ ์—†์Šต๋‹ˆ๋‹ค. @gorvinsky ๋ฐฉ๊ธˆ RN 0.61.5๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธํ–ˆ๋Š”๋ฐ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ๋ฒˆ๋“ค ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ ์ด ๋ฌธ์ œ์— ์ง๋ฉดํ–ˆ์„ ๋•Œ ํ…Œ์ŠคํŠธํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

RN 0.61.5 ํ”„๋กœ์ ํŠธ์™€ ์†Œ์Šค์—์„œ Fresco๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์ด ์žˆ๋Š” react-native-community/cli ํ…œํ”Œ๋ฆฟ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์‚ฌ์šฉ์ž ์ •์˜ ํ”„๋กœ์ ํŠธ ์ด๋ฆ„๊ณผ ์†Œ์Šค์—์„œ Fresco๋ฅผ ์ปดํŒŒ์ผํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์œผ๋กœ ์ œ์ž‘๋œ ์ƒˆ RN ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ์‰ฝ๊ณ  ๋น ๋ฅธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ Android NDK Revision 21์„ ์‚ฌ์šฉํ•˜๋ฉฐ yarn 1.21 ์‚ฌ์šฉํ•˜์—ฌ macOS ๋ฐ Windows์—์„œ ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค.

Github ์ €์žฅ์†Œ: clytras/react-native-fresco
NPM ํ…œํ”Œ๋ฆฟ: @lytrax/react-native-fresco

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

npx @react-native-community/cli<strong i="18">@next</strong> init --template=@lytrax/react-native-fresco <ProjectName>

README ์— ์ž์„ธํ•œ ์„ค์น˜ ์ง€์นจ์ด ์žˆ์Šต๋‹ˆ๋‹ค. yarn fresco-setup ์‚ฌ์šฉํ•˜์—ฌ Fresco๋ฅผ ๋ณต์ œ/ํŒจ์น˜ํ•œ ๋‹ค์Œ Android NDK๋ฅผ ์„ค์น˜ํ•˜๊ณ  Android NDK ๊ฒฝ๋กœ๋กœ android/libraries/fresco/local.properties ๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ์กด ํ”„๋กœ์ ํŠธ์— ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@kalmahik
์ด ๋ฐฉ๋ฒ•์„ ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค. (๋‚ด RN์€ v0.61.4์ž…๋‹ˆ๋‹ค)
๊ธฐ์กด ํ”„๋กœ์ ํŠธ์— @clytras ' ํŒจ์น˜๋ฅผ ์ ์šฉํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋” ์ด์ƒ ์•ˆ๋“œ๋กœ์ด๋“œ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ•ญ์ƒ ์‹ค์ œ ์žฅ์น˜์—์„œ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜ข

  1. package.json์— ์Šคํฌ๋ฆฝํŠธ ์ถ”๊ฐ€
"fresco-clone": "git clone https://github.com/facebook/fresco.git android/libraries/fresco && cd android/libraries/fresco && git checkout tags/v2.1.0",
"fresco-patch": "yarn file-patch ./patches/DecodeProducer.java.diff android/libraries/fresco/imagepipeline/src/main/java/com/facebook/imagepipeline/producers/DecodeProducer.java",
"fresco-setup": "yarn fresco-clone && yarn fresco-patch"
  1. ํŒจ์น˜/DecodeProducer.java.diff ๋งŒ๋“ค๊ธฐ

'์›์‚ฌ ํ”„๋ ˆ์Šค์ฝ” ํŒจ์น˜'

๊ฒฐ๊ณผ

@@ -7279,32 +7279,35 @@

+// 
 if (mDownsampleE
@@ -7381,24 +7381,27 @@

+// 
   ImageReque
@@ -7460,24 +7460,27 @@

+// 
   if (mDowns
@@ -7513,24 +7513,27 @@

+ //
        %7C%7C !U
@@ -7587,36 +7587,39 @@

+//

+ 
 encodedImage.set
@@ -7637,32 +7637,35 @@
 %0A               
+ //
          Downsam
@@ -7700,32 +7700,35 @@
 %0A               
+ //
              req
@@ -7762,32 +7762,35 @@

+// 
             requ
@@ -7820,32 +7820,35 @@
 %0A               
+ //
              enc
@@ -7866,32 +7866,35 @@

+// 
             maxB
@@ -7914,32 +7914,35 @@

+// 
   %7D%0A            
@@ -7937,32 +7937,35 @@

+// 
 %7D%0A%0A             
@@ -7962,24 +7962,27 @@

+ //
  if (produce
@@ -8002,28 +8002,31 @@

+//

+ 
 .getImagePip
@@ -8050,24 +8050,27 @@

+ //
      .getExp
@@ -8091,24 +8091,27 @@

+ //
      .should
@@ -8151,24 +8151,27 @@

+// 
   maybeIncre
@@ -8206,32 +8206,35 @@
 %0A               
+ //
  %7D%0A%0A            
  1. android/settings.gradle ์ˆ˜์ •

includeBuild ('libraries/fresco') ์•ž์— include ':app'

rootProject.name = 'YOURPROJECT'
...
includeBuild ('libraries/fresco') 

include ':app'

  1. ์•ˆ๋“œ๋กœ์ด๋“œ/๋นŒ๋“œ.gradle

Gradle ์ข…์†์„ฑ ์‚ฌ์šฉ์€ 3.4.1์ž…๋‹ˆ๋‹ค.

dependencies {
  ...
  classpath("com.android.tools.build:gradle:3.4.1")
  ...
}
  1. ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰

yarn fresco-setup

  1. ์•ˆ๋“œ๋กœ์ด๋“œ ndk ๋‹ค์šด๋กœ๋“œ

๋‚˜๋Š” r21 ๋ฒ„์ „์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

https://developer.android.com/ndk/downloads

  1. ndk์˜ ์••์ถ•์„ ํ’€๊ณ  ์ด๋™

NDK ์••์ถ• ํ’€๊ธฐ
ndk์˜ ์••์ถ•์„ Users/YOURNAME/Library/Android/android-ndk-r21 ํ’€์—ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ํ”„๋กœ์ ํŠธ์— android/libraries/fresco/local.properties ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

ndk.dir=/Users/YOURNAME/Library/Android/android-ndk-r21
org.gradle.daemon=true
org.gradle.parallel=true
org.gradle.configureondemand=true
  1. ์•ˆ๋“œ๋กœ์ด๋“œ ์‹คํ–‰

๊ทธ๊ฒŒ ๋‹ค์•ผ.

yarn android ํฐ ์ด๋ฏธ์ง€ ํ’ˆ์งˆ์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

@clytras ๋•๋ถ„์—

https://github.com/clytras/react-native-fresco

@JeffGuKang
file-patch ๋ช…๋ น์ด ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ด๊ฒƒ์ด ๋ณ‘ํ•ฉ๋˜๋Š” ๊ฒƒ์„ ๋ง‰๋Š” ๊ฒƒ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋‹จ์ˆœํžˆ ์ˆ˜์ •ํ•˜๋Š” ๋Œ€์‹  ์ด๋Ÿฌํ•œ ํŒจ์น˜๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

@kalmahik file-patch ๋Š” NPM ํŒจํ‚ค์ง€ CLI ํŒจ์น˜ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

@JeffGuKang ํ…œํ”Œ๋ฆฟ ์„ค์ • ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ package.json ์— ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@CaptainN ์œ„์˜ ์ปค๋ฐ‹์„ ์•„์ง ํ…Œ์ŠคํŠธํ•  ์‹œ๊ฐ„์ด ์—†์—ˆ์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ๊ฐ„๋‹จํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ์˜ค @clytras ํ•˜๋‚˜ ? ๊ณ ๋งˆ์›Œ)

@kalmahik
์ด ๋ฐฉ๋ฒ•์„ ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค. (๋‚ด RN์€ v0.61.4์ž…๋‹ˆ๋‹ค)
๊ธฐ์กด ํ”„๋กœ์ ํŠธ์— @clytras ' ํŒจ์น˜๋ฅผ ์ ์šฉํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋” ์ด์ƒ ์•ˆ๋“œ๋กœ์ด๋“œ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ•ญ์ƒ ์‹ค์ œ ์žฅ์น˜์—์„œ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜ข

  1. package.json์— ์Šคํฌ๋ฆฝํŠธ ์ถ”๊ฐ€
"fresco-clone": "git clone https://github.com/facebook/fresco.git android/libraries/fresco && cd android/libraries/fresco && git checkout tags/v2.1.0",
"fresco-patch": "yarn file-patch ./patches/DecodeProducer.java.diff android/libraries/fresco/imagepipeline/src/main/java/com/facebook/imagepipeline/producers/DecodeProducer.java",
"fresco-setup": "yarn fresco-clone && yarn fresco-patch"
  1. ํŒจ์น˜/DecodeProducer.java.diff ๋งŒ๋“ค๊ธฐ

'์›์‚ฌ ํ”„๋ ˆ์Šค์ฝ” ํŒจ์น˜'

๊ฒฐ๊ณผ

@@ -7279,32 +7279,35 @@

+// 
 if (mDownsampleE
@@ -7381,24 +7381,27 @@

+// 
   ImageReque
@@ -7460,24 +7460,27 @@

+// 
   if (mDowns
@@ -7513,24 +7513,27 @@

+ //
        %7C%7C !U
@@ -7587,36 +7587,39 @@

+//

+ 
 encodedImage.set
@@ -7637,32 +7637,35 @@
 %0A               
+ //
          Downsam
@@ -7700,32 +7700,35 @@
 %0A               
+ //
              req
@@ -7762,32 +7762,35 @@

+// 
             requ
@@ -7820,32 +7820,35 @@
 %0A               
+ //
              enc
@@ -7866,32 +7866,35 @@

+// 
             maxB
@@ -7914,32 +7914,35 @@

+// 
   %7D%0A            
@@ -7937,32 +7937,35 @@

+// 
 %7D%0A%0A             
@@ -7962,24 +7962,27 @@

+ //
  if (produce
@@ -8002,28 +8002,31 @@

+//

+ 
 .getImagePip
@@ -8050,24 +8050,27 @@

+ //
      .getExp
@@ -8091,24 +8091,27 @@

+ //
      .should
@@ -8151,24 +8151,27 @@

+// 
   maybeIncre
@@ -8206,32 +8206,35 @@
 %0A               
+ //
  %7D%0A%0A            
  1. android/settings.gradle ์ˆ˜์ •

includeBuild ('libraries/fresco') ์•ž์— include ':app'

rootProject.name = 'YOURPROJECT'
...
includeBuild ('libraries/fresco') 

include ':app'
  1. ์•ˆ๋“œ๋กœ์ด๋“œ/๋นŒ๋“œ.gradle

Gradle ์ข…์†์„ฑ ์‚ฌ์šฉ์€ 3.4.1์ž…๋‹ˆ๋‹ค.

dependencies {
  ...
  classpath("com.android.tools.build:gradle:3.4.1")
  ...
}
  1. ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰

yarn fresco-setup

  1. ์•ˆ๋“œ๋กœ์ด๋“œ ndk ๋‹ค์šด๋กœ๋“œ

๋‚˜๋Š” r21 ๋ฒ„์ „์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

https://developer.android.com/ndk/downloads

  1. ndk์˜ ์••์ถ•์„ ํ’€๊ณ  ์ด๋™

NDK ์••์ถ• ํ’€๊ธฐ
ndk์˜ ์••์ถ•์„ Users/YOURNAME/Library/Android/android-ndk-r21 ํ’€์—ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ํ”„๋กœ์ ํŠธ์— android/libraries/fresco/local.properties ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

ndk.dir=/Users/YOURNAME/Library/Android/android-ndk-r21
org.gradle.daemon=true
org.gradle.parallel=true
org.gradle.configureondemand=true
  1. ์•ˆ๋“œ๋กœ์ด๋“œ ์‹คํ–‰

๊ทธ๊ฒŒ ๋‹ค์•ผ.

yarn android ํฐ ์ด๋ฏธ์ง€ ํ’ˆ์งˆ์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

@clytras ๋•๋ถ„์—

https://github.com/clytras/react-native-fresco

@clytras ์Šคํฌ๋ฆฝํŠธ์— ๋”ฐ๋ผ ์†Œ์Šค์—์„œ Fresco๋ฅผ ์ปดํŒŒ์ผํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์ด ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด RN(v0.59.9) ํ”„๋กœ์ ํŠธ๋กœ ์ปดํŒŒ์ผ ์ค‘์ž…๋‹ˆ๋‹ค.

Screen Shot 2020-05-31 at 1 11 34 PM

๋˜ํ•œ MainApplication.java์— Fresco Config๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ์šด์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

@ravali121 ์ด ๋‹จ๊ณ„๋Š” RN 0.59 ๋˜๋Š” ์ด์ „ ๋ฒ„์ „์ด ์•„๋‹Œ RN >= 0.60.x์šฉ์ž…๋‹ˆ๋‹ค. ์ด์ „ RN ๋ฒ„์ „์— ๋Œ€ํ•ด ํŒจ์น˜ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋‹จ๊ณ„ ๋ฐ Fresco ์ฒดํฌ์•„์›ƒ์€ ํŠน์ • RN ๋ฒ„์ „๊ณผ ํ•จ๊ป˜ ์ œ๊ณต๋˜๋Š” ๋ฒ„์ „์„ ๋”ฐ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค. RN 0.61์šฉ Fresco 2.1.0๊ณผ RN 0.59๋Š” ๋‹ค๋ฅธ ๋ฒ„์ „์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ๋ฌผ๋ก  ํŒจ์น˜๊ฐ€ ํ•„์š”ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ DecodeProducer.java ๋ฅผ ํŽธ์ง‘ํ•˜์—ฌ ์ˆ˜๋™์œผ๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ข…์†์„ฑ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์ถ”๊ฐ€ gradle ๊ตฌ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

0.59์—์„œ ์ž‘๋™ํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€๋งŒ ํ”„๋กœ์ ํŠธ๋ฅผ ์ตœ์†Œ 0.61(๋˜๋Š” ๋” ๋‚˜์€ 0.62)๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์‹ญ๋‹ˆ๊นŒ! ํŒจ์น˜๊ฐ€ ๋ณ‘ํ•ฉ๋  ETA์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? (๋ฉ‹์ง„ ์ž‘์—…์— ๋Œ€ํ•ด @clytras ์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ํŒจ์น˜๋ฅผ ์‹œ๋„ํ•ด์•ผ ํ•˜์ง€๋งŒ ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ ์ง€ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.)

@FRizzonelli ํŒจ์น˜๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด๋ฉฐ ์‹ค์ œ๋กœ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์ด ์•„๋‹ˆ๋ฏ€๋กœ ์ด ๋ฌธ์ œ๊ฐ€ ์˜ค๋žซ๋™์•ˆ ์—ด๋ ค ์žˆ์Šต๋‹ˆ๋‹ค.
ํŒจ์น˜์™€ @react-native-community/cli ํ…œํ”Œ๋ฆฟ์„ ํ™•์ธํ•˜๊ณ  ์ตœ์‹  RN ๋ฒ„์ „์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@clytras ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค:( ๋ฌธ์ œ๋Š” ์ง€๊ธˆ Expo์—์„œ react-native-web์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์€ POC๋ฅผ ์„ค์ •ํ•˜๋ ค๊ณ  ํ•˜๋Š”๋ฐ Android์— ์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ž‘์€ ๋ฐ๋ชจ์—์„œ๋Š” ๊บผ๋‚ด์ง€ ์•Š๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‚˜๋Š” ๋‚ด๊ฐ€ํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค :(

@clytras ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค:( ๋ฌธ์ œ๋Š” ์ง€๊ธˆ Expo์—์„œ react-native-web์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์€ POC๋ฅผ ์„ค์ •ํ•˜๋ ค๊ณ  ํ•˜๋Š”๋ฐ Android์— ์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ž‘์€ ๋ฐ๋ชจ์—์„œ๋Š” ๊บผ๋‚ด์ง€ ์•Š๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‚˜๋Š” ๋‚ด๊ฐ€ํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค :(

png ๋Œ€์‹  jpg ํ˜•์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์‹ ํ•˜์ง€ ๋ชปํ•œ๋‹ค.

@clytras ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค:( ๋ฌธ์ œ๋Š” ์ง€๊ธˆ Expo์—์„œ react-native-web์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์€ POC๋ฅผ ์„ค์ •ํ•˜๋ ค๊ณ  ํ•˜๋Š”๋ฐ Android์— ์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ž‘์€ ๋ฐ๋ชจ์—์„œ๋Š” ๊บผ๋‚ด์ง€ ์•Š๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‚˜๋Š” ๋‚ด๊ฐ€ํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค :(

png ๋Œ€์‹  jpg ํ˜•์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์‹ ํ•˜์ง€ ๋ชปํ•œ๋‹ค.

๋ถˆํ–‰ํžˆ๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์•ŒํŒŒ ๋ ˆ์ด์–ด์— png๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค :(

RN 0.63.4์™€ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
960 x 13983์˜ ์ด๋ฏธ์ง€ ์‚ฌ์ด์ฆˆ๋Š” ๋‹ค์šด์ƒ˜ํ”Œ๋ง์„ ๋งŽ์ด ํ•ด์„œ ์ด๋ฏธ์ง€์˜ ๊ธ€์ž๊ฐ€ ์ž˜ ์ฝํžˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
680 X 2538์˜ ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋„ ๋‹ค์šด ์ƒ˜ํ”Œ๋ง๋˜์—ˆ์ง€๋งŒ ๊ฝค ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.
Image.getSize๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฏธ์ง€์˜ ํฌ๊ธฐ๋ฅผ ์ฐพ๊ณ  ๋†’์ด๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค(๋„ˆ๋น„ 100%).
์ด๋ฏธ์ง€๋Š” ๋ชจ๋‘ jpg์ž…๋‹ˆ๋‹ค.
๋‚˜๋Š” Gradle์„ 3.5.4, NDK 21.4.7075529์™€ @clytras์˜ ๋ฐฉ๋ฒ•์„ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ, ๊ฐ™์€ ๋ฌธ์ œ.

        <Image
          style={{ width: SCREEN_WIDTH, height }}
          resizeMode="contain"
          source={{ uri }}
          resizeMethod="scale"
        />

FastImage๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

 <FastImage
          style={{ width: SCREEN_WIDTH, height: height }}
          source={{
            uri: uri,
            priority: FastImage.priority.normal,
          }}
          resizeMode={FastImage.resizeMode.center}
 />

@JJMoon ์Šคํƒ€์ผ์—์„œ ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ FastImage๋ฅผ ๊ฐ•์ œ๋กœ ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?
์ด๋ฏธ์ง€๋Š” ํ•ญ์ƒ ๋‹ค์‹œ ๋ Œ๋”๋ง๋˜์ง€๋งŒ FastImage๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•จ๊ป˜ ์•ˆ๋…•,

์ด ์Šค๋ ˆ๋“œ์—์„œ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์†”๋ฃจ์…˜์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ RN 0.64.2 ๋ฐ Fresco 2.5.0์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
NDK v22.1.7171670 ๋ฐ gradle 4.2.1์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค(android-emulator์™€ ๊ด€๋ จ๋œ ๋ฌธ์ œ์ž…๋‹ˆ๊นŒ?).

E/AndroidRuntime: FATAL EXCEPTION: mqt_native_modules
    Process: com.veerle.wiener.debug, PID: 10813
    java.lang.NoSuchMethodError: No static method initialize(Lcom/facebook/imagepipeline/core/ImagePipelineConfig;)V in class Lcom/facebook/imagepipeline/core/ImagePipelineFactory; or its super classes (declaration of 'com.facebook.imagepipeline.core.ImagePipelineFactory' appears in /data/app/<project>/base.apk!classes16.dex)
        at com.facebook.drawee.backends.pipeline.Fresco.initialize(Fresco.java:83)
        at com.facebook.drawee.backends.pipeline.Fresco.initialize(Fresco.java:45)
        at com.facebook.react.modules.fresco.FrescoModule.initialize(FrescoModule.java:114)
        at com.facebook.react.bridge.ModuleHolder.doInitialize(ModuleHolder.java:236)
        at com.facebook.react.bridge.ModuleHolder.markInitializable(ModuleHolder.java:100)
        at com.facebook.react.bridge.NativeModuleRegistry.notifyJSInstanceInitialized(NativeModuleRegistry.java:103)
        at com.facebook.react.bridge.CatalystInstanceImpl$2.run(CatalystInstanceImpl.java:438)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage(MessageQueueThreadHandler.java:27)
        at android.os.Looper.loop(Looper.java:223)
        at com.facebook.react.bridge.queue.MessageQueueThreadImpl$4.run(MessageQueueThreadImpl.java:226)
        at java.lang.Thread.run(Thread.java:923)
I/Process: Sending signal. PID: 10813 SIG: 9

@JJMoon ์€ ๋กœ์ปฌ ์ด๋ฏธ์ง€์™€ ํ•จ๊ป˜

ํŒ€์—์„œ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋™์•ˆ Image์™€ FastImage๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
if(height < blurSize){ return <Image/> }else{ return <FastImage/> }

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰