วิธีส่งพารามิเตอร์ไปยังโค้ด Java ในการกำหนดค่าการรัน/ดีบักจาก Android Studio

แอพ Android ของฉันส่งคำขอ http ไปยังเซิร์ฟเวอร์ของฉัน อย่างไรก็ตาม บางครั้งฉันกำลังแก้ไขโค้ด API ใหม่ที่ทำงานบนเครื่องที่กำลังพัฒนาของฉัน ฉันต้องการที่จะส่งผ่านบางสิ่ง (เช่น ตัวแปรสภาพแวดล้อม) ดังนั้นใน โค้ด ของฉัน หากมีอยู่ ฉันจะสามารถใช้สิ่งนั้นเป็นชื่อโฮสต์สำหรับคำขอ api จากโปรแกรมจำลอง Android ได้

ดังนั้นฉันจึงมองหาวิธีที่จะผ่านบางอย่างเช่น:

API_SERVER=http://10.0.2.2/myapp/

และในโค้ดของฉัน ฉันจะใช้มันด้วยวิธีใดวิธีหนึ่ง เช่น:

final static String API_SERVER_REAL = "http://example.com/";
final String apiServerOverride = System.getenv("API_SERVER");
final String API_SERVER = (null != apiServerOverride && !apiServerOverride.isEmpty() ? apiServerOverride : API_SERVER_REAL);

comment
และคำถามคือจะตั้งค่าการรันอย่างไรเพื่อให้สิ่งนี้ง่ายขึ้นจาก Android Studio? แทนที่จะเป็นตัวแปรสภาพแวดล้อม ฉันขอแนะนำพารามิเตอร์บรรทัดคำสั่ง   -  person Scott Barta    schedule 23.02.2014
comment
ฉันก็เปิดรับมันเหมือนกัน คุณจะส่งพารามิเตอร์บรรทัดคำสั่งจาก Android Studio ไปยังแอป Android ของคุณที่ทำงานในโปรแกรมจำลองได้อย่างไร คลาสใดที่ได้รับในแอป Android ของคุณ ฉันสงสัยว่าเป็นไปได้หรือไม่: stackoverflow.com/ คำถาม/20197242/   -  person Gavriel    schedule 23.02.2014
comment
โอ้ ฉันคิดว่าคุณกำลังพูดถึงการส่งข้อมูลไปยังกระบวนการเซิร์ฟเวอร์ ไม่มีบรรทัดคำสั่งสำหรับ Android APK; คุณสามารถเขียนค่าลงใน Sqlite ผ่านคำสั่งเชลล์ adb หรืออาจแค่เขียนไฟล์ไปยังระบบไฟล์ในเครื่อง   -  person Scott Barta    schedule 24.02.2014
comment
การส่งพารามิเตอร์ -P ไปยัง gradle จาก android studio ที่เป็นไปได้   -  person Rostyslav Roshak    schedule 04.08.2017
comment
@RostyslavRoshak คำถามนี้มาจากปี 2014 ส่วนอีกคำถามหนึ่งมาจากปี 2015 ดังนั้นคำถามนี้จะซ้ำกับคำถามอื่นได้อย่างไร คำถามอื่น ๆ เกี่ยวกับวิธีการส่งบางอย่างไปยัง GRADLE ในขณะที่คำถามนี้คือวิธีส่งบางอย่างไปยังโค้ด JAVA ของ APP   -  person Gavriel    schedule 06.08.2017


คำตอบ (4)


ฉันขอแนะนำให้ใช้ productFlavors แต่ละรสชาติสามารถมีการตั้งค่าเฉพาะสภาพแวดล้อมได้ ฉันเพียงแค่มีคลาสที่เรียกว่า 'สิ่งแวดล้อม' ซึ่งมี public static final Strings ทั้งหมดที่ฉันต้องการและรสชาติของผลิตภัณฑ์แต่ละอย่างจะมีคลาสนี้ในเวอร์ชันที่แตกต่างกันพร้อมค่าที่ตั้งไว้สำหรับสภาพแวดล้อม

person Nebu    schedule 21.07.2014
comment
เอกสารที่คุณเชื่อมโยงนั้นล้าสมัยและเลิกใช้แล้วในขณะนี้ ในกรณีการใช้งานนี้ โครงสร้าง buildTypes นั้นมีมากกว่า เหมาะสมกว่าการใช้ผลิตภัณฑ์ รสชาติ มีการกล่าวถึงความแตกต่างที่นี่ และเอกสารปัจจุบันของทั้ง ที่นี่ - person ScottyC; 13.02.2018

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

ประการแรก build.gradle ซึ่งกำหนดรสชาติเป็นส่วนหนึ่งของแหล่งที่มาของโครงการ ดังนั้นจึงจะต้องไม่มีข้อมูลดังกล่าวเพื่อที่จะส่งมอบอย่างปลอดภัยในระบบควบคุมแหล่งที่มา

ประการที่สอง อาจมีความจำเป็นต้องทดสอบรสชาติที่แตกต่างกันกับจุดสิ้นสุด/คีย์ API ที่แตกต่างกัน จะเป็นอย่างไรหากคุณเพียงต้องการเข้าถึงเซิร์ฟเวอร์ debug http ที่คุณเพิ่งสร้างขึ้นเพื่อแก้ไขข้อบกพร่องล่ะ คุณจะสร้างรสชาติให้กับสิ่งนั้นหรือไม่? อาจจะไม่... รสชาตินั้นดีสำหรับของอย่าง "รสฟรี" และ "รสพรีเมียม"

ปัญหานี้แก้ไขได้อย่างง่ายดายโดยใช้แฟล็ก gradles -P คุณสามารถเข้าถึงคุณสมบัติการไล่ระดับที่ส่งผ่านในลักษณะนี้เป็นตัวแปรปกติภายใน gradle.build ของคุณ และคุณสามารถเปลี่ยนแปลงลักษณะการทำงานของมันได้ตามนั้น

หากคุณต้องการเพิ่มแฟล็กนี้ลงในแอปพลิเคชันของคุณ คุณสามารถใช้โซลูชันของ Scott ที่โพสต์ไว้ที่นี่ รวมกับแฟล็กที่ให้มา

คำสั่ง build อาจจะมีลักษณะดังนี้:

$ gradle build -Papiroot=http://www.example.com

และใน build.gradle ของคุณ คุณจะต้องกำหนดงาน writeValue ดังนี้:

task writeValue(type:Exec) {
    commandLine '/usr/local/bin/adb', 'shell', "echo 'API_SERVER=${apiroot}' > /data/data/values.properties"
}

FYI การตั้งค่าสถานะ -P สามารถกำหนดค่าได้อย่างง่ายดายใน Android Studio โดยการนำทางจากเมนู:

เรียกใช้ -> การกำหนดค่าเรียกใช้ / ดีบัก -> ค่าเริ่มต้น -> Gradle -> พารามิเตอร์สคริปต์

person Karol Majta    schedule 23.04.2015
comment
ฉันชอบแนวทางนี้ แต่มันขาดสิ่งเล็กๆ น้อยๆ อย่างหนึ่ง: จะทำให้ปลั๊กอิน Android Studio Gradle ส่งผ่านตัวแปร -P นั้นได้อย่างไรเมื่อทำการซิงค์โปรเจ็กต์กับ Android Studio คุณรู้ไหมว่าสิ่งนี้เป็นไปได้หรือไม่? - person Julian Cerruti; 09.11.2015

สิ่งที่ง่ายที่สุดน่าจะเป็นการเขียนข้อมูลที่คุณต้องการส่งผ่านไปยังไฟล์บนอุปกรณ์ใน /data/data; แอป Android ของคุณสามารถอ่านอุปกรณ์ได้เล็กน้อย (อาจทำให้เป็นไฟล์ .properties และใช้ java.util.Properties เพื่ออ่าน) หากต้องการเขียนออกมา ให้ใช้งานประเภทนี้ในไฟล์ build.gradle ของคุณ (และใช้เส้นทางที่ถูกต้องไปยังคำสั่ง adb สำหรับการตั้งค่าของคุณ):

task writeValue(type:Exec) {
    commandLine '/usr/local/bin/adb', 'shell', 'echo \'API_SERVER=http://10.0.2.2/myapp/\' > /data/data/values.properties'
}

มีเอกสารเกี่ยวกับงาน Gradle exec อยู่ที่ http://www.gradle.org/docs/current/dsl/org.gradle.api.tasks.Exec.html

คุณสามารถดำเนินการงานนี้ด้วยตนเองจาก Android Studio โดยใช้มุมมองงาน Gradle:

ภาพหน้าจอของมุมมองงาน Gradle

person Scott Barta    schedule 24.02.2014
comment
เป็นไปไม่ได้หรือที่จะเชื่อมโยงงานเข้ากับงานระบบบิลด์ android เริ่มต้นอื่น ๆ เพื่อให้มันได้รับการดำเนินการโดยอัตโนมัติเมื่อคุณกดปุ่ม Run - person dirleyrls; 10.01.2015

เนื่องจากข้อบกพร่องใน Android Studio คุณไม่สามารถส่งพารามิเตอร์ vm หรือสคริปต์จากการกำหนดค่า gradle ได้ ปัญหานี้ที่นี่

วิธีแก้ปัญหาใน Linux envs (อาจเป็น Mac ด้วย) คุณสามารถสร้างการกำหนดค่า bash ซึ่งคุณจะสามารถเพิ่มพารามิเตอร์ที่ต้องการทั้งหมดได้

person user2468170    schedule 08.09.2015