เหตุใดการสร้างประเภทจึงแตกต่างจากรสชาติของผลิตภัณฑ์


173

คำนำ: นี่ไม่ใช่คำถามเกี่ยวกับวิธีใช้ชนิดบิลด์และรสชาติของผลิตภัณฑ์ในแอพ Android ฉันเข้าใจแนวคิดพื้นฐานที่เกี่ยวข้อง คำถามนี้เกี่ยวกับการพยายามทำความเข้าใจกับการกำหนดค่าที่ควรระบุในรูปแบบบิลด์ซึ่งการกำหนดค่าควรจะระบุในรสชาติของผลิตภัณฑ์และความแตกต่างใด ๆ ที่จำเป็นจริงๆ

สัปดาห์นี้ฉันได้เรียนรู้เพิ่มเติมเกี่ยวกับการกำหนดค่าแบบค่อยเป็นค่อยไปสำหรับแอพ Android ตอนแรกฉันคิดว่าฉันมีความสามารถที่ดีในการสร้างประเภทและรสชาติของผลิตภัณฑ์ แต่ยิ่งฉันได้รับเอกสารมากเท่าไหร่ฉันก็ยิ่งรู้ว่าความแตกต่างระหว่างคนทั้งสองไม่ชัดเจนสำหรับฉันเลย

เนื่องจากมีลำดับชั้นที่กำหนดไว้อย่างดี (ในแง่ที่ว่าคุณสมบัติที่ระบุในบิลด์ประเภทมีความสำคัญมากกว่าที่ระบุในรสชาติผลิตภัณฑ์) ฉันไม่เข้าใจว่าทำไมจึงมีความจำเป็นที่จะต้องแยกแยะระหว่างบิลด์ประเภทและรสชาติผลิตภัณฑ์เลย จะเป็นการดีกว่าที่จะรวมคุณสมบัติและวิธีการทั้งหมดลงในวัตถุ DSL สำหรับรสชาติของผลิตภัณฑ์และจากนั้นให้ถือว่าประเภทการสร้างเป็นมิติเริ่มต้นของรสชาติ

ตัวอย่างที่เป็นรูปธรรมบางอย่างที่นำไปสู่ความสับสนของฉัน:

  • signingConfigคุณสมบัติสามารถตั้งค่าในการสร้างทั้งชนิดและรสชาติสินค้า ... แต่minifyEnabled(และผมถือว่าshrinkResources?) เท่านั้นที่สามารถกำหนดค่าในการสร้างประเภท

  • applicationIdสามารถระบุได้เฉพาะในรสชาติผลิตภัณฑ์ ... และapplicationIdSuffixสามารถระบุได้เฉพาะในประเภทบิลด์!?

คำถามจริง :

จากตัวอย่างข้างต้น: มีความแตกต่างที่ชัดเจนระหว่างบทบาทของประเภทการสร้างและรสชาติของผลิตภัณฑ์หรือไม่

ถ้าอย่างนั้นเป็นวิธีที่ดีที่สุดที่จะเข้าใจมันคืออะไร?

ถ้าไม่เป็นแผนในที่สุดจะรวมประเภทการสร้างและรสชาติของผลิตภัณฑ์เป็นวัตถุ DSL ที่กำหนดค่าได้หรือไม่


55
"การกำหนดค่าใดที่ควรระบุในรูปแบบบิลด์ซึ่งควรกำหนดค่าในรูปแบบผลิตภัณฑ์" - รูปแบบของการสร้างแบบจำลอง lifecyle การพัฒนาของคุณ (debug, "dogfood", รีลีส ฯลฯ ) รสชาติของผลิตภัณฑ์จำลองกลยุทธ์การกระจายของคุณ (Google IAP เทียบกับ Amazon IAP กับ BlackBerry IAP เป็นต้น) นี่คือแนวคิดที่เป็นอิสระ สำหรับส่วนที่เหลือฉันจะจินตนาการว่ามีเหตุผลทางเทคนิคที่เกี่ยวข้องกับการใช้งานที่บอกวิธีการตั้งค่า DSL และด้วยเหตุนี้ฉันจะประหลาดใจหากมีแผนการสำหรับการควบรวมกิจการ
CommonsWare

1
@ คอมมอนส์แวร์ที่มีความรู้สึกอยู่ในระดับสูง และใช่บางทีการประมวลผลประเภท / รสชาติต่อเนื่องอาจ จำกัด วิธีและเวลาที่สามารถเปลี่ยนแปลงทั้งapplicationIdตัวอย่างได้
stkent

คำตอบ:


168

การขยายความในสิ่งที่ @CommonsWare กล่าวไว้ในความคิดเห็นแนวคิดพื้นฐานคือประเภทการสร้างมีไว้สำหรับบิลด์ต่าง ๆ ของแอปพลิเคชันที่ไม่ได้ใช้งานได้แตกต่างกันไปหากคุณมีแอปเวอร์ชัน debug และรีลีส แต่มีรหัสการดีบักอาจมีการบันทึกเพิ่มเติมและอื่น ๆ ที่มีความคล่องตัวและเพิ่มประสิทธิภาพและอาจ obfuscated ผ่าน ProGuard ด้วยรสชาติความตั้งใจคือแอพนั้นแตกต่างกันอย่างเห็นได้ชัด ตัวอย่างที่ชัดเจนที่สุดคือแอปของคุณเทียบกับรุ่นที่เสียค่าใช้จ่าย แต่นักพัฒนาซอฟต์แวร์อาจแยกความแตกต่างตามตำแหน่งที่เผยแพร่ (ซึ่งอาจส่งผลต่อการใช้งาน API การเรียกเก็บเงินในแอป)

มีนักพัฒนาที่สร้างแอพที่คล้ายกันหลายเวอร์ชันสำหรับลูกค้าที่แตกต่างกัน - ตัวอย่างอาจเป็นแอพเรียบง่ายที่เปิดหน้าเว็บในมุมมองเว็บพร้อม URL และการสร้างแบรนด์ที่แตกต่างกันสำหรับแต่ละเวอร์ชัน - นี่คือ ใช้ประโยชน์จากรสชาติ

เพื่อย้ำถ้าเป็น "แอพพลิเคชั่นเดียวกัน" modulo ความแตกต่างบางอย่างที่ไม่สำคัญสำหรับผู้ใช้และโดยเฉพาะอย่างยิ่งถ้าตัวแปรทั้งหมดยกเว้นหนึ่งสำหรับการทดสอบและการพัฒนาของคุณเองและจะใช้เพียงหนึ่งตัวแปร ผู้ใช้ขั้นปลายดังนั้นจึงเป็นตัวเลือกที่ดีสำหรับประเภทการสร้าง หากเป็นแอปพลิเคชั่น "ที่แตกต่าง" และหลากหลายรูปแบบจะถูกปรับใช้กับผู้ใช้ดังนั้นบางทีมันอาจเป็นตัวเลือกสำหรับรสชาติของผลิตภัณฑ์

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


17
ขอบคุณสก็อต ฉันคิดว่าการแยกความแตกต่างนี้สมเหตุสมผล (และ 'ประเภทการสร้าง' และ 'รสชาติผลิตภัณฑ์' มีความเหมาะสมสำหรับการใช้งานนี้) บางทีอาจมีคนเข้าใจapplicationIdปัญหาดังต่อไปนี้: เนื่องจากรสชาติเป็นตัวแทนแอปของคุณ "แตกต่างไปจากเดิมอย่างสิ้นเชิง" มันสมเหตุสมผลแล้วที่จะสามารถระบุรหัสแอปที่ต่างกัน "สมบูรณ์" ในขณะที่สำหรับรสชาติคงที่ประเภทบิลด์หลายประเภททั้งหมดเป็นตัวแทนของแอป "เดียวกัน" และดังนั้นจึงได้รับอนุญาตให้เปลี่ยนคำต่อท้าย id แอปเท่านั้น (ดังนั้นจะรักษา 'การจัดกลุ่ม' ของรหัสแอป)
stkent

28

buildTypeกำหนดค่าวิธีที่เราจัดทำแอปของเรา

  • shrinkResources
  • progaurdFile
  • เป็นต้น

Flavourกำหนดค่าคลาสและรีซอร์สที่ต่างกัน

  • ใน Flavour1 กิจกรรมหลักของคุณสามารถทำอะไรได้บ้าง

  • ต่างชื่อแอพ

  • เป็นต้น

แต่ละรสผลิตภัณฑ์สามารถมีค่าของคุณสมบัติต่อไปนี้ของตัวเองซึ่งขึ้นอยู่กับคุณสมบัติเดียวกันจากdefaultConfig:

  • applicationId
  • minSdkVersion
  • targetSdkVersion
  • versionCode
  • versionName

9

นี่คือวิธีที่ฉันกลั่นความแตกต่างลงไปที่สาระสำคัญ:

  • buildTypeเป็นวิธีการสร้าง
  • flavorเป็นสิ่งที่สร้าง

0

build typesถูกนำมาใช้เพื่อระบุdebug/releaseโหมดที่มีใบรับรองที่แตกต่างกันและการเปิดใช้งานProguardหรือdebuggableธง

flavorsจะใช้ในการมีคุณสมบัติที่กำหนดเอง (เช่นฟรีหรือรุ่นที่จ่าย) minimum and target APIระดับของอุปกรณ์และ API ต้องการเช่นlayout, เพื่อให้คุณสามารถมีรหัสที่แตกต่างกันและทรัพยากรในการที่แตกต่างกันdrawableflavors

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.