คำตอบนี้จะแสดงให้เห็นถึงความแตกต่างระหว่างimplementation, apiและcompileในโครงการ
สมมติว่าฉันมีโครงการที่มีโมดูล Gradle สามโมดูล:
- แอพ (แอปพลิเคชัน Android)
- myandroidlibrary (ห้องสมุด Android)
- myjavalibrary (ไลบรารี Java)
appมีการmyandroidlibraryพึ่งพา myandroidlibraryมีการmyjavalibrary  พึ่งพา

myjavalibraryมีMySecretชั้นเรียน
public class MySecret {
    public static String getSecret() {
        return "Money";
    }
}
myandroidlibraryมีMyAndroidComponentคลาสที่จัดการค่าจากMySecretคลาส
public class MyAndroidComponent {
    private static String component = MySecret.getSecret();
    public static String getComponent() {
        return "My component: " + component;
    }    
}
สุดท้ายappนี้สนใจเพียงคุณค่าจากmyandroidlibrary
TextView tvHelloWorld = findViewById(R.id.tv_hello_world);
tvHelloWorld.setText(MyAndroidComponent.getComponent());
ทีนี้มาพูดถึงการพึ่งพา ...
appจำเป็นที่จะต้องใช้:myandroidlibraryดังนั้นในการใช้งานapp build.gradleimplementation
( หมายเหตุ : คุณสามารถใช้ API / คอมไพล์ได้เช่นกัน แต่ถือความคิดชั่วครู่หนึ่ง)
dependencies {
    implementation project(':myandroidlibrary')      
}

คุณคิดว่าmyandroidlibrarybuild.gradle ควรมีลักษณะอย่างไร เราควรใช้ขอบเขตใด
เรามีสามตัวเลือก:
dependencies {
    // Option #1
    implementation project(':myjavalibrary') 
    // Option #2
    compile project(':myjavalibrary')      
    // Option #3
    api project(':myjavalibrary')           
}

  อะไรคือความแตกต่างระหว่างพวกเขากับสิ่งที่ฉันควรใช้
รวบรวมหรือ Api (ตัวเลือก # 2 หรือ # 3)

หากคุณกำลังใช้หรือcompile apiแอปพลิเคชัน Android ของเราสามารถเข้าถึงการmyandroidcomponentพึ่งพาซึ่งเป็นMySecretชั้นเรียน
TextView textView = findViewById(R.id.text_view);
textView.setText(MyAndroidComponent.getComponent());
// You can access MySecret
textView.setText(MySecret.getSecret());
การใช้งาน (ตัวเลือก # 1)

หากคุณกำลังใช้implementationการกำหนดค่าMySecretจะไม่ถูกเปิดเผย
TextView textView = findViewById(R.id.text_view);
textView.setText(MyAndroidComponent.getComponent());
// You can NOT access MySecret
textView.setText(MySecret.getSecret()); // Won't even compile
ดังนั้นการกำหนดค่าที่คุณควรเลือก? ขึ้นอยู่กับความต้องการของคุณ
หากคุณต้องการที่จะเปิดเผยการพึ่งพาการใช้งานหรือapicompile
หากคุณไม่ต้องการที่จะเปิดเผยการอ้างอิง (หลบซ่อนตัวอยู่ภายในโมดูลของคุณ) implementationแล้วใช้
บันทึก:
นี่เป็นเพียงส่วนสำคัญของการกำหนดค่า Gradle โปรดดูตารางที่ 49.1 ปลั๊กอิน Java Library - การกำหนดค่าที่ใช้เพื่อประกาศการขึ้นต่อกันสำหรับคำอธิบายโดยละเอียดเพิ่มเติม
ตัวอย่างโครงการสำหรับคำตอบนี้มีอยู่ที่https://github.com/aldoKelvianto/ImplementationVsCompile