2011-11-07 31 views
37

Sử dụng Ant, tôi đang cố gắng tạo ứng dụng Android ở chế độ phát hành để phân phối. Vấn đề của tôi là tại quá trình ký kết. Tôi đã tạo một kho khóa và bí danh qua Eclipse bằng cách sử dụng thuật sĩ Xuất ứng dụng Android và ứng dụng được ký một cách chính xác nếu xuất nó qua Eclipse. Khi tôi cố gắng để hoàn thành quá trình tương tự qua Ant tôi tham khảo keystore và bí danh của tôi trong tệp build.properties tôi:Ký Android với Ant

key.store=C:\\Users\\a512091\\.android\\release.keystore 
key.alias=application 
key.store.password=android 
key.alias.password=android 

Quá trình xây dựng thành công và tôi nhận được một tập tin ứng dụng-release.apk. Tôi đã thực hiện APK này với jarsigner và tất cả các tệp đều có thẻ "sm". Đây là đuôi của đầu ra:

jar verified. 
Warning: 
This jar contains entries whose certificate chain is not validated. 

Khi tôi cố gắng để cài đặt APK này vào một giả lập hoặc thiết bị tôi nhận được như sau:

Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES] 

Logcat cho thấy vấn đề ký kết trong hồ sơ CSS của tôi và tài sản hình ảnh :

11-07 11:06:20.060: WARN/PackageParser(58): Exception reading assets/www/css/base.css in /data/app/vmdl48898.tmp 
11-07 11:06:20.060: WARN/PackageParser(58): java.lang.SecurityException: META-INF/XXXXX.SF has invalid digest for assets/www/res/droidhdpi/favorite_off.png in /data/app/vmdl48898.tmp 
11-07 11:06:20.060: WARN/PackageParser(58):  at java.util.jar.JarVerifier.verifyCertificate(JarVerifier.java:369) 
11-07 11:06:20.060: WARN/PackageParser(58):  at java.util.jar.JarVerifier.readCertificates(JarVerifier.java:272) 
11-07 11:06:20.060: WARN/PackageParser(58):  at java.util.jar.JarFile.getInputStream(JarFile.java:392) 
11-07 11:06:20.060: WARN/PackageParser(58):  at android.content.pm.PackageParser.loadCertificates(PackageParser.java:337) 
11-07 11:06:20.060: WARN/PackageParser(58):  at android.content.pm.PackageParser.collectCertificates(PackageParser.java:508) 
11-07 11:06:20.060: WARN/PackageParser(58):  at com.android.server.PackageManagerService.installPackageLI(PackageManagerService.java:5885) 
11-07 11:06:20.060: WARN/PackageParser(58):  at com.android.server.PackageManagerService.access$2100(PackageManagerService.java:134) 
11-07 11:06:20.060: WARN/PackageParser(58):  at com.android.server.PackageManagerService$5.run(PackageManagerService.java:4743) 
11-07 11:06:20.060: WARN/PackageParser(58):  at android.os.Handler.handleCallback(Handler.java:587) 
11-07 11:06:20.060: WARN/PackageParser(58):  at android.os.Handler.dispatchMessage(Handler.java:92) 
11-07 11:06:20.060: WARN/PackageParser(58):  at android.os.Looper.loop(Looper.java:123) 
11-07 11:06:20.060: WARN/PackageParser(58):  at android.os.HandlerThread.run(HandlerThread.java:60) 
11-07 11:06:20.069: ERROR/PackageParser(58): Package com.xxxxx.xxxxx has no certificates at entry assets/www/css/base.css; ignoring! 

Trả lời

49

Nếu bạn có phiên bản Ant < 1.8.3 (ant -version) thử phương pháp này cho các vấn đề với JDK 7 (dựa trên các câu trả lời trước):

  1. Thêm signjarjdk7 để ANDROID_SDK \ tools \ ant \ build.xml

    <macrodef name="signjarjdk7"> 
        <attribute name="jar" /> 
        <attribute name="signedjar" /> 
        <attribute name="keystore" /> 
        <attribute name="storepass" /> 
        <attribute name="alias" /> 
        <attribute name="keypass" /> 
        <attribute name="verbose" /> 
        <sequential> 
         <exec executable="jarsigner" failonerror="true"> 
          <!-- Magic key, always verbose --> 
          <arg line="-verbose -digestalg SHA1 -sigalg MD5withRSA" /> 
          <arg line="-keystore @{keystore} -storepass @{storepass} -keypass @{keypass}" /> 
          <arg line="-signedjar &quot;@{signedjar}&quot;" /> 
          <arg line="&quot;@{jar}&quot; @{alias}" /> 
         </exec> 
        </sequential> 
    </macrodef> 
    
  2. Thay 'signjar' để 'signjarjdk7' trong 'release' mục tiêu trong build.xml cùng.

Chú ý: Bạn phải xác định 'key.store.password''key.alias.password' propeties cho dự án của bạn (trong project.properties hoặc trong local.properties).

UPDATE 1:

Nếu bạn đã cài đặt 1.8.3 Ant (hoặc mới hơn) bạn có một giải pháp tốt hơn:

Mở ANDROID_SDK \ tools của bạn \ ant \ build.xml và thêm hai mới thông số - sigalg và digestalg - trong 'signjar' gọi ban đầu:

<signjar 
    sigalg="MD5withRSA" 
    digestalg="SHA1" 
    jar="${out.packaged.file}" 
    signedjar="${out.unaligned.file}" 
    keystore="${key.store}" 
    storepass="${key.store.password}" 
    alias="${key.alias}" 
    keypass="${key.alias.password}" 
    verbose="${verbose}" /> 

UPDATE 2: dường như câu trả lời này không được chấp sau khi 's ignjar 'được thay thế thành' signapk 'trong phiên bản mới nhất của các công cụ SDK Android.

+0

Thuộc tính 'verbose' sẽ được tính đến như thế nào? Bây giờ cờ tiết luôn được đặt. –

+0

"tiết" chỉ cần thay thế dễ dàng mục tiêu 'signjar' ban đầu. – FeelGood

+0

Bạn có thể cung cấp thêm thông tin cho giải pháp 1.8.3+ của mình không. Các biến đó là gì? Tôi lấy giá trị từ đâu? – Guy

9

nghe có vẻ như bạn có thể sử dụng JDK 7 (1.7.0) vì vậy hãy thử thêm các tùy chọn này khi ký hợp đồng với jarsigner:

-digestalg SHA1 -sigalg MD5withRSA 
+0

Có, tôi đang sử dụng JDK 7 vì vậy tôi cố gắng lựa chọn của bạn và quá trình đăng ký đã hoàn thành một cách hoàn hảo. Cảm ơn bạn! Tôi cho rằng đối số này cũng tương thích với JDK 6, tôi có đúng không? – sgimeno

+0

Điều xấu là nhiệm vụ signjar trong ANT không hỗ trợ thuộc tính 'args' để chữ ký phải được thực hiện với một nhiệm vụ exec hoặc java mà ít gọn gàng hơn tôi nghĩ. – sgimeno

+0

Vâng, các đối số đó cũng có mặt trong JDK 6 Tôi nghĩ. –

2

Giải pháp lâu dài là để vá nhiệm vụ signjar Ant:

https://issues.apache.org/bugzilla/show_bug.cgi?id=52344

Các thuộc tính mới được thêm vào signjar trong Ant 1.8.3, nhưng Android của xây dựng kịch bản (như của R19) vẫn chưa được sửa đổi để sử dụng chúng:

http://code.google.com/p/android/issues/detail?id=19567

Trong khi đó, "presetdef" có thể cung cấp một cách giải quyết:

<presetdef name="signjar"> 
    <signjar sigalg="MD5withRSA" digestalg="SHA1" /> 
</presetdef> 
+1

Xin lỗi vì nhận xét trùng lặp. Cố gắng tăng tỷ lệ trả lời của tôi. Điều này tất cả đều rất khó hiểu với tôi bởi vì tại http://developer.android.com/tools/publishing/app-signing.html#signapp họ nói để sử dụng '-sigalg SHA1withRSA -digestalg SHA1'. Tại sao chúng ta sử dụng MD5withRSA? –

+0

Workaround -sigalg = MD5withRSA đã chỉ định mặc định RSA cho jarsigner trong Java 6. Mặc định này được thay đổi thành SHA256withRSA trong Java 7, tuy nhiên, điều này không được hỗ trợ trên Android. SHA1withRSA là một tùy chọn an toàn hơn (rõ ràng) được hỗ trợ trên Android, và do đó là thích hợp hơn. –

0

Nếu bạn đang bị mắc kẹt (như tôi) với một phiên bản của Ant cũ hơn 1.8.3 và Java 7, đây là một cách giải quyết:

<exec executable="${java.bin.path}/jarsigner"> 
    <arg value="-signedjar"/> 
    <arg value="signed-${app.apk.name}"/> 
    <arg value="-keystore"/> 
    <arg value="my.keystore"/> 
    <arg value="-storepass"/> 
    <arg value="passwd"/> 
    <arg value="-sigalg"/> 
    <arg value="MD5withRSA"/> 
    <arg value="-digestalg"/> 
    <arg value="SHA1"/> 
    <arg value="${app.apk.name}"/> 
    <arg value="my_keystore"/> 
</exec> 

<!-- Where old version was: --> 

<signjar 
    alias="my_keystore" keystore="my.keystore" 
    storepass="passwd" 
    preservelastmodified="true" 
    signedjar="signed-${app.apk.name}"> 
    <path> 
    <fileset dir="." includes="${app.apk.name}" /> 
    </path> 
</signjar> 
6

mỗi Android developer documentation, bạn nên đặt những khách sạn thuộc t ông ant.properties file:

$ cat ant.properties 
key.store=C:\\Users\\a512091\\.android\\release.keystore 
key.alias=application 
key.store.password=android 
key.alias.password=android 
1

Sử dụng Ubuntu 14.04 (Trusty dê núi sừng ngắn) và Windows, tạo ra một “.keystore” tập tin.

Tệp này cần phải được tạo, có thể được thực hiện bằng lệnh keytool đi kèm với Java. Nó thường có thể được tìm thấy tại 'C: \ Program Files \ Java \ jre7 \ bin'. Mà cũng phải được thêm vào biến PATH của bạn.

Go vào thư mục gốc của dự án của bạn và sử dụng lệnh này:

Tạo một file .keystore:

$ keytool -genkey -v -keystore key-name.keystore -alias alias-name -keyalg RSA -keysize 2048 -validity 10000 

Tạo một tập tin gọi ant.properties trong thư mục “nền tảng/android /” ant.properties.

key.store=D:\\path\\to\\the\\project\\keyname.keystore 
key.alias=alias-name 

Tạo file build APK:

$ cordova build android --release 
Các vấn đề liên quan