วิธีใช้ 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.