2016-08-29 18 views
18

Tôi có 3 dự án được sử dụng làm thư viện trong vòng 4 (dự án chính).Ẩn các lớp thư viện - Android

3 dự án được tuân thủ trong nhau như sau (build.gradle):

Dự án Thư viện:

  • Dự án A Dự án

    compile project(":projectA") 
    compile project(":projectB") 
    
  • B

    compile project(':projectC') 
    

Main Project:

compile(name: 'projectA', ext: 'aar') 
compile(name: 'projectB', ext: 'aar') 
compile(name: 'projectC', ext: 'aar') 

Tôi muốn làm điều gì đó để "Dự án thư viện", do đó từ bên trong dự án chính, nếu tôi nhấp vào bất kỳ lớp từ trong dự án Thư viện, tôi sẽ không thể xem mã hoặc mã sẽ được mã hóa. Ví dụ:

Vì vậy, ví dụ: nếu có InterfaceA trong ProjectA và hoạt động chính của Dự án chính thực hiện giao diện đó, nếu tôi "Ctrl-Click" vào giao diện, kết quả sẽ tương tự như những gì tôi đã chỉ định ở trên.

Tôi hiểu Proguard làm điều gì đó tương tự, nhưng đó chỉ là nếu bạn đang xây dựng bản phát hành .apk, tôi cần kết quả tương tự cho các thư viện được biên dịch.

+0

Tôi nghĩ bạn đang hỏi về cách kiểm soát/cấu hình IDE của bạn, không giải quyết được vấn đề lập trình. Chỉ cần một con trỏ khác: Proguard * obfuscates *, không mã hóa, và nó thực hiện điều này trên bytecode.Nếu bạn có các tập tin nguồn mở trong IDE (hoặc trong một AAR phát triển), thì tất nhiên IDE sẽ giúp bạn bằng cách nhấp chuột vào nguồn .... –

+0

Rõ ràng bạn không hiểu câu hỏi đó. Làm thế nào IDE của tôi được cấu hình không giúp thực tế rằng nếu tôi phân phối thư viện cho một thực thể bên ngoài, họ vẫn sẽ có thể xem mã thư viện. Bạn mong đợi tôi để đi cấu hình IDE của họ là tốt sau đó? – TejjD

+0

Tôi hiểu. Sau đó, bạn phải làm xáo trộn mã của bạn bằng Proguard hoặc các công cụ tương tự. Nhưng đó chỉ là giải pháp một phần - bytecode có thể được giải mã tương đối dễ dàng thành Java, và Proguard chỉ có thể thay thế * tên * của mọi thứ (biến, thành viên riêng và phương thức, v.v.), chứ không phải thực thi. –

Trả lời

7

Nhiều dự án sử dụng ProGuard để đạt được sự bảo vệ này.

  • Bạn có thể sử dụng Gradle để xây dựng các thành phần thư viện dành cho Android
  • Libraries, giống như các ứng dụng, có thể xây dựng phát triển hoặc phát hành xây dựng các loại
  • Proguard thể được cấu hình để chạy trên một thành phần (ứng dụng hoặc thư viện), nhưng chỉ trong loại bản phát hành. Xem tại đây: https://sites.google.com/a/android.com/tools/tech-docs/new-build-system/user-guide#TOC-Running-ProGuard
  • Nếu thành phần được rút gọn (được khuyên dùng), thì bạn cần phải nói cho Progaurd biết các lớp "gốc" là gì, nếu không nó sẽ làm giảm thư viện thành nghĩa đen. Điều này có thể đạt được bằng cách thêm một quy tắc để các tập tin cấu hình:

    -keep class your.package.name {public *;} 
    

    Một ví dụ mở rộng hơn là ở đây: http://proguard.sourceforge.net/manual/examples.html#library

Tuy nhiên có một số hạn chế: sử dụng chính

  • ProGuard của là loại bỏ càng nhiều thông tin gỡ lỗi, số dòng và tên càng tốt khỏi bytecode mà không thay đổi những gì bytecode thực sự làm. Nó thay thế tên của các thành viên và các đối số, các lớp không công khai với các lớp vô nghĩa, ví dụ vehicleLicensePlate có thể trở thành _a. Như bất kỳ người bảo trì mã nào sẽ liên quan, thành viên xấu và tên biến làm cho việc bảo trì thực sự khó khăn.
  • ProGuard thể (hơi) sửa đổi bytecode bằng cách tối ưu càng nhiều càng tốt (hằng số tính toán định nghĩa là biểu thức, chơi đùa với nội tuyến, vv optimisations được liệt kê ở đây: http://proguard.sourceforge.net/FAQ.html#optimization)
  • ProGuard không mã hóa các bytecode - JVM cần phải xem bytecode thực tế nếu không nó không thể chạy chương trình.

Vì vậy, việc làm xáo trộn chỉ làm cho kỹ sư đảo ngược và hiểu thư viện khó hơn, không thể thực hiện tác vụ này không thể.

Một con trỏ cuối cùng: ProGuard đổ một tệp chứa danh sách những gì nó đã thay đổi, đặc biệt là số dòng. Khi bạn nhận được dấu vết ngăn xếp trở lại từ khách hàng của bạn (hoặc thông qua các công cụ trực tuyến như Crashlytics), bạn có thể hoàn nguyên các obfuscation để bạn có thể gỡ lỗi. Trong bất kỳ quá trình phát hành phiên bản nào, bạn cần phải tìm cách lưu tệp này.

Tệp này cũng cần thiết khi bạn thực hiện các bản phát hành gia tăng thư viện của bạn để obfuscation phù hợp với phiên bản đã phát hành trước đó. Nếu bạn không làm như vậy, khách hàng không thể thay thế thư viện của bạn và sẽ phải xây dựng lại hoàn toàn (và liên kết) của ứng dụng của họ.

Trong khi ProGuard là một tùy chọn miễn phí dễ dàng hoạt động, có các bộ obfuscators miễn phí và trả phí khác. Một số cung cấp một vài tính năng hơn, nhưng về cơ bản là giống nhau, và khả năng tương thích của ProGuard với IDE, công cụ và dịch vụ là tuyệt vời.

+0

Điều này vẫn không trả lời được câu hỏi của tôi. Nếu tôi đang bán một thư viện, có thể được sử dụng kết hợp với dự án hiện tại của bạn, tôi muốn hoàn toàn hạn chế bạn xem bất kỳ triển khai nào. Chỉ cho phép bạn sử dụng chức năng. – TejjD

+2

Bạn chỉ đơn giản là không thể làm điều đó. Bytecode là máy có thể đọc được, nếu không bạn sẽ không thể sử dụng lib, và nếu nó có thể đọc được, một trình biên dịch thích hợp có thể khôi phục lại các chi tiết thực hiện. Ngay cả khi không có trình biên dịch ngược, các lệnh JVM sẽ hiển thị cho bất kỳ ai. TL; DR: ** không có cách nào để bảo vệ việc thực hiện của bạn ** ngoài việc làm xáo trộn mã khiến nó tốn quá nhiều thời gian để vượt qua nó, nên mọi người bỏ cuộc. –

+1

@tejjD Gergely (và những người khác bên dưới) là chính xác. Vào cuối ngày, nếu JVM phải có khả năng đọc mã byte để thực thi nó. Nếu JVM có thể đọc nó, thì IDE và trình biên dịch ngược (có thể sử dụng JVM để đọc và thực hiện thư viện). Nếu mã có thể được đọc, nó có thể được giải mã. Obfuscation làm cho nó khó khăn hơn nhiều cho khách hàng để hiểu việc thực hiện và đảo ngược kỹ sư quy trình suy nghĩ của bạn. Trong khi Java bytecode là tương đối dễ hiểu khi so sánh với C++ đã biên dịch, thậm chí mã C++ được biên dịch đã bị biên dịch vẫn còn có khả năng đảo ngược. –

1

2 bước sau:

  1. thêm các thư viện của bạn để repo maven địa phương

  2. sử dụng maven dependences thay vì sự phụ thuộc dự án.

2

Bạn có thể đặt tất cả những phương pháp bạn không muốn được công khai để mặc định, vì vậy họ không thể được sử dụng bên ngoài của dự án ban đầu. Ngoài ra, bạn nên tách các thư viện khỏi dự án ứng dụng, biên dịch chúng và sử dụng chúng như các phụ thuộc bên ngoài. Nếu bạn không muốn mã nguồn của thư viện được xuất bản, chỉ cần không thêm nó vào các tùy chọn biên dịch. Nếu ai đó khác hơn bạn cần sử dụng thư viện của bạn, hãy xuất bản nó bằng cách sử dụng bintray hoặc chỉ thêm các tệp aar/jar đã biên dịch vào dự án ứng dụng.

Dưới đây là một hướng dẫn cho toàn bộ quá trình: https://inthecheesefactory.com/blog/how-to-upload-library-to-jcenter-maven-central-as-dependency/en

Ngoài ra, bạn có thể xây dựng các dự án thư viện sử dụng maven (Tôi tìm thấy nó dễ dàng hơn nhiều so với sử dụng gradle), hãy xem ở đây cho một ví dụ: https://github.com/simpligility/android-maven-plugin/tree/master/src/test/projects/libraryprojects

và dự án cụ thể: https://github.com/fcopardo/BaseViews-Android

0

Bạn không thể làm điều đó. Một thư viện được biên dịch có các tệp .class (bytecode), có thể được bỏ biên dịch và xem bằng cách sử dụng các trình biên dịch khác nhau như JD-GUI, vv. Android Studio có trình biên dịch được tích hợp sẵn giúp người dùng dễ dàng hơn -nhấp và xem tệp .class. Tùy chọn tốt nhất bạn có là làm xáo trộn mã của bạn. Here là một số obfuscators bạn có thể sử dụng. Nhưng luôn ghi nhớ rằng đó là không bao giờ không thể để đảo ngược kỹ sư. Mọi thứ đều có thể hack được.

Các vấn đề liên quan