Fresco: App Bundle์„ ํ†ตํ•ด ๋นŒ๋“œํ•  ๋•Œ Fresco๋Š” "libimagepipeline.so"๋ฅผ ์ฐพ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2018๋…„ 12์›” 07์ผ  ยท  21์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: facebook/fresco

์„ค๋ช…

Android App Bundle์„ ํ†ตํ•ด ์ƒ์„ฑ๋œ Fresco๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ™œ๋™์„ ์‹œ์ž‘ํ•  ๋•Œ "libimagepipeline.so"๋ฅผ ์ฐพ์ง€ ๋ชปํ•˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค.

์ƒ์‹

  1. Fresco๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ƒ˜ํ”Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋งŒ๋“ค๊ธฐ
  2. ์„œ๋ช…๋œ ๋ฒˆ๋“ค ์ƒ์„ฑ
  3. ๋ฒˆ๋“ค ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ
  4. ๋ฒˆ๋“ค ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๊ธฐ์— APK๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
  5. Fresco๊ฐ€ ์ดˆ๊ธฐํ™”๋˜๋Š” ํ™œ๋™์œผ๋กœ ์ด๋™
  6. ์ถฉ๋Œ ๊ด€์ฐฐ

ํ•ด๊ฒฐ์ฑ…

๋‚˜๋Š” ์›๋ž˜ ์ด๊ฒƒ์ด minify, R8 ๋˜๋Š” Proguard์˜ ๋ฌธ์ œ์ผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ, ๊ทธ๊ฒƒ๋“ค์„ ๋ชจ๋‘ ๋น„ํ™œ์„ฑํ™”ํ–ˆ๊ณ  App Bundle์„ ํ†ตํ•ด ๋นŒ๋“œํ•  ๋•Œ ์—ฌ์ „ํžˆ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๊ด€์ฐฐํ–ˆ์Šต๋‹ˆ๋‹ค.

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

๋‚ด๊ฐ€ ์ฐพ์€ ์ž„์‹œ์ ์ด์ง€๋งŒ ์ด์ƒ์ ์ด์ง€ ์•Š์€ ์†”๋ฃจ์…˜์€ ๋‹ค์Œ ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ abi ๋กœ APK ๋ถ„ํ• ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ์ด์ง€๋งŒ ๋ชจ๋“  ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ํฌํ•จํ•˜๋ฉด APK ํฌ๊ธฐ๊ฐ€ ํ›จ์”ฌ ์ปค์ง‘๋‹ˆ๋‹ค.

android {
    // Rest of your configuration here

    bundle {
        abi {
            enableSplit false
        }
    }
}

์ถ”๊ฐ€ ์ •๋ณด

  • ํ”„๋ ˆ์Šค์ฝ” ๋ฒ„์ „: 1.10.0
  • ํ”Œ๋žซํผ ๋ฒ„์ „: Samsung SM-G955F, Android 8.0.0
bug help wanted

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

Fresco์—์„œ ์‚ฌ์šฉํ•˜๋Š” SoLoader lib์—์„œ ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜์ •์œผ๋กœ PR์„ ์ค€๋น„ํ–ˆ์Šต๋‹ˆ๋‹ค: facebook/soloader#26
์ด ์ˆ˜์ •์œผ๋กœ fresco๋Š” App Bundle์—์„œ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
ํŒจ์น˜๋œ ๋ฒ„์ „์˜ SoLoader lib๋ฅผ ๊ฒŒ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. PR์ด ๋ณ‘ํ•ฉ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์—†๋‹ค๋ฉด ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

repositories {
    maven {
        url  "https://dl.bintray.com/nnesterov/maven" 
    }
}

compile('com.facebook.fresco:fresco:1.10.0') {
    exclude group: 'com.facebook.soloader', module: 'soloader'
}
compile("com.avito.android:patched-soloader:0.1.0")

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

์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๊นŒ? #2049

๋„ค, ๋Œ€์ถฉ. ๊ทธ๋Ÿฌ๋‚˜ ์ด ๋ฌธ์ œ๋Š” ๊ด€๋ จ์ด ์žˆ๋Š” ๋™์•ˆ
Fresco ๋˜๋Š” SoLoader์—์„œ Android App Bundle์— ๋Œ€ํ•œ ์ง€์› ๋ถ€์กฑ ๋ฐ
๊ทธ๋Ÿฐ ์‹์œผ๋กœ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๋ถ„ํ• ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์‹ค์ˆ˜ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด ๋ฌธ์ œ๋Š” ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ๊ธฐ๊ธฐ์—์„œ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ…Œ์ŠคํŠธ๋ฅผ ๊ฑฐ์นœ ๋ธŒ๋žœ๋“œ๋งŒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  Fresco ๋ฐฐ์†ก ๊ฐ€์ด๋“œ์— ๋”ฐ๋ผ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•œ ๋ฉ”๋ชจ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
Android App Bundle์„ ํ†ตํ•ด ๋ฐฐ์†ก๋˜๋ฉฐ splits ํ‚ค๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
bundle ํ•˜๋ฉด splits ํ‚ค๊ฐ€ ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค.

2018๋…„ 12์›” 11์ผ ํ™”, 06:40 KimiChiu, [email protected] ์ž‘์„ฑ:

์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๊นŒ? #2049
https://github.com/facebook/fresco/issues/2049

โ€”
์Šค๋ ˆ๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/facebook/fresco/issues/2253#issuecomment-446089907 ,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/ABUQnQ4cZ-sWkG5b72Ea81wiQjS02yjlks5u31NxgaJpZM4ZIsuf
.

์•ˆ๋…•ํ•˜์„ธ์š” @icerfish ์ž…๋‹ˆ๋‹ค .

ํ•„์š”ํ•œ ๋ชจ๋“  ์„ธ๋ถ€์ •๋ณด์™€ ํ•จ๊ป˜ ์ด ๋ฌธ์ œ๋ฅผ ์ œ์ถœํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค(์‹œ๊ฐ„์ด ์žˆ์œผ๋ฉด ์˜ค๋ฅ˜๋ฅผ ๋ถ™์—ฌ๋„ฃ์„ ์ˆ˜ ์žˆ์Œ). Fresco๊ฐ€ ์•ฑ ๋ฒˆ๋“ค์„ ์™„์ „ํžˆ ์ง€์›ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ƒํ˜ธ ์ž‘์šฉ์„ ํ…Œ์ŠคํŠธํ•œ ์ ์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ์˜คํ”ˆ ์†Œ์Šค ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ์šฐ๋ฆฌ๋ฅผ ๋„์šธ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ผ๋ฉฐ ์ด๊ฒƒ์„ "๋ฒ„๊ทธ" ๋ฐ "๋„์›€์ด ํ•„์š”ํ•œ" ๊ฒƒ์œผ๋กœ ํ‘œ์‹œํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” @lambdapioneer ์ž…๋‹ˆ๋‹ค .

๋‹ค์Œ์€ ์Šคํƒ ์ถ”์ ์ž…๋‹ˆ๋‹ค.

FATAL EXCEPTION: FrescoIoBoundExecutor-8 Process: com.gobuzzvault.android, PID: 17499 java.lang.NoClassDefFoundError: com.facebook.imagepipeline.memory.NativeMemoryChunk at com.facebook.imagepipeline.memory.NativeMemoryChunkPool.alloc(NativeMemoryChunkPool.java:25) at com.facebook.imagepipeline.memory.NativeMemoryChunkPool.alloc(NativeMemoryChunkPool.java:13) at com.facebook.imagepipeline.memory.BasePool.get(BasePool.java:267) at com.facebook.imagepipeline.memory.MemoryPooledByteBufferOutputStream.<init>(MemoryPooledByteBufferOutputStream.java:51) at com.facebook.imagepipeline.memory.MemoryPooledByteBufferFactory.newByteBuffer(MemoryPooledByteBufferFactory.java:73) at com.facebook.imagepipeline.memory.MemoryPooledByteBufferFactory.newByteBuffer(MemoryPooledByteBufferFactory.java:24) at com.facebook.imagepipeline.producers.LocalFetchProducer.getByteBufferBackedEncodedImage(LocalFetchProducer.java:87) at com.facebook.imagepipeline.producers.LocalFetchProducer.getEncodedImage(LocalFetchProducer.java:99) at com.facebook.imagepipeline.producers.LocalContentUriFetchProducer.getCameraImage(LocalContentUriFetchProducer.java:100) at com.facebook.imagepipeline.producers.LocalContentUriFetchProducer.getEncodedImage(LocalContentUriFetchProducer.java:76) at com.facebook.imagepipeline.producers.LocalFetchProducer$1.getResult(LocalFetchProducer.java:52) at com.facebook.imagepipeline.producers.LocalFetchProducer$1.getResult(LocalFetchProducer.java:48) at com.facebook.common.executors.StatefulRunnable.run(StatefulRunnable.java:43) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) at com.facebook.imagepipeline.core.PriorityThreadFactory$1.run(PriorityThreadFactory.java:51) at java.lang.Thread.run(Thread.java:764) Caused by: java.lang.UnsatisfiedLinkError: couldn't find DSO to load: libimagepipeline.so at com.facebook.soloader.SoLoader.doLoadLibraryBySoName(SoLoader.java:703) at com.facebook.soloader.SoLoader.loadLibraryBySoName(SoLoader.java:564) at com.facebook.soloader.SoLoader.loadLibrary(SoLoader.java:500) at com.facebook.soloader.SoLoader.loadLibrary(SoLoader.java:455) at com.facebook.imagepipeline.nativecode.ImagePipelineNativeLoader.load(ImagePipelineNativeLoader.java:40) at com.facebook.imagepipeline.memory.NativeMemoryChunk.<clinit>(NativeMemoryChunk.java:31) at com.facebook.imagepipeline.memory.NativeMemoryChunkPool.alloc(NativeMemoryChunkPool.java:25) at com.facebook.imagepipeline.memory.NativeMemoryChunkPool.alloc(NativeMemoryChunkPool.java:13) at com.facebook.imagepipeline.memory.BasePool.get(BasePool.java:267) at com.facebook.imagepipeline.memory.MemoryPooledByteBufferOutputStream.<init>(MemoryPooledByteBufferOutputStream.java:51) at com.facebook.imagepipeline.memory.MemoryPooledByteBufferFactory.newByteBuffer(MemoryPooledByteBufferFactory.java:73) at com.facebook.imagepipeline.memory.MemoryPooledByteBufferFactory.newByteBuffer(MemoryPooledByteBufferFactory.java:24) at com.facebook.imagepipeline.producers.LocalFetchProducer.getByteBufferBackedEncodedImage(LocalFetchProducer.java:87) at com.facebook.imagepipeline.producers.LocalFetchProducer.getEncodedImage(LocalFetchProducer.java:99) at com.facebook.imagepipeline.producers.LocalContentUriThumbnailFetchProducer.getThumbnail(LocalContentUriThumbnailFetchProducer.java:135) at com.facebook.imagepipeline.producers.LocalContentUriThumbnailFetchProducer.getCameraImage(LocalContentUriThumbnailFetchProducer.java:100) at com.facebook.imagepipeline.producers.LocalContentUriThumbnailFetchProducer.getEncodedImage(LocalContentUriThumbnailFetchProducer.java:75) at com.facebook.imagepipeline.producers.LocalFetchProducer$1.getResult(LocalFetchProducer.java:52)ย  at com.facebook.imagepipeline.producers.LocalFetchProducer$1.getResult(LocalFetchProducer.java:48)ย  at com.facebook.common.executors.StatefulRunnable.run(StatefulRunnable.java:43)ย  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)ย  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)ย  at com.facebook.imagepipeline.core.PriorityThreadFactory$1.run(PriorityThreadFactory.java:51)ย  at java.lang.Thread.run(Thread.java:764)

๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ๊ฒช๊ณ  ์žˆ๋Š” ๋ฌธ์ œ์™€ ์œ ์‚ฌํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๋‘˜๋Ÿฌ๋ณด๋ฉด ์ด๊ฒƒ์€ Fresco ์ž์ฒด์˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ SoLoader ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ฌธ์ œ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ๋ฌธ์ œ๋ฅผ ๊ต์ฐจ ๊ฒŒ์‹œํ•˜๊ณ  ๋ฌธ์ œ๊ฐ€ ์ •ํ™•ํžˆ ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋‚ด๊ธฐ ์œ„ํ•ด ์‹œ๊ฐ„์„ ํ• ์• ํ•  ์ˆ˜ ์žˆ๋Š” ์›Œํฌ๋กœ๋“œ๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”, https://github.com/facebook/fresco/issues/2049#issuecomment -441088387์— ์„ค๋ช…๋œ ๋Œ€๋กœ ์•ฑ ๋ฒˆ๋“ค์„ ์‚ฌ์šฉํ•  ๋•Œ๋„ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

Fresco 1.11์„ ์‚ฌ์šฉํ•˜๊ณ  Fresco์˜ ImagePipelineConfig์—์„œ .experiment().setNativeCodeDisabled(true) ๋ฅผ ์„ค์ •ํ•˜๋ฉด ์ •์  ์ด๋ฏธ์ง€๊ฐ€ ์ž‘๋™ํ•˜์ง€๋งŒ GIF๋Š” ๋‹ค๋ฅธ ์Šคํƒ ์ถ”์ ์œผ๋กœ ์ถฉ๋Œํ–ˆ๊ณ  ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๋™์ผํ•œ SoLoader ๋ฌธ์ œ์ฒ˜๋Ÿผ ๋ณด์˜€์Šต๋‹ˆ๋‹ค. @icerfish , GIF๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Fresco์—์„œ ์‚ฌ์šฉํ•˜๋Š” SoLoader lib์—์„œ ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜์ •์œผ๋กœ PR์„ ์ค€๋น„ํ–ˆ์Šต๋‹ˆ๋‹ค: facebook/soloader#26
์ด ์ˆ˜์ •์œผ๋กœ fresco๋Š” App Bundle์—์„œ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
ํŒจ์น˜๋œ ๋ฒ„์ „์˜ SoLoader lib๋ฅผ ๊ฒŒ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. PR์ด ๋ณ‘ํ•ฉ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์—†๋‹ค๋ฉด ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

repositories {
    maven {
        url  "https://dl.bintray.com/nnesterov/maven" 
    }
}

compile('com.facebook.fresco:fresco:1.10.0') {
    exclude group: 'com.facebook.soloader', module: 'soloader'
}
compile("com.avito.android:patched-soloader:0.1.0")

ํŒจ์น˜๋œ soloader์˜ ์ด์ „ ๋ฒ„์ „์€ ๋กค๋ฆฌํŒ ์ด์ „ ์žฅ์น˜์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๊ณ ์ณค๋‹ค. ์‚ฌ์šฉํ•˜๋‹ค
compile("com.avito.android:patched-soloader:0.1.1")

@nesterov-n ํ›Œ๋ฅญํ•œ ์ˆ˜์ •์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ํ”„๋ ˆ์Šค์ฝ”์— ํ†ตํ•ฉํ•˜๋Š” ๋ฐ ์ง„์ „์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@nesterov-n ์ €๋„ ๊ฐ™์€ ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์–ธ์ œ ํ”„๋ ˆ์Šค์ฝ”์— ํ†ตํ•ฉ๋˜๋Š”์ง€ ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.

์•ˆ๋…•ํ•˜์„ธ์š” @theromis ์™€ @sailesh2์ž…๋‹ˆ๋‹ค.
๋‚˜๋Š” ํŽ˜์ด์Šค๋ถ์—์„œ ์ผํ•˜์ง€ ์•Š๋Š”๋‹ค(๋„ˆ๋ฌด ์Šฌํ”„๋‹ค). ๋‚˜๋Š” ๋‹จ์ง€ Fresco ์‚ฌ์šฉ์ž์ด์ง€๋งŒ ์ˆ˜์ •์„ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋””๋ฒ„๊น…ํ•˜๊ณ  ์ˆ˜์ •ํ•ด์•ผํ–ˆ์Šต๋‹ˆ๋‹ค.
ํ˜„์žฌ ์œ„์˜ ์„ค๋ช…์—์„œ ์„ค๋ช…ํ•œ ๋Œ€๋กœ ๋‚ด ํ”„๋กœ์ ํŠธ์— ํŒจ์น˜๋œ ๋ฒ„์ „์˜ ์†”๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ตœ์‹  ๋ฒ„์ „์€ com.avito.android:patched-soloader:0.1.2

ํ˜„์žฌ soloader lib์— ๋Œ€ํ•œ ๋‚ด PR์„ ๊ฒ€ํ† ํ•˜๊ณ  ์žˆ์ง€๋งŒ soloader ์œ ์ง€ ๊ด€๋ฆฌ์ž๋Š” ์ƒˆ๋กœ์šด soloader lib ๋ฆด๋ฆฌ์Šค์— ๋Œ€ํ•œ ์˜ˆ์ƒ์ด ์—†๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Fresco๊ฐ€ ์ด ์ƒˆ ๋ฒ„์ „์„ ์–ธ์ œ ์‚ฌ์šฉํ• ์ง€ ์˜ˆ์ธกํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๊ธ‰ํ•œ ๊ฒฝ์šฐ ๋‚ด ํŒจ์น˜ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋ ˆ์Šค์ฝ”๊ฐ€ ์žˆ๋Š” ๋ฒˆ๋“ค์„ ํ”„๋กœ๋•์…˜์— ๊ฒŒ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์•„์ง Fresco์— ํ†ตํ•ฉ๋˜์ง€ ์•Š์€ ์ด์œ ๋ฅผ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

SoLoader ์ˆ˜์ • ์‚ฌํ•ญ์ด ์ ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. SoLoader ๋ฒ„์ „์ด ์ถœ์‹œ๋˜๋ฉด ๊ณง ์ƒˆ๋กœ์šด Fresco ๋ฒ„์ „์„ ์ถœ์‹œํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@oprisnik ์ถœ์‹œ

SoLoader v0.6.0์ด ๋ฐฉ๊ธˆ ๋ฆด๋ฆฌ์Šค๋˜์—ˆ์œผ๋ฉฐ Fresco ์ข…์†์„ฑ์„ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค(6fc071d1892166d11d1f237f10e2d9bcdf858087). ์šฐ๋ฆฌ๋Š” MIT ๋ผ์ด์„ผ์Šค Bolts ๋ฆด๋ฆฌ์Šค(#2257)๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ฆด๋ฆฌ์Šค๊ฐ€ ์˜ˆ์ƒ๋ณด๋‹ค ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋ฉด ์ง€๊ธˆ์€ ๊ฑด๋„ˆ๋›ฐ๊ณ  ๋ฆด๋ฆฌ์Šคํ•˜์ง€ ์•Š๊ณ  ๋ฆด๋ฆฌ์Šคํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ์ƒˆ ๋ฒ„์ „์€ ๋ฉฐ์น  ์•ˆ์— ๋‚˜์˜ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‘”ํƒํ•˜๊ณ  ์‹ถ์ง€ ์•Š์€๋ฐ ํ”„๋ ˆ์Šค์ฝ”ํ™”๋Š” ํ’€์–ด์•ผ ํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๊นŒ? ์ง€์ ํ•˜์‹  ์ด ๋ฌธ์ œ๋Š” ํ•œ๋™์•ˆ ํ™œ๋™์ด ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ณ ์ • SoLoader ๋ฒ„์ „์ด ํฌํ•จ๋œ ๋ฒ„์ „ 1.12.0 ์„ ๋ฐฉ๊ธˆ ์ถœ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ ๊ฐ€๋“œ ์ถ”๊ฐ€ ์‹œ๋„

@DoNotStrip์œผ๋กœ ์ฃผ์„์ด ๋‹ฌ๋ฆฐ ๋ฉ”์†Œ๋“œ/ํด๋ž˜์Šค๋ฅผ ์ œ๊ฑฐํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

- @com.facebook.common.internal.DoNotStrip ํด๋ž˜์Šค ์œ ์ง€ *
-keepclassmembers ํด๋ž˜์Šค * {
@com.facebook.common.internal.DoNotStrip *;
}

@DoNotOptimize ์ฃผ์„์ด ๋‹ฌ๋ฆฐ ๋ฉ”์†Œ๋“œ/ํด๋ž˜์Šค๋ฅผ ์ œ๊ฑฐํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

- @com.facebook.soloader.DoNotOptimize ํด๋ž˜์Šค ์œ ์ง€ *
-keepclassmembers ํด๋ž˜์Šค * {
@com.facebook.soloader.DoNotOptimize *;
}

๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ ์œ ์ง€

-keepclassmembers ํด๋ž˜์Šค * {
ํ† ์ข…์˜;
}

- ์˜คํ‚ค์˜ค๋ฅผ ๊ฒฝ๊ณ ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. *-dontwarn com.squareup.okhttp. *
-okhttp3๋ฅผ ๊ฒฝ๊ณ ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. *-javax.annotation์„ ๊ฒฝ๊ณ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. *
-dontwarn com.android.volley.toolbox. *-dontwarn com.facebook.infer. *

@ProHzen ์ด๊ฒƒ์ด soloader ์ถฉ๋Œ์„ ์ˆ˜์ • ํ–ˆ์Šต๋‹ˆ๊นŒ?

๋„ค, ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

์—ฌ์ „ํžˆ fresco 2.0.0์— ์žˆ์Šต๋‹ˆ๋‹ค. :-(, ๋„ฅ์„œ์Šค ์žฅ์น˜์—๋งŒ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ œ์•ˆํ•˜์‹ญ์‹œ์˜ค.

@ProHzen ์•ˆ๋…•ํ•˜์„ธ์š”, ํ˜ผ๋ž€ ๋ชฉ๋ก์„ ์ €์—๊ฒŒ ๋ณด๋‚ด์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?๋‹น์‹ ์ด ํ•œ ๋ฐฉ์‹์œผ๋กœ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
์ •๋ณด:
ํ”„๋ ˆ์Šค์ฝ”:1.13.0
ํด๋ž˜์Šค ๊ฒฝ๋กœ 'com.android.tools. ๋นŒ๋“œ:๊ทธ๋ผ๋“ค :3.5.1'

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