Android SDK बिल्ड टूल के अपडेट 24.0.3 या उसके बाद वाले अपडेट में उपलब्ध apksigner टूल का इस्तेमाल करके, APK पर हस्ताक्षर किए जा सकते हैं. साथ ही, यह पुष्टि की जा सकती है कि किसी APK के हस्ताक्षर की पुष्टि, Android प्लैटफ़ॉर्म के उन सभी वर्शन पर ठीक तरह से हो जाए जिन पर वह APK काम करता है.
इस पेज पर, टूल को इस्तेमाल करने के बारे में एक छोटी गाइड दी गई है. साथ ही, यह टूल के साथ काम करने वाले अलग-अलग कमांड-लाइन विकल्पों के लिए एक रेफ़रंस के तौर पर काम करता है. आपके APK पर साइन करने के लिए, apksigner टूल का इस्तेमाल कैसे किया जाता है, इस बारे में ज़्यादा जानकारी के लिए अपने ऐप्लिकेशन पर साइन करना लेख पढ़ें.
चेतावनी: अगर आपने apksigner का इस्तेमाल करके अपने APK पर हस्ताक्षर किया है और APK में और बदलाव किए हैं, तो APK का हस्ताक्षर अमान्य हो जाता है.
अगर आपको अपने APK को अलाइन करने के लिए zipalign का इस्तेमाल करना है, तो APK पर साइन करने से पहले इसका इस्तेमाल करें.
इस्तेमाल
किसी APK पर साइन करना
apksigner टूल का इस्तेमाल करके, किसी APK पर साइन करने का सिंटैक्स यहां दिया गया है:
apksigner sign --ks keystore.jks | --key key.pk8 --cert cert.x509.pem [signer_options] app-name.apk
apksigner टूल का इस्तेमाल करके किसी APK पर हस्ताक्षर करते समय, आपको हस्ताक्षर करने वाले व्यक्ति का निजी पासकोड और सर्टिफ़िकेट देना होगा. इस जानकारी को इन दो तरीकों से शामिल किया जा सकता है:
-
--ksविकल्प का इस्तेमाल करके, KeyStore फ़ाइल तय करें. -
--keyऔर--certविकल्पों का इस्तेमाल करके, निजी कुंजी फ़ाइल और सर्टिफ़िकेट फ़ाइल अलग-अलग बताएं. निजी पासकोड वाली फ़ाइल PKCS #8 फ़ॉर्मैट में होनी चाहिए. साथ ही, सर्टिफ़िकेट वाली फ़ाइल X.509 फ़ॉर्मैट में होनी चाहिए.
आम तौर पर, किसी APK को सिर्फ़ एक हस्ताक्षरकर्ता से साइन किया जाता है. अगर आपको एक से ज़्यादा हस्ताक्षर करने वालों के ज़रिए किसी APK पर हस्ताक्षर करना है, तो --next-signer विकल्प का इस्तेमाल करें. इससे, सामान्य विकल्पों के सेट को अलग किया जा सकेगा, ताकि हर हस्ताक्षर करने वाले पर लागू किया जा सके:
apksigner sign [signer_1_options] --next-signer [signer_2_options] app-name.apk
किसी APK के हस्ताक्षर की पुष्टि करना
जिन प्लैटफ़ॉर्म पर APK के हस्ताक्षर की पुष्टि की जा सकती है उन पर पुष्टि की प्रक्रिया पूरी होने की पुष्टि करने का सिंटैक्स यहां दिया गया है:
apksigner verify [options] app-name.apk
साइनिंग पासकोड बदलना
हस्ताक्षर करने वाले सर्टिफ़िकेट के लीनेज या हस्ताक्षर के नए क्रम को रोटेट करने का सिंटैक्स यहां दिया गया है:
$ apksigner rotate --in /path/to/existing/lineage \ --out /path/to/new/file \ --old-signer --ks old-signer-jks \ --new-signer --ks new-signer-jks
विकल्प
यहां दी गई सूचियों में, हर कमांड के लिए विकल्पों का सेट शामिल है. ये विकल्प, apksigner टूल के साथ काम करते हैं.
हस्ताक्षर करने का निर्देश
apksigner साइन कमांड के लिए, ये विकल्प उपलब्ध हैं.
सामान्य विकल्प
इन विकल्पों में, हस्ताक्षर करने वाले व्यक्ति पर लागू होने वाली बुनियादी सेटिंग के बारे में बताया गया है:
--out <apk-filename>- वह जगह जहां आपको साइन किया गया APK सेव करना है. अगर यह विकल्प साफ़ तौर पर नहीं दिया गया है, तो APK पैकेज पर उसी जगह हस्ताक्षर किया जाता है. इससे इनपुट APK फ़ाइल बदल जाती है.
--min-sdk-version <integer>-
यह Android फ़्रेमवर्क एपीआई का सबसे कम लेवल है.
apksignerइसका इस्तेमाल यह पुष्टि करने के लिए करता है कि APK के हस्ताक्षर की पुष्टि की जाएगी. ज़्यादा वैल्यू सेट करने पर, टूल को ऐप्लिकेशन साइन करते समय सुरक्षा से जुड़े बेहतर पैरामीटर इस्तेमाल करने की अनुमति मिलती है. हालांकि, इससे APK की उपलब्धता उन डिवाइसों तक सीमित हो जाती है जिन पर Android के नए वर्शन चल रहे हैं. डिफ़ॉल्ट रूप से,apksigner, ऐप्लिकेशन की मेनिफ़ेस्ट फ़ाइल सेminSdkVersionएट्रिब्यूट की वैल्यू का इस्तेमाल करता है. --max-sdk-version <integer>-
यह Android फ़्रेमवर्क का सबसे नया एपीआई लेवल है.
apksignerइसका इस्तेमाल यह पुष्टि करने के लिए करता है कि APK के हस्ताक्षर की पुष्टि हो जाएगी. डिफ़ॉल्ट रूप से, यह टूल सबसे नए एपीआई लेवल का इस्तेमाल करता है. --rotation-min-sdk-version <integer>- यह एपीआई का सबसे कम लेवल है. APK के हस्ताक्षर जनरेट करने के लिए, APK की रोटेट की गई साइनिंग कुंजी को इसका इस्तेमाल करना चाहिए. APK के लिए, ओरिजनल (रोटेट नहीं की गई) साइनिंग कुंजी का इस्तेमाल, प्लैटफ़ॉर्म के सभी पिछले वर्शन के लिए किया जाएगा. डिफ़ॉल्ट रूप से, रोटेट की गई साइनिंग कुंजियों का इस्तेमाल v3.1 साइनिंग ब्लॉक के साथ किया जाता है. ये कुंजियां, Android 13 (एपीआई लेवल 33) या इसके बाद के वर्शन वाले डिवाइसों पर काम करती हैं.
--v1-signing-enabled <true | false>-
इससे यह तय होता है कि
apksigner, दिए गए APK पैकेज पर JAR पर आधारित पारंपरिक साइनिंग स्कीम का इस्तेमाल करके हस्ताक्षर करता है या नहीं. डिफ़ॉल्ट रूप से, यह टूल--min-sdk-versionऔर--max-sdk-versionकी वैल्यू का इस्तेमाल करता है. इससे यह तय किया जाता है कि इस सिग्नेचर स्कीम को कब लागू करना है. --v2-signing-enabled <true | false>-
इससे यह तय होता है कि
apksignerदिए गए APK पैकेज पर APK सिग्नेचर स्कीम v2 का इस्तेमाल करके साइन करता है या नहीं. डिफ़ॉल्ट रूप से, यह टूल--min-sdk-versionऔर--max-sdk-versionकी वैल्यू का इस्तेमाल करके यह तय करता है कि इस सिग्नेचर स्कीम को कब लागू करना है. --v3-signing-enabled <true | false>-
इससे यह तय होता है कि
apksignerदिए गए APK पैकेज को APK सिग्नेचर स्कीम v3 का इस्तेमाल करके साइन करता है या नहीं. डिफ़ॉल्ट रूप से, यह टूल--min-sdk-versionऔर--max-sdk-versionकी वैल्यू का इस्तेमाल करके यह तय करता है कि इस सिग्नेचर स्कीम को कब लागू करना है. --v4-signing-enabled <true | false | only>-
इससे यह तय होता है कि
apksigner, दिए गए APK पैकेज को APK सिग्नेचर स्कीम v4 का इस्तेमाल करके साइन करता है या नहीं. इस स्कीम के तहत, हस्ताक्षर को अलग फ़ाइल (apk-name.apk.idsig) में सेव किया जाता है. अगरtrueऔर APK पर हस्ताक्षर नहीं किया गया है, तो--min-sdk-versionऔर--max-sdk-versionकी वैल्यू के आधार पर, v2 या v3 हस्ताक्षर जनरेट किया जाता है. इसके बाद, यह कमांड साइन किए गए APK के कॉन्टेंट के आधार पर.idsigफ़ाइल जनरेट करती है.सिर्फ़ v4 सिग्नेचर जनरेट करने के लिए
onlyका इस्तेमाल करें. इससे APK और इसमें मौजूद किसी भी सिग्नेचर में कोई बदलाव नहीं होगा. अगर APK में पहले से v2 या v3 सिग्नेचर मौजूद नहीं है या सिग्नेचर में इस्तेमाल की गई कुंजी, मौजूदा इनवोकेशन के लिए दी गई कुंजी से अलग है, तोonlyफ़ेल हो जाता है.डिफ़ॉल्ट रूप से, यह टूल
--min-sdk-versionऔर--max-sdk-versionकी वैल्यू का इस्तेमाल करके यह तय करता है कि इस सिग्नेचर स्कीम को कब लागू करना है. -v,--verbose- ज़्यादा जानकारी वाले आउटपुट मोड का इस्तेमाल करें.
ध्यान दें: अगर आपके ऐप्लिकेशन को Android 12L (एपीआई लेवल 32) या इससे पहले के वर्शन पर काम करने वाले डिवाइस पर, रोटेट की गई साइनिंग कुंजी से साइन किया गया है, तो आपको Android 9 (एपीआई लेवल 28) के लिए, रोटेट की गई साइनिंग कुंजी से अपने ऐप्लिकेशन को साइन करने के लिए, --rotation-min-sdk-version 28 का इस्तेमाल करना होगा.
हर हस्ताक्षरकर्ता के लिए विकल्प
इन विकल्पों से, किसी खास हस्ताक्षरकर्ता के कॉन्फ़िगरेशन के बारे में पता चलता है. अगर आपने अपने ऐप्लिकेशन पर सिर्फ़ एक हस्ताक्षरकर्ता का इस्तेमाल करके हस्ताक्षर किया है, तो इन विकल्पों की ज़रूरत नहीं है.
--next-signer <signer-options>- इसका इस्तेमाल, हर हस्ताक्षर करने वाले व्यक्ति के लिए अलग-अलग सामान्य विकल्प तय करने के लिए किया जाता है.
--v1-signer-name <basename>-
यह उन फ़ाइलों का बेस नेम है जिनसे मौजूदा हस्ताक्षरकर्ता के लिए JAR पर आधारित हस्ताक्षर बनता है. डिफ़ॉल्ट रूप से,
apksignerइस हस्ताक्षर करने वाले व्यक्ति के लिए, KeyStore के मुख्य नाम या कुंजी फ़ाइल के बेसनेम का इस्तेमाल करता है.
कुंजी और सर्टिफ़िकेट के विकल्प
यहां दिए गए विकल्पों में, हस्ताक्षर करने वाले व्यक्ति की निजी कुंजी और सर्टिफ़िकेट के बारे में बताया गया है:
--ks <filename>-
हस्ताक्षर करने वाले की निजी कुंजी और सर्टिफ़िकेट चेन, दी गई
Java पर आधारित KeyStore फ़ाइल में मौजूद होती है. अगर फ़ाइल का नाम
"NONE"पर सेट है, तो कुंजी और सर्टिफ़िकेट वाले KeyStore को किसी फ़ाइल की ज़रूरत नहीं होती. ऐसा कुछ पीकेसीएस #11 KeyStore के लिए होता है. --ks-key-alias <alias>- यह उस एलियास का नाम है जो KeyStore में हस्ताक्षर करने वाले व्यक्ति की निजी कुंजी और सर्टिफ़िकेट डेटा को दिखाता है. अगर हस्ताक्षर करने वाले व्यक्ति से जुड़े KeyStore में एक से ज़्यादा कुंजियां हैं, तो आपको यह विकल्प चुनना होगा.
--ks-pass <input-format>-
उस KeyStore का पासवर्ड जिसमें हस्ताक्षर करने वाले की निजी कुंजी और सर्टिफ़िकेट शामिल है. KeyStore खोलने के लिए, आपको पासवर्ड देना होगा.
apksignerटूल इन फ़ॉर्मैट के साथ काम करता है:-
pass:<password>– पासवर्ड,apksigner signकमांड के साथ इनलाइन दिया गया है. -
env:<name>– पासवर्ड, दिए गए एनवायरमेंट वैरिएबल में सेव किया जाता है. -
file:<filename>– पासवर्ड को दी गई फ़ाइल में एक लाइन के तौर पर सेव किया जाता है. -
stdin– पासवर्ड को स्टैंडर्ड इनपुट स्ट्रीम में एक लाइन के तौर पर दिया जाता है. यह--ks-passका डिफ़ॉल्ट तरीका है.
ध्यान दें: अगर आपको एक ही फ़ाइल में कई पासवर्ड शामिल करने हैं, तो उन्हें अलग-अलग लाइनों में डालें.
apksignerटूल, APK पर हस्ताक्षर करने वालों के साथ पासवर्ड जोड़ता है. यह काम, हस्ताक्षर करने वालों के क्रम के आधार पर किया जाता है. अगर आपने हस्ताक्षर करने वाले व्यक्ति के लिए दो पासवर्ड दिए हैं, तोapksignerपहले पासवर्ड को KeyStore पासवर्ड और दूसरे को कुंजी पासवर्ड के तौर पर इस्तेमाल करता है. -
--pass-encoding <charset>-
इसमें तय की गई वर्ण एन्कोडिंग शामिल होती हैं. जैसे, गैर-ASCII वर्णों वाले पासवर्ड को मैनेज करने की कोशिश करते समय
ibm437याutf-8.Keytool, अक्सर कीस्टोर को एन्क्रिप्ट (सुरक्षित) करता है. इसके लिए, वह कंसोल के डिफ़ॉल्ट वर्णसेट का इस्तेमाल करके पासवर्ड को बदलता है. डिफ़ॉल्ट रूप से,
apksignerपासवर्ड के कई फ़ॉर्म का इस्तेमाल करके डिक्रिप्ट करने की कोशिश करता है:- यूनिकोड फ़ॉर्म
- यह फ़ॉर्म, JVM के डिफ़ॉल्ट वर्णसेट का इस्तेमाल करके एन्कोड किया गया है
- Java 8 और इससे पुराने वर्शन पर, फ़ॉर्म को कंसोल के डिफ़ॉल्ट वर्णसेट का इस्तेमाल करके कोड में बदला जाता है
Java 9 पर,
apksignerकंसोल के वर्णसेट का पता नहीं लगा सकता. गैर-ASCII पासवर्ड का इस्तेमाल करने पर, आपको--pass-encodingकी जानकारी देनी पड़ सकती है. आपको इस विकल्प को उन KeyStore के साथ भी इस्तेमाल करना पड़ सकता है जिन्हें keytool ने किसी दूसरे ओएस या किसी दूसरी स्थान-भाषा में बनाया है. --key-pass <input-format>-
हस्ताक्षर करने वाले व्यक्ति की निजी कुंजी का पासवर्ड. इसकी ज़रूरत तब पड़ती है, जब निजी कुंजी पासवर्ड से सुरक्षित हो.
apksignerटूल इन फ़ॉर्मैट के साथ काम करता है:-
pass:<password>– पासवर्ड कोapksigner signकमांड के साथ इनलाइन दिया जाता है. -
env:<name>– पासवर्ड, दिए गए एनवायरमेंट वैरिएबल में सेव किया जाता है. -
file:<filename>– पासवर्ड को दी गई फ़ाइल में एक लाइन के तौर पर सेव किया जाता है. -
stdin– पासवर्ड को स्टैंडर्ड इनपुट स्ट्रीम में एक लाइन के तौर पर दिया जाता है. यह--key-passका डिफ़ॉल्ट तरीका है.
-
--ks-type <algorithm>-
यह KeyStore से जुड़ा टाइप या एल्गोरिदम है. इसमें हस्ताक्षर करने वाले व्यक्ति की निजी कुंजी और सर्टिफ़िकेट शामिल होता है. डिफ़ॉल्ट रूप से,
apksigner, Security properties फ़ाइल मेंkeystore.typeकॉन्स्टेंट के तौर पर तय किए गए टाइप का इस्तेमाल करता है. --ks-provider-name <name>-
हस्ताक्षर करने वाले के KeyStore को लागू करने का अनुरोध करते समय, इस्तेमाल किए जाने वाले JCA Provider का नाम. डिफ़ॉल्ट रूप से,
apksignerसबसे ज़्यादा प्राथमिकता वाले प्रोवाइडर का इस्तेमाल करता है. --ks-provider-class <class-name>-
यह JCA Provider की पूरी तरह क्वालिफ़ाइड क्लास का नाम है. इसका इस्तेमाल, हस्ताक्षर करने वाले के KeyStore implementation का अनुरोध करते समय किया जाता है. यह विकल्प
--ks-provider-nameके लिए एक विकल्प के तौर पर काम करता है. डिफ़ॉल्ट रूप से,apksigner,--ks-provider-nameविकल्प के साथ तय किए गए प्रोवाइडर का इस्तेमाल करता है. --ks-provider-arg <value>-
यह एक स्ट्रिंग वैल्यू है. इसे JCA Provider क्लास के कंस्ट्रक्टर के लिए आर्ग्युमेंट के तौर पर पास किया जाता है. इस क्लास को
--ks-provider-classविकल्प के साथ तय किया जाता है. डिफ़ॉल्ट रूप से,apksignerक्लास के ज़ीरो-आर्ग्युमेंट कंस्ट्रक्टर का इस्तेमाल करता है. --key <filename>-
यह उस फ़ाइल का नाम है जिसमें हस्ताक्षर करने वाले की निजी कुंजी मौजूद है. इस फ़ाइल में PKCS #8 DER फ़ॉर्मैट का इस्तेमाल किया जाना चाहिए. अगर कुंजी को पासवर्ड से सुरक्षित किया गया है, तो
apksignerस्टैंडर्ड इनपुट का इस्तेमाल करके पासवर्ड डालने के लिए कहता है. हालांकि,--key-passविकल्प का इस्तेमाल करके, किसी दूसरे तरह के इनपुट फ़ॉर्मैट के बारे में बताया जा सकता है. --cert <filename>- उस फ़ाइल का नाम जिसमें हस्ताक्षर करने वाले व्यक्ति के सर्टिफ़िकेट की चेन मौजूद है. यह फ़ाइल, X.509 PEM या DER फ़ॉर्मैट में होनी चाहिए.
निर्देश की पुष्टि करना
apksigner verify कमांड के साथ ये विकल्प इस्तेमाल किए जा सकते हैं.
--print-certs- इससे APK पर साइन करने के लिए इस्तेमाल किए गए सर्टिफ़िकेट की जानकारी दिखती है.
--print-certs-pem- Show information about the APK's signing certificates and print the PEM encoding of each signing certificate to stdout.
--min-sdk-version <integer>-
यह Android फ़्रेमवर्क एपीआई का सबसे कम लेवल है.
apksignerइसका इस्तेमाल यह पुष्टि करने के लिए करता है कि APK के हस्ताक्षर की पुष्टि की जाएगी. ज़्यादा वैल्यू सेट करने पर, टूल को ऐप्लिकेशन साइन करते समय सुरक्षा से जुड़े बेहतर पैरामीटर इस्तेमाल करने की अनुमति मिलती है. हालांकि, इससे APK की उपलब्धता उन डिवाइसों तक सीमित हो जाती है जिन पर Android के नए वर्शन चल रहे हैं. डिफ़ॉल्ट रूप से,apksigner, ऐप्लिकेशन की मेनिफ़ेस्ट फ़ाइल सेminSdkVersionएट्रिब्यूट की वैल्यू का इस्तेमाल करता है. --max-sdk-version <integer>-
यह Android फ़्रेमवर्क का सबसे नया एपीआई लेवल है.
apksignerइसका इस्तेमाल यह पुष्टि करने के लिए करता है कि APK के हस्ताक्षर की पुष्टि हो जाएगी. डिफ़ॉल्ट रूप से, यह टूल सबसे नए एपीआई लेवल का इस्तेमाल करता है. -v,--verbose- ज़्यादा जानकारी वाले आउटपुट मोड का इस्तेमाल करें.
-Werr- चेतावनी को गड़बड़ी के तौर पर माना जाता है.
उदाहरण
यहां apksigner का इस्तेमाल करके बनाए गए कुछ उदाहरण दिए गए हैं.
किसी APK पर साइन करना
release.jks का इस्तेमाल करके किसी APK पर साइन करें. यह KeyStore में मौजूद एकमात्र पासकोड है:
$ apksigner sign --ks release.jks app.apk
अलग-अलग फ़ाइलों के तौर पर सेव किए गए निजी पासकोड और सर्टिफ़िकेट का इस्तेमाल करके, किसी APK पर हस्ताक्षर करें:
$ apksigner sign --key release.pk8 --cert release.x509.pem app.apk
दो कुंजियों का इस्तेमाल करके किसी APK पर साइन करना:
$ apksigner sign --ks first-release-key.jks --next-signer --ks second-release-key.jks app.apk
रोटेट की गई साइनिंग कुंजी और रोटेशन टारगेटिंग एसडीके वर्शन 28+ का इस्तेमाल करके, किसी APK पर हस्ताक्षर करें:
$ apksigner sign --ks release.jks --next-signer --ks release2.jks \ --lineage /path/to/signing/history/lineage app.apk \ --rotation-min-sdk-version 28
रोटेट की गई साइनिंग कुंजी और रोटेशन टारगेटिंग एसडीके वर्शन 33+ का इस्तेमाल करके, किसी APK पर हस्ताक्षर करें:
$ apksigner sign --ks release.jks --next-signer --ks release2.jks \ --lineage /path/to/signing/history/lineage app.apk
किसी APK के हस्ताक्षर की पुष्टि करना
देखें कि क्या APK के हस्ताक्षर की पुष्टि, Android के उन सभी प्लैटफ़ॉर्म पर मान्य के तौर पर होनी चाहिए जिन पर APK काम करता है:
$ apksigner verify app.apk
देखें कि क्या APK के हस्ताक्षर, Android 4.0.3 (एपीआई लेवल 15) और उसके बाद वाले वर्शन पर मान्य के तौर पर पुष्टि किए जाने चाहिए:
$ apksigner verify --min-sdk-version 15 app.apk
साइनिंग पासकोड बदलना
ऐसे साइनिंग सर्टिफ़िकेट लीनेज को चालू करें जो कुंजी बदलने की सुविधा के साथ काम करता हो:
$ apksigner rotate --out /path/to/new/file --old-signer \
--ks release.jks --new-signer --ks release2.jksसाइनिंग पासकोड को फिर से बदलें:
$ apksigner rotate --in /path/to/existing/lineage \ --out /path/to/new/file --old-signer --ks release2.jks \ --new-signer --ks release3.jks