ข้ามไปยังเนื้อหา

การแก้ไขข้อขัดแย้งของ Google Play Services

ยินดีต้อนรับสู่ฝันร้ายของไลบรารี google-play-services :)

โดยสรุปคือ: ปลั๊กอินต่างๆ สำหรับเฟรมเวิร์กที่แตกต่างกันอาจใช้ไลบรารี google-play-services เวอร์ชันที่ต่างกัน และโปรเจกต์ของคุณอาจคอมไพล์ไม่ผ่านหรือเกิดข้อขัดข้องเนื่องจากเวอร์ชันของไลบรารีล้าสมัย

ส่วนใหญ่แล้ว คุณจะต้องเป็นผู้แก้ไขข้อขัดแย้งเหล่านี้ด้วยตนเอง โชคดีที่ปัญหานี้สามารถแก้ไขได้ ด้านล่างนี้เป็นแนวทางแก้ไขสำหรับปลั๊กอินต่างๆ

คุณสามารถหาไลบรารี Google Play Services ได้เสมอที่ <Android SDK>/extras/google
ไลบรารีมีให้ใช้งานในรูปแบบไฟล์ jar ขนาดใหญ่ไฟล์เดียว: sdk/extras/google/google_play_services/libproject/google-play-services_lib/libs/google-play-services.jar
รวมถึงไฟล์ aar ขนาดเล็กอื่นๆ (ย่อมาจาก Android Archive): sdk/extras/google/m2repository/com/google/android/gms/…

ไฟล์ aar สามารถแยกออกมาเป็นไฟล์ jar ได้ (ปัจจุบันไม่ใช่ทุกเฟรมเวิร์กที่รองรับ aar) โดยการแตกไฟล์ (aar เป็นเพียงไฟล์ zip archive) และนำไฟล์ classes.jar ซึ่งเป็นโค้ดของไลบรารีออกมา

1. Cordova

Anchor link to

ข้อขัดแย้งทั้งหมดของ Google Play Services บน Cordova จะได้รับการแก้ไขโดยอัตโนมัติโดยใช้ Gradle แต่บางครั้ง (เช่น เมื่อปลั๊กอินต่างๆ ใช้ไลบรารีเวอร์ชันหลักที่แตกต่างกัน) การแก้ไขอาจล้มเหลว และอาจมีไลบรารีเดียวกันสองเวอร์ชันที่แตกต่างกันปรากฏในบิวด์ผลลัพธ์

2. Unity, Appcelerator Titanium

Anchor link to

คุณสามารถหาไลบรารี Google Play Services ได้ในปลั๊กอิน (หรือโปรเจกต์ตัวอย่าง) ซึ่งง่ายต่อการอัปเดต/เปลี่ยนแปลง/ลบออกเพื่อแก้ไขข้อขัดแย้งที่อาจเกิดขึ้น:

Terminal window
rm -rf Assets/Plugins/Android/google-play-services_lib/libs
rm -rf Assets/Plugins/Android/google-play-services_lib/res
cp ${ANDROID_HOME}/extras/google/m2repository/com/google/android/gms/play-services-analytics/8.4.0/play-services-analytics-8.4.0.aar Assets/Plugins/Android/
cp ${ANDROID_HOME}/extras/google/m2repository/com/google/android/gms/play-services-ads/8.4.0/play-services-ads-8.4.0.aar Assets/Plugins/Android/

3. Adobe Air

Anchor link to

ให้นำส่วนขยาย ANE มาแยกส่วนประกอบ แล้วประกอบกลับเข้าไปใหม่
นี่คือตัวอย่างการทำงานกับ PushNotification.ane:

Terminal window
unzip PushNotification.ane -d tmp

คำสั่งด้านบนเป็นการแตกเนื้อหาของไฟล์ .ane ไปยังไดเรกทอรี tmp

ตอนนี้ใน tmp/META-INF/ANE/Android-ARM/ และ tmp/META-INF/ANE/Android-x86/ คุณจะพบไลบรารีทั้งหมด: android-support_, play-services_ ที่อาจถูกแก้ไข/อัปเดต/ลบออกไปแล้ว

หากคุณยังคงทำตามลิงก์ไปยังเอกสารด้านบน ให้เปลี่ยน tmp/META-INF/ANE/Android-ARM/platform.xml และ tmp/META-INF/ANE/Android-x86/platform.xml จากนั้นบีบอัดส่วนขยายกลับไป และทุกอย่างควรจะทำงานได้ตามปกติ

อืม…

PushNotification.ane is not a valid native extension file.

การประกอบส่วนขยายกลับเข้าไปใหม่อาจจะซับซ้อนกว่าเล็กน้อย:

  1. ลบ tmp/META-INF/ANE/Android-ARM/platform.xml และ tmp/META-INF/ANE/Android-x86/platform.xml
  2. แก้ไข tmp/META-INF/ANE/Android-ARM/android-depends.xml และ tmp/META-INF/ANE/Android-x86/android-depends.xml ตามคำแนะนำในลิงก์ด้านบนแทน
  3. รันคำสั่ง bash ต่อไปนี้:
Terminal window
#เปลี่ยนชื่อ platform.xml บน iOS เราต้องใช้ไฟล์นี้เพื่อประกอบส่วนขยายกลับเข้าด้วยกัน
mv tmp/META-INF/ANE/iPhone-ARM/platform.xml tmp/META-INF/ANE/iPhone-ARM/platform-iOS.xml
#แพ็คส่วนขยายกลับด้วย adt
cd tmp/META-INF/ANE/
“${flex.sdk}/bin/adt" -package -target ane PushNotification.ane extension.xml -swc ../../../../SWC-Pushwoosh/PushNotification.swc -platform iPhone-ARM -platformoptions iPhone-ARM/platform-iOS.xml -C iPhone-ARM/ . -platform Android-ARM -platformoptions Android-ARM/android-depends.xml -C Android-ARM/ . -platform Android-x86 -C Android-x86/ . -platformoptions Android-x86/android-depends.xml -platform default -C default/ .

คุณสามารถหา PushNotification.swc ได้ที่นี่:
https://github.com/Pushwoosh/pushwoosh-adobe-air/blob/master/SWC-Pushwoosh/PushNotification.swc

4. Unreal Engine

Anchor link to

Unreal Engine และปลั๊กอิน Pushwoosh มักจะขัดแย้งกันเกือบตลอดเวลา สาเหตุคือ Unreal Engine มี Google Play Services รวมอยู่ด้วยโดยค่าเริ่มต้น และ Engine เวอร์ชันต่างๆ ก็ใช้ไลบรารีเหล่านี้ในเวอร์ชันที่แตกต่างกันไป ปลั๊กอิน Pushwoosh ก็ใช้ไลบรารีเหล่านี้เช่นกัน แต่เป็นชุดย่อยที่แตกต่างกันเล็กน้อย คุณควรระมัดระวังเสมอเมื่อทำการผสานรวมปลั๊กอิน Pushwoosh สำหรับ Unreal Engine แม้ว่าโปรเจกต์ของคุณจะดูเหมือนคอมไพล์และทำงานได้ดี คุณควรตรวจสอบให้แน่ใจว่าทั้ง Pushwoosh และ Unreal Engine ใช้ Google Play Services เวอร์ชันเดียวกัน การใช้ google-play-services เวอร์ชันต่างๆ ในโปรเจกต์เดียวกันถือเป็น “undefined behaviour”!

ในการแก้ไขข้อขัดแย้ง คุณควรทำดังต่อไปนี้:

1. ตรวจสอบว่ามีไลบรารี Google Play Services ใดบ้างที่ถูกใช้งานในโปรเจกต์อยู่แล้ว คุณสามารถตรวจสอบได้โดยดูที่ไดเรกทอรี ${UNREAL_PROJECT}/Intermediate/Android/APK/JavaLibs และ ${UNREAL_PROJECT}/Intermediate/Android/APK/libs ตัวอย่างเช่น ใน โปรเจกต์ตัวอย่าง ที่สร้างโดยใช้ Unreal Engine 4.15 จะมีไลบรารีดังต่อไปนี้:

JavaLibs:

  • downloader_library
  • play-services-ads-lite-9.2.0
  • play-services-auth-base-9.2.0
  • play-services-basement-9.2.0
  • play-services-drive-9.2.0
  • play-services-gass-9.2.0
  • play-services-plus-9.2.0
  • support-v4-23.0.0
  • play-services-ads-9.2.0
  • play-services-auth-9.2.0
  • play-services-base-9.2.0
  • play-services-clearcut-9.2.0
  • play-services-games-9.2.0
  • play-services-nearby-9.2.0
  • play-services-tasks-9.2.0
  • pushwoosh-ue-plugin // เพิ่มโดยปลั๊กอิน Pushwoosh

libs:

  • SystemUtils.jar
  • VrApi.jar
  • play-services-gcm-9.2.0.jar // เพิ่มโดยปลั๊กอิน Pushwoosh
  • play-services-iid-9.2.0.jar // เพิ่มโดยปลั๊กอิน Pushwoosh

2. หากเวอร์ชันของไลบรารี play-services* ที่ใช้ใน Pushwoosh และ Unreal Engine ไม่ตรงกัน ให้ลบไลบรารีเหล่านี้ออกจาก ปลั๊กอิน Pushwoosh

2.1 ตรวจสอบว่ามีไลบรารีใดที่ขาดหายไปและคุณควรเพิ่มเข้าไปในปลั๊กอิน Pushwoosh ปลั๊กอินต้องการไลบรารี android-support-v4, play-services-base, play-services-basement, play-services-gcm, play-services-iid สำหรับโปรเจกต์ตัวอย่าง มีเพียง play-services-gcm และ play-services-iid เท่านั้นที่ไม่ซ้ำซ้อน ดังนั้นจึงเป็นไลบรารีเดียวที่ควรเพิ่มในกรณีนี้

2.2 หากต้องการเพิ่มไลบรารี เพียงแค่นำไฟล์ .jar จาก Android SDK ไปไว้ใน https://github.com/Pushwoosh/pushwoosh-unreal-engine/tree/master/Plugins/Pushwoosh/lib/Android/libs ตำแหน่งของไลบรารี Google Play ได้อธิบายไว้ในตอนต้นของบทความนี้แล้ว

แบ่งปันความคิดเห็นของคุณกับเรา

Anchor link to

ความคิดเห็นของคุณช่วยให้เราสร้างประสบการณ์ที่ดีขึ้น เราจึงยินดีรับฟังหากคุณพบปัญหาใดๆ ระหว่างขั้นตอนการผสานรวม SDK หากคุณประสบปัญหาใดๆ โปรดอย่าลังเลที่จะแบ่งปันความคิดเห็นของคุณกับเรา ผ่านแบบฟอร์มนี้