วิธีใช้ ProGuard ใน Android Studio


99

นี่เป็นโครงการแรกของฉันใน Android Studio และรหัสของแอปของฉันไม่ได้ถูกทำให้สับสน ฉันใช้การกำหนดค่านี้ในไฟล์ build.gradle: ป้อนคำอธิบายภาพที่นี่

ฉันใช้ Build> Generate Signed APK ... ด้วยการเลือก Run Proguard และเมื่อฉันได้ทดสอบโดยใช้ Apk_OneClick.v4.2 รหัสของฉันก็อ่านง่ายอย่างสมบูรณ์:

ป้อนคำอธิบายภาพที่นี่

ได้โปรดช่วยฉันด้วย :(


แสดงกฎการป้องกันของคุณที่กำหนดไว้ในไฟล์ข้อความสำหรับรหัสที่ทำให้สับสน
— pyus13

จะตรวจสอบได้อย่างไรว่าแอปนั้นสับสนหรือไม่?
— VVB

@VVB โดยการสร้างไฟล์ APK แบบย้อนกลับฉันเดา: D
— hotHead

คำตอบ:


71

คุณอาจไม่ได้ลงนามในเวอร์ชันรุ่นของ APK ผ่านวิซาร์ดการลงนาม คุณสามารถสร้าง APK ที่วางจำหน่ายจากบรรทัดคำสั่งด้วยคำสั่ง:

./gradlew assembleRelease

หรือคุณสามารถเลือกรูปแบบการเผยแพร่จากมุมมองBuild Variantsและสร้างจาก GUI:

หน้าต่างหลัก IDE แสดง Build Variants


เยี่ยมมาก! ฉันได้ทดสอบการเปลี่ยนการดีบักเป็น runProguard จริงและทำงานได้อย่างสมบูรณ์ ตอนนี้ฉันอ่านคำตอบของคุณและใช้งานได้ !!!! ผู้ชายที่ดี! ขอบคุณ.
— Felipe Porge Xavier

อ๊ะฉันบังเอิญใส่ "AssembleDebug" แทน "AssembleRelease" ในคำแนะนำบรรทัดคำสั่ง ฉันแก้ไขคำตอบของฉัน
— Scott Barta

เส้นทางของไฟล์. apk ที่ส่งออกผ่านบรรทัดคำสั่งคืออะไร?
— Shajeel Afzal

50

คุณสามารถกำหนดค่าไฟล์ build.gradle ของคุณสำหรับการใช้งาน proguard สามารถอยู่ในระดับโมดูลหรือระดับโครงการ

 buildTypes {

    debug {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'

    }

}

การกำหนดค่าที่แสดงมีไว้สำหรับระดับการดีบัก แต่คุณสามารถเขียนรสชาติการสร้างของคุณเองได้ดังที่แสดงไว้ด้านล่างภายใน buildTypes:

    myproductionbuild{
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
    }

ดีกว่าที่จะมีการแก้ปัญหาของคุณด้วยminifyEnabled falseและ productionbuild และอื่น ๆ minifyEnabled trueที่สร้างเป็น

คัดลอกไฟล์ proguard-rules.txt ในรูทของโมดูลหรือโฟลเดอร์โครงการของคุณเช่น

$YOUR_PROJECT_DIR\YoutProject\yourmodule\proguard-rules.txt

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

  1. ไปที่งาน gradle ในแผงด้านขวาและค้นหาassembleRelease/assemble(#your_defined_buildtype)ภายใต้งานโมดูล

  2. ไปที่ Build Variant ในแผงด้านซ้ายและเลือกบิลด์จากเมนูแบบเลื่อนลง

  3. ไปที่ไดเรกทอรีรากของโครงการใน File Explorer และเปิด cmd / terminal แล้วเรียกใช้

ลินุกซ์ ./gradlew assembleRelease or assemble(#your_defined_buildtype)

Windows gradlew assembleRelease or assemble(#your_defined_buildtype)

คุณสามารถค้นหา apk ในไดเร็กทอรีโมดูล / บิลด์ของคุณ

ข้อมูลเพิ่มเติมเกี่ยวกับการกำหนดค่าและตำแหน่งไฟล์ proguard สามารถดูได้ที่ลิงค์

http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Running-ProGuard


ฉันสามารถพูดให้ใช้ myproductionbuild ได้ที่ไหน
— Felipe Porge Xavier

ใช่คุณถูกต้อง :) คุณจะเห็นสิ่งเดียวกันนี้ในแท็บ Build Variant ที่แผงด้านซ้าย
— pyus13

แต่ apk ไม่มีความสับสน ... :(
— Felipe Porge Xavier

คุณเคยเขียนการกำหนดค่าใน proguard-rule.txt ดูตัวอย่างที่นี่proguard.sourceforge.net/index.html#manual/examples.html
— pyus13

ฉันมีวิธี Gradle DSL ไม่พบ runProguard ()
— นอนหลับ

41

หมายเหตุ: ตอนนี้แทนที่จะเป็น

runProguard false

คุณจะต้องใช้

minifyEnabled false

5
เดาว่าน่าจะถูกตั้งค่าเป็นจริง
— anna_manzhula

1

ลองเปลี่ยนชื่อไฟล์ 'proguard-rules.txt' เป็น 'proguard-android.txt' และลบการอ้างอิง 'proguard-rules.txt' ในไฟล์ gradle ของคุณ การgetDefaultProguardFile(...)โทรอ้างถึงไฟล์ proguard เริ่มต้นที่แตกต่างกันซึ่ง Google มีให้และไม่ใช่ไฟล์นั้นในโครงการของคุณ ดังนั้นให้ลบสิ่งนี้ออกด้วยเพื่อให้ไฟล์ gradle อ่าน:

buildTypes {
    release {
        runProguard true
        proguardFile 'proguard-android.txt'
    }
}

อย่าทำงานให้ฉัน ฉันใส่ proguard-android.txt ที่กำหนดเองไว้ในไดเร็กทอรีเดียวกันโดย proguard-rules.txt แต่โค้ดของฉันไม่มีอะไรเปลี่ยนแปลง
— Felipe Porge Xavier

0

คำตอบอื่น ๆ ที่นี่เป็นข้อมูลอ้างอิงที่ดีเกี่ยวกับการใช้ proguard อย่างไรก็ตามฉันไม่เคยเห็นปัญหาที่พูดถึงว่าฉันพบว่านั่นคือการดัดนิสัย หลังจากที่คุณสร้าง. apk ที่ลงนามแล้วมันจะถูกใส่ไว้ใน/releaseโฟลเดอร์ในแอพของคุณ แต่แอพของฉันมี apk ที่ไม่ได้อยู่ใน/releaseโฟลเดอร์ ดังนั้นฉันใช้เวลาหลายชั่วโมงในการถอดรหัส apk ที่ไม่ถูกต้องโดยสงสัยว่าเหตุใดการเปลี่ยนแปลง proguard ของฉันจึงไม่มีผลกระทบ หวังว่านี่จะช่วยใครสักคน!


0

นี่คือกฎ Proguard ทั่วไปบางส่วนที่คุณต้องเพิ่มในไฟล์proguard-rules.proใน Android Sutdio

มีดตัดเนย

 -keep class butterknife.** { *; }
 -dontwarn butterknife.internal.**
 -keep class **$$ViewBinder { *; }
 -keepclasseswithmembernames class * {
        @butterknife.* <fields>;
  }
 -keepclasseswithmembernames class * {
        @butterknife.* <methods>;
  }

ชุดติดตั้งเพิ่มเติม

 -dontwarn retrofit.**
 -keep class retrofit.** { *; }
 -keepattributes Signature
 -keepattributes Exceptions

OkHttp3

 -keepattributes Signature
 -keepattributes *Annotation*
 -keep class okhttp3.** { *; }
 -keep interface okhttp3.** { *; }
 -dontwarn okhttp3.** 
 -keep class sun.misc.Unsafe { *; }
 -dontwarn java.nio.file.*
 -dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement 

Gson

 -keep class sun.misc.Unsafe { *; }
 -keep class com.google.gson.stream.** { *; }

รหัสทำให้สับสน

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