113

Theo tôi biết, trong "bản phát hành" của Android được ký APK. Làm thế nào để kiểm tra nó từ mã hoặc Eclipse có một số loại định nghĩa bí mật?

Tôi cần điều này để gỡ lỗi các mục ListView từ dữ liệu dịch vụ web (không, logcat không phải là một tùy chọn).

Suy nghĩ của tôi:

  • Ứng dụng android:debuggable, nhưng vì một số lý do không đáng tin.
  • ID thiết bị mã hóa cứng không phải là ý tưởng hay, bởi vì tôi đang sử dụng cùng một thiết bị để kiểm tra các APK đã ký.
  • Sử dụng cờ thủ công ở đâu đó trong mã? Có lý, nhưng chắc chắn sẽ quên thay đổi vào một lúc nào đó, cộng với tất cả các lập trình viên đều lười biếng.
|
76

Có nhiều cách khác nhau để kiểm tra xem ứng dụng có được xây dựng bằng cách sử dụng gỡ lỗi hoặc phát hành chứng chỉ hay không, nhưng cách sau đây có vẻ tốt nhất với tôi.

Theo thông tin trong tài liệu Android Ký ứng dụng của bạn , khóa gỡ lỗi chứa tên phân biệt chủ đề sau: " CN = Gỡ lỗi Android, O = Android, C = US ". Chúng tôi có thể sử dụng thông tin này để kiểm tra xem gói có được ký bằng khóa gỡ lỗi mà không mã hóa chữ ký khóa gỡ lỗi vào mã của chúng tôi hay không.

Được:

import android.content.pm.Signature;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

Bạn có thể thực hiện một phương thức isDebuggable theo cách này:

private static final X500Principal DEBUG_DN = new X500Principal("CN=Android Debug,O=Android,C=US");
private boolean isDebuggable(Context ctx)
{
    boolean debuggable = false;

    try
    {
        PackageInfo pinfo = ctx.getPackageManager().getPackageInfo(ctx.getPackageName(),PackageManager.GET_SIGNATURES);
        Signature signatures[] = pinfo.signatures;

        CertificateFactory cf = CertificateFactory.getInstance("X.509");

        for ( int i = 0; i < signatures.length;i++)
        {   
            ByteArrayInputStream stream = new ByteArrayInputStream(signatures[i].toByteArray());
            X509Certificate cert = (X509Certificate) cf.generateCertificate(stream);       
            debuggable = cert.getSubjectX500Principal().equals(DEBUG_DN);
            if (debuggable)
                break;
        }
    }
    catch (NameNotFoundException e)
    {
        //debuggable variable will remain false
    }
    catch (CertificateException e)
    {
        //debuggable variable will remain false
    }
    return debuggable;
}
|
135

Để kiểm tra cờ gỡ lỗi, bạn có thể sử dụng mã này:

boolean isDebuggable =  ( 0 != ( getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE ) );

Kotlin:

val isDebuggable = 0 != applicationInfo.flags and ApplicationInfo.FLAG_DEBUGGABLE

Để biết thêm thông tin, vui lòng xem Bảo mật ứng dụng Android LVL .

Ngoài ra, nếu bạn đang sử dụng Gradle một cách chính xác, bạn có thể kiểm tra xem BuildConfig.DEBUGđúng hay sai.

|
  • 1

    có vẻ như điều này vẫn kiểm tra android của

    – Tạ Kỳ Anh 17:23:44 17/04/2013
  • 1

    Thử nghiệm đầu tiên cho Manifest có thể gỡ lỗi, điều này không được chấp nhận. Thứ hai là không thể đối với các thư viện, lib sẽ có BuildConfig của riêng nó - không thể nhập BuildConfig của Ứng dụng đang sử dụng Lib. Do đó, câu trả lời được đánh dấu là "ok"

    – Trần Vân Trinh 09:52:01 13/08/2014
  • 1

    Câu trả lời này sẽ hoạt động trong mọi trường hợp bất kể dự án thư viện hoặc dự án ứng dụng.

    – Hoàng Thiệu Bảo 09:46:01 26/10/2017
130

Đã được trả lời bởi Mark Murphy

Giải pháp dài hạn đơn giản nhất và tốt nhất là sử dụng BuildConfig.DEBUG. Đây là một booleangiá trị sẽ truedành cho bản dựng gỡ lỗi, falsenếu không:

if (BuildConfig.DEBUG) {
  // do something for a debug build
}
|
  • 1

    Hạn chế duy nhất của phương pháp này là nó sẽ không hoạt động trong các dự án thư viện (aar's). Khi thư viện được xây dựng, điều này sẽ dẫn đến sai, vì vậy ngay cả khi một ứng dụng sử dụng thư viện ở chế độ gỡ lỗi, kiểm tra này sẽ dẫn đến sai trong mã thư viện.

    – Hoàng Anh Thái 14:47:56 30/09/2015
  • 1

    Câu trả lời này sẽ không hoạt động cho dự án thư viện (.aar)

    – Hồ Vũ Anh 09:47:21 26/10/2017
  • 1

    Có manh mối nào để kiểm tra xem ứng dụng có được phát hành từ một dự án thư viện trong Android không?

    – Hoàng Kim Châu 12:04:54 18/05/2018
21

Có thể muộn, nhưng sử dụng iosched BuildConfig.DEBUG

|
17

Nếu bạn muốn kiểm tra APKtĩnh, bạn có thể sử dụng

aapt dump badging /path/to/apk | grep -c application-debuggable

Điều này xuất ra 0nếu APKkhông gỡ lỗi và 1nếu có.

|
10

Trước tiên hãy thêm tệp này vào tệp build.gradle của bạn, điều này cũng sẽ cho phép chạy các bản dựng gỡ lỗi và phát hành song song:

buildTypes {
    debug {
        applicationIdSuffix ".debug"
    }
}

Thêm phương thức này:

public static boolean isDebug(Context context) {
    String pName = context.getPackageName();
    if (pName != null && pName.endsWith(".debug")) {
        return true;
    } else {
        return false;
    }
}
|
  • 1

    Tôi thích câu trả lời này, vì nó đáng tin cậy. Mặc dù vậy, tôi đã cần thêm mục nhập "ứng dụng Android được phép" mới vào khóa API Google Maps của mình (vì id ứng dụng khác nhau).

    – Trịnh Hồng Ngọc 12:44:37 10/03/2015
5

Bản dựng gỡ lỗi cũng được ký, chỉ với một khóa khác. Nó được tạo tự động bởi Eclipse và chứng chỉ của nó chỉ có hiệu lực trong một năm. Có vấn đề android:debuggablegì vậy? Bạn có thể nhận được giá trị này từ mã bằng cách sử dụng PackageManager.

|
3

Một lựa chọn khác, đáng nói. Nếu bạn chỉ cần thực thi một số mã khi trình gỡ lỗi được đính kèm, hãy sử dụng mã này:

if (Debug.isDebuggerConnected() || Debug.waitingForDebugger()) { 
    //code to be executed 
}
|
0

Giải quyết với android:debuggable. Đó là lỗi trong việc đọc mục trong đó trong một số trường hợp, cờ gỡ lỗi trên mục không được lưu trữ trong bản ghi if (m.debug && !App.isDebuggable(getContext()))luôn được đánh giá false. Lỗi của tôi.

|
  • 1

    Tôi nhận ra điều này đã hơn một năm tuổi, tuy nhiên bạn nên chấp nhận câu trả lời của @Omar Rehman, không phải câu trả lời này. Mặc dù những gì bạn đã đăng là những gì bạn cuối cùng đã làm, nhưng nó không thực sự trả lời câu hỏi bạn đã hỏi, trong khi giải pháp của Omar dường như làm điều đó, có nghĩa là anh ấy xứng đáng được chấp nhận.

    – Huỳnh Ðăng Khoa 11:15:58 20/09/2012
  • 1

    @Mah - hoàn toàn không phù hợp để bắt nạt ai đó vì không chấp nhận câu trả lời đã được đăng gần một năm sau khi họ tự giải quyết vấn đề của mình! Và thậm chí còn phớt lờ câu trả lời mà bạn đề cử phức tạp hơn nhiều so với câu trả lời mà họ đã đi cùng - thực tế, nó trả lời câu hỏi được hỏi, vì câu hỏi đã được nhắc nhở bởi một lỗi dẫn đến ấn tượng sai lầm rằng cờ không đáng tin .

    – Tạ Thảo Yên 14:07:38 22/04/2013
  • 1

    @ChrisStratton nếu bạn nghĩ rằng phản hồi của tôi là bắt nạt, tôi nghĩ bạn không đọc internet nhiều. Tôi ủng hộ quyền đăng quan điểm đối lập của bạn trong một bình luận như bạn đã làm, và kết quả là tôi đã xem lại nhận xét của mình và các bài đăng khác trong câu hỏi này, và tôi đứng trước bình luận ban đầu của mình: người đăng đã hỏi một câu hỏi hợp pháp và được trả lời đúng bởi ai đó. Dựa trên "câu trả lời" của riêng anh ấy, câu hỏi ban đầu của anh ấy không phải là điều anh ấy muốn hỏi ở nơi đầu tiên ... chữ ký của APK (phát hành hoặc gỡ lỗi) có chính xác không có trong bảng kê khai.

    – Đặng Vĩnh Toàn 14:26:22 22/04/2013
  • 1

    @mah - tùy thuộc vào người hỏi, không phải bạn quyết định điều gì thỏa mãn nhu cầu ứng dụng thực tế của họ, bao gồm cả nếu sự khác biệt bạn nêu lên là một trong những điều quan trọng - hoặc, rõ ràng trong trường hợp này, không phải. Quan trọng hơn, bạn hoàn toàn bỏ qua rằng câu trả lời bạn đề cử đã được đăng gần một năm sau khi nhu cầu thực sự của họ được thỏa mãn . Nó đang trừng phạt ai đó vì đã không quay lại để thay đổi sự chấp nhận của họ trong hầu hết một năm sau đó, điều này cấu thành sự bắt nạt.

    – Ngô Kim Thu 14:30:45 22/04/2013
  • 1

    @ChrisStratton cũng tùy thuộc vào người hỏi để hỏi câu hỏi thực tế mà anh ấy muốn có câu trả lời - điều gì đó không được thực hiện trong trường hợp này. Bạn đúng là tôi đã bỏ qua khi câu trả lời thực sự trả lời những gì đã được đăng, tuy nhiên không có hình phạt nào cả, chỉ có một biểu hiện hợp lý trong quan điểm của tôi. Nếu bạn nghĩ rằng tôi đang đóng vai trò kẻ bắt nạt ở đây, tôi mạnh mẽ yêu cầu bạn cờ nhận xét của tôi đối với sự lạm dụng. Tuy nhiên, trước khi làm điều đó, bạn có thể muốn kiểm tra bài đăng của riêng bạn ở đây.

    – Hoàng Đình Khải 15:20:49 22/04/2013

Câu trả lời của bạn (> 20 ký tự)

Bằng cách click "Đăng trả lời", bạn đồng ý với Điều khoản dịch vụ, Chính sách bảo mật and Chính sách cookie của chúng tôi.

Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ hoặc hỏi câu hỏi của bạn.