Android App Bundleãä»ããŠçæãããFrescoã䜿çšããã¢ã¯ãã£ããã£ãèµ·åãããšããlibimagepipeline.soããèŠã€ããããã¢ããªã±ãŒã·ã§ã³ãã¯ã©ãã·ã¥ããŸãã
åœåãããã¯minifyãR8ããŸãã¯Proguardã®åé¡ã§ããå¯èœæ§ããããšæã£ãŠããŸããããããããã¹ãŠãç¡å¹ã«ããAppBundleãä»ããŠãã«ããããšãã«åãçµæãèŠãããŸããã
ãã€ãã£ãã©ã€ãã©ãªã䜿çšããã¢ããªã®ä»ã®ã³ã³ããŒãã³ãããã¹ãããŸããããFrescoãããããã®ãã€ããªãããŒãããã®ã«èŠåŽããŠããã ãã§ããã¹ãŠæåŸ ã©ããã«åäœããŸãã
ç§ãèŠã€ããäžæçã§ããçæ³çã§ã¯ãªã解決çã¯ã次ã®æ§æã䜿çšããŠAPKã®abi
ã«ããåå²ãç¡å¹ã«ããããšã§ããããã¹ãŠã®ãã€ããªãå«ãããšãAPKãµã€ãºã倧å¹
ã«å€§ãããªããŸãã
android {
// Rest of your configuration here
bundle {
abi {
enableSplit false
}
}
}
ãšã©ãŒã¡ãã»ãŒãžã¯æ¬¡ã®ããã«ãªããŸããïŒ ïŒ2049
ã¯ãã倧ãŸãã«ã ãããããã®åé¡ã¯é¢é£ããŠããããç§ã¯ãã£ãšçŠç¹ãåœãŠãŠãããšæã
FrescoãŸãã¯SoLoaderã®ããããã§AndroidAppBundleããµããŒããããŠããªã
ãã®ããã«ãã€ããªãåå²ããŸãã
ç§ã¯ééã£ãŠããå¯èœæ§ããããŸããããã®åé¡ã¯ç§ãæã£ãŠãããã¹ãŠã®ããã€ã¹ã§åçŸå¯èœã§ã
ãã©ã³ããéžæããã ãã§ãªãããã¹ãæžã¿ã
ãŸããFrescoã®åºè·ã¬ã€ãã«ãããšã
Android App Bundleãä»ããŠé
éããã splits
ããŒã次ã®ããã«äœ¿çšããããšã¯ã§ããŸãã
bundle
ã䜿çšãããšã splits
ããŒã¯ç¡èŠãããŸãã
2018幎12æ11æ¥ç«ææ¥ã06ïŒ40 KimiChiuã notifications @ github.comã¯æ¬¡ã®ããã«æžããŠããŸãã
ãšã©ãŒã¡ãã»ãŒãžã¯æ¬¡ã®ããã«ãªããŸããïŒ ïŒ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ã䜿çšããSoLoaderlibã«åé¡ãããããšãããããŸããã ç§ã¯ä¿®æ£ãå ããŠPRãæºåããŸããïŒfacebook / soloaderïŒ26
ãã®ä¿®æ£ã«ããããã¬ã¹ã³ç»ã¯ã¢ããªãã³ãã«ã§æ£åžžã«æ©èœããŸãã
ããããé©çšããããŒãžã§ã³ã®SoLoaderlibãå
¬éããŸããã 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")
以åã®ããŒãžã§ã³ã®patched-soloaderã¯ãããªããã以åã®ããã€ã¹ã§ã¯æ©èœããŸããã§ããã ä¿®æ£ããŸããã 䜿çšããcompile("com.avito.android:patched-soloader:0.1.1")
@ nesterov-nçŽ æŽãããä¿®æ£ãããããšããããããã¬ã¹ã³ç»ã«çµ±åããããã®é²æ©ã¯ãããŸããïŒ
@ nesterov-nç§ãåãåé¡ã«çŽé¢ããŠããŸãã ãã€ãã¬ã¹ã³ç»ã«çµ±åãããã®ãæããŠãã ããã
ããã«ã¡ã¯@theromisãš@ sailesh2
ç§ã¯Facebookã§åããŠããŸããïŒãšãŠãæ²ããã§ãïŒã ç§ã¯ãã ã®ãã¬ã¹ã³ãŠãŒã¶ãŒã§ãããä¿®æ£ãåŸ
ã€ããšãã§ããŸããã§ããã ã ããç§ã¯ããããããã°ããŠä¿®æ£ããªããã°ãªããŸããã§ããã
çŸåšãäžèšã®ã³ã¡ã³ãã§èª¬æããããã«ããããžã§ã¯ãã«ã¯ããããé©çšããããŒãžã§ã³ã®soloderlibã䜿çšããŠããŸãã ææ°ããŒãžã§ã³ã¯com.avito.android:patched-soloader:0.1.2
soloader libãžã®ç§ã®PRã¯çŸåšèŠçŽãããŠããŸãããsoloaderã¡ã³ããã¯ãæ°ããsoloaderlibãªãªãŒã¹ã®èŠç©ããããªããšèšã£ãŠããŸãã ãããã£ãŠããã¬ã¹ã³ããã®æ°ããããŒãžã§ã³ããã€äœ¿çšããããèŠç©ããããšã¯äžå¯èœã§ãã
ç·æ¥ã®å Žåã¯ãããããé©çšããããŒãžã§ã³ã䜿çšã§ããŸãã ãã¬ã¹ã³ç»ã®ãã³ãã«ãæ¬çªç°å¢ã«å ¬éããŸããã ããŸãæ©èœããŸãã
ãã®åé¿çããŸã Frescoã«çµ±åãããŠããªãçç±ãç解ã§ããŸããã
SoLoaderã®ä¿®æ£ãè¡ããŸããã SoLoaderããŒãžã§ã³ããªãªãŒã¹ãã次第ãæ°ããFrescoããŒãžã§ã³ããªãªãŒã¹ããŸãã
@oprisnikãªãªãŒã¹ã®ETAã¯äœã§ããïŒ 2ã€ã®ããŒã ã®èª¿æŽãå¿ èŠã ãšæããŸãããå°ãªããšãããçšåºŠã®å€§ãŸããªæ°ã¯ãå€ãã®éçºè ãäžèšã®åé¿çãé©çšãããããªãªãŒã¹ãåŸ ã€ãã決å®ããã®ã«åœ¹ç«ã¡ãŸãã
SoLoader v0.6.0ããªãªãŒã¹ãããã°ããã§ãFrescoã®äŸåé¢ä¿ãæŽæ°ããŸããïŒ6fc071d1892166d11d1f237f10e2d9bcdf858087ïŒã MITã©ã€ã»ã³ã¹ã®BoltsãªãªãŒã¹ïŒïŒ2257ïŒãåŸ ã¡ãããšæããŸãã ãã®ãªãªãŒã¹ã«äºæ³ãããæéããããå Žåã¯ãä»ã®ãšããã¹ãããããŠããããªãã§ãªãªãŒã¹ããŸãã ãããã«ãããæ°ããããŒãžã§ã³ã¯æ°æ¥ã§ãªãªãŒã¹ãããã¯ãã§ãã
éå±ããããªãã®ã§ããããã¬ã¹ã³ç»ãå ¬éãã¹ãã§ã¯ãããŸãããïŒ ããªããææãããã®åé¡ã¯ããã°ããã®éäœã®æŽ»åãåããŠããªãããã§ãã
ä¿®æ£ãããSoLoaderããŒãžã§ã³ãå«ãããŒãžã§ã³1.12.0ããªãªãŒã¹ããŸããã
ããã¬ãŒããè¿œå ããŠã¿ãŠãã ãã
[email protected]ã¯ã©ã¹ãç¶æããŸã*
-keepclassmembersã¯ã©ã¹* {
@ com.facebook.common.internal.DoNotStrip *;
}
[email protected]ã¯ã©ã¹ãç¶æããŸã*
-keepclassmembersã¯ã©ã¹* {
@ com.facebook.soloader.DoNotOptimize *;
}
-keepclassmembersã¯ã©ã¹* {
ãã€ãã£ã
}
-okioã«èŠåããªãã§ãã ããã *-com.squareup.okhttpã«èŠåããªãã§ãã ããã *
-okhttp3ã«èŠåããªãã§ãã ããã *-javax.annotationã«èŠåããªãã§ãã ããã *
-com.android.volley.toolboxã«èŠåããªãã§ãã ããã *-com.facebook.inferã«èŠåããªãã§ãã ããã *
@ProHzenããã§soloaderã®ã¯ã©ãã·ã¥ãä¿®æ£ãããŸãããïŒ
ã¯ãã解決ããŸããã
ããã¯ãŸã ãã¬ã¹ã³2.0.0ã«ãããŸãã:-(ãåé¿çãææ¡ããŠãã ããç§ã¯ãã¯ãµã¹ããã€ã¹ã§ã®ã¿åé¡ããããŸã
@ProHzenããã«ã¡ã¯ãæ··ä¹±ãªã¹ããéã£ãŠããã ããŸãããïŒç§ã¯ããªãã®ããæ¹ã§è©ŠããŸããããããŸããããŸããã§ããã
æ
å ±ïŒ
ãã¬ã¹ã³ïŒ1.13.0
ã¯ã©ã¹ãã¹ 'com.android.toolsã buildïŒgradle ïŒ3.5.1 '
æãåèã«ãªãã³ã¡ã³ã
Frescoã䜿çšããSoLoaderlibã«åé¡ãããããšãããããŸããã ç§ã¯ä¿®æ£ãå ããŠPRãæºåããŸããïŒfacebook / soloaderïŒ26
ãã®ä¿®æ£ã«ããããã¬ã¹ã³ç»ã¯ã¢ããªãã³ãã«ã§æ£åžžã«æ©èœããŸãã
ããããé©çšããããŒãžã§ã³ã®SoLoaderlibãå ¬éããŸããã PRãããŒãžããããŸã§åŸ ãŠãªãå Žåã¯ããããžã§ã¯ãã§äœ¿çšã§ããŸãã