How to create a signed APK file using Cordova command line interface?

This is my first time working on Apache Cordova. I made a sample application named checkStatus. Now I want to create a signed APK file. So I can install it in different devices for my testing.

For this, I Googled and found this documentation.

  • Notification text is too long and is not showing full text
  • Activity.addContentView(View) == ViewGroup.addContentView(View)?
  • Custom Spinner Adapter
  • Serializing Android Bundle for network and/or persistent storage?
  • Android: Is there a way to implement the barcode scanner into an app?
  • Custom getFilter in custom ArrayAdapter in android
  • As per the document, I switched to my project directory and ran the following command:

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

    After I ran the above command, I got a file named key-name.keystore at projectRoot/key-name.keystore.

    And then I copy-pasted that file into projectRoot/platforms/android/key-name.keystore.

    After that, I created a file named ant.properties and saved it in projectRoot/platforms/android.

    I wrote the following code inside the file:

    key.store=projectRoot/key-name.keystore
    key.alias=myApp
    

    After that, I ran the following command to release

    Cordova builds android --release
    

    It’s throwing the following error:

     /home/projectRoot/platforms/android/cordova/node_modules/q/q.js:126
                    throw e;
                          ^
    Error code 1 for command: ant with args: release,-f,/home/projectRoot/platforms/android/build.xml,-Dout.dir=ant-build,-Dgen.absolute.dir=ant-gen
    
     Error: /home/projectRoot/platforms/android/cordova/build: Command failed with exit code 8
    at ChildProcess.whenDone (/usr/lib/node_modules/cordova/node_modules/cordova-lib/src/cordova/superspawn.js:135:23)
    at ChildProcess.EventEmitter.emit (events.js:98:17)
    at maybeClose (child_process.js:753:16)
    at Process.ChildProcess._handle.onexit (child_process.js:820:5)
    

    So this time, I modified key.store value in ant.properties file like in the following way.

     key.store=/home/projectRoot/platforms/android/key-name.keystore
    

    Again, I ran the cordova build android --release command. It throws the same error.

    Can anyone tell me what I’ve done wrong?

    Related posts:

    Creating an Android Lock Screen App.
    How to avoid 65k method limit while using Google Play Services
    Android - Contact from number with Country Code
    “Bitmap too large to be uploaded into a texture”
    how to use join query in CursorLoader when its constructor does not support it
    Testing SQLite database in Robolectric
  • Communicating directly between two mobile devices
  • Loaders and onLoaderReset Android
  • Google Map crashing with Resources$NotFoundException when replaced in FrameLayout
  • Can't find SDK folder inside Android studio path, and SDK manager not opening
  • stack traces stop before getting to my code (on Android using NDK)
  • Downloaded files not appearing in the Downloads App in android
  • 7 Solutions collect form web for “How to create a signed APK file using Cordova command line interface?”

    Step 1:

    D:\projects\Phonegap\Example> cordova plugin rm org.apache.cordova.console --save
    

    add the --save so that it removes the plugin from the config.xml file.

    Step 2:

    To generate a release build for Android, we first need to make a small change to the AndroidManifest.xml file found in platforms/android. Edit the file and change the line:

    <application android:debuggable="true" android:hardwareAccelerated="true" android:icon="@drawable/icon" android:label="@string/app_name">
    

    and change android:debuggable to false:

    <application android:debuggable="false" android:hardwareAccelerated="true" android:icon="@drawable/icon" android:label="@string/app_name">
    

    As of cordova 6.2.0 remove the android:debuggable tag completely. Here is the explanation from cordova:

    Explanation for issues of type “HardcodedDebugMode”:
    It’s best to leave out the android:debuggable attribute from the manifest.
    If you do, then the tools will automatically insert android:debuggable=true
    when building an APK to debug on an emulator or device. And when you
    perform a release build, such as Exporting APK, it will automatically set
    it to false.

    If on the other hand you specify a specific value in the manifest file,
    then the tools will always use it. This can lead to accidentally publishing
    your app with debug information.

    Step 3:

    Now we can tell cordova to generate our release build:

    D:\projects\Phonegap\Example> cordova build --release android
    

    Then, we can find our unsigned APK file in platforms/android/ant-build. In our example, the file was platforms/android/ant-build/Example-release-unsigned.apk

    Step 4:

    Note : We have our keystore keystoreNAME-mobileapps.keystore in this Git Repo, if you want to create another, please proceed with the following steps.

    Key Generation:

    Syntax:

    keytool -genkey -v -keystore <keystoreName>.keystore -alias <Keystore AliasName> -keyalg <Key algorithm> -keysize <Key size> -validity <Key Validity in Days>
    

    Egs:

    keytool -genkey -v -keystore NAME-mobileapps.keystore -alias NAMEmobileapps -keyalg RSA -keysize 2048 -validity 10000
    
    
    keystore password? : xxxxxxx
    What is your first and last name? :  xxxxxx
    What is the name of your organizational unit? :  xxxxxxxx
    What is the name of your organization? :  xxxxxxxxx
    What is the name of your City or Locality? :  xxxxxxx
    What is the name of your State or Province? :  xxxxx
    What is the two-letter country code for this unit? :  xxx
    

    Then the Key store has been generated with name as NAME-mobileapps.keystore

    Step 5:

    Place the generated keystore in

    old version cordova

    D:\projects\Phonegap\Example\platforms\android\ant-build
    

    New version cordova

    D:\projects\Phonegap\Example\platforms\android\build\outputs\apk
    

    To sign the unsigned APK, run the jarsigner tool which is also included in the JDK:

    Syntax:

    jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore <keystorename <Unsigned APK file> <Keystore Alias name>
    

    Egs:

    D:\projects\Phonegap\Example\platforms\android\ant-build> jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore NAME-mobileapps.keystore Example-release-unsigned.apk xxxxxmobileapps
    

    OR

    D:\projects\Phonegap\Example\platforms\android\build\outputs\apk> jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore NAME-mobileapps.keystore Example-release-unsigned.apk xxxxxmobileapps
    
    Enter KeyPhrase as 'xxxxxxxx'
    

    This signs the apk in place.

    Step 6:

    Finally, we need to run the zip align tool to optimize the APK:

    D:\projects\Phonegap\Example\platforms\android\ant-build> zipalign -v 4 Example-release-unsigned.apk Example.apk 
    

    OR

    D:\projects\Phonegap\Example\platforms\android\ant-build> C:\Phonegap\adt-bundle-windows-x86_64-20140624\sdk\build-tools\android-4.4W\zipalign -v 4 Example-release-unsigned.apk Example.apk
    

    OR

    D:\projects\Phonegap\Example\platforms\android\build\outputs\apk> C:\Phonegap\adt-bundle-windows-x86_64-20140624\sdk\build-tools\android-4.4W\zipalign -v 4 Example-release-unsigned.apk Example.apk
    

    Now we have our final release binary called example.apk and we can release this on the Google Play Store.

    An update to @malcubierre for Cordova 4 (and later)-

    Create a file called release-signing.properties and put in APPFOLDER\platforms\android folder

    Contents of the file: edit after = for all except 2nd line

    storeFile=C:/yourlocation/app.keystore
    storeType=jks
    keyAlias=aliasname
    keyPassword=aliaspass
    storePassword=password
    

    Then this command should build a release version:

    cordova build android --release
    

    In the current documentation we can specify a build.json with the keystore:

    {
         "android": {
             "debug": {
                 "keystore": "..\android.keystore",
                 "storePassword": "android",
                 "alias": "mykey1",
                 "password" : "password",
                 "keystoreType": ""
             },
             "release": {
                 "keystore": "..\android.keystore",
                 "storePassword": "",
                 "alias": "mykey2",
                 "password" : "password",
                 "keystoreType": ""
             }
         }
     }
    

    And then, execute the commando with –buildConfig argumente, this way:

    cordova run android --buildConfig
    

    Step1:

    Go to cordova\platforms\android ant create a fille called ant.properties file with the keystore file info (this keystore can be generated from your favorite Android SDK, studio…):

    key.store=C:\\yourpath\\Yourkeystore.keystore
    key.alias=youralias
    

    Step2:

    Go to cordova path and execute:

    cordova build android --release
    

    Note: You will be prompted asking your keystore and key password

    An YourApp-release.apk will appear in \cordova\platforms\android\ant-build

    In cordova 6.2.0, it has an easy way to create release build. refer to other steps here Steps 1, 2 and 4

    cd cordova/ #change to root cordova folder
    platforms/android/cordova/clean #clean if you want
    cordova build android --release -- --keystore="/path/to/keystore" --storePassword=password --alias=alias_name #password will be prompted if you have any
    

    On Mac (osx), I generated two .sh files, one for the first publication and another one for updating :

    #!/bin/sh
    echo "Ionic to Signed APK ---- b@agencys.eu // Benjamin Rathelot\n"
    printf "Project dir : "
    read DIR
    printf "Project key alias : "
    read ALIAS
    cd $DIR/
    cordova build --release android
    cd platforms/android/build/outputs/apk/
    keytool -genkey -v -keystore my-release-key.keystore -alias $ALIAS -keyalg RSA -keysize 2048 -validity 10000
    jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore android-release-unsigned.apk $ALIAS
    zipalign -v 4 android-release-unsigned.apk signedApk.apk
    

    And to update your app:

    #!/bin/sh
    echo "Ionic to Signed APK ---- b@agencys.eu // Benjamin Rathelot\n"
    printf "Project dir : "
    read DIR
    printf "Project key alias : "
    read ALIAS
    cd $DIR/
    cordova build --release android
    cd platforms/android/build/outputs/apk/
    rm signedApk.apk
    jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore android-release-unsigned.apk $ALIAS
    zipalign -v 4 android-release-unsigned.apk signedApk.apk
    

    Assuming you’re in your home folder or a folder topping your apps folders. Make sure to set correctly chmod to use this script. Then :

    ./ionicToApk.sh # or whatever depending of the name of your file, in CLI
    

    Your signed apk will be in Your App folder/platforms/android/build/outputs/apk/ as SignedApk.apk
    Make sure to use the correct key alias and password defined with the first script

    First Check your version code and version name if you are updating your app. And make sure you have a previous keystore.

    If you are updating app then follow step 1,3,4.

    Step 1:

    Goto your cordova project for generate our release build:

    D:\projects\Phonegap\Example> cordova build --release android
    

    Then, we can find our unsigned APK file in platforms/android/ant-build. In our example, the file was

    if u used ant-build

    yourproject/platforms/android/ant-build/Example-release-unsigned.apk
    

    OR

    if u used gradle-build

    yourProject/platforms/android/build/outputs/apk/Example-release-unsigned.apk
    

    Step 2:

    Key Generation:

    Syntax:

    keytool -genkey -v -keystore <keystoreName>.keystore -alias <Keystore AliasName> -keyalg <Key algorithm> -keysize <Key size> -validity <Key Validity in Days>
    

    if keytool command not recognize do this step

    Check that the directory the keytool executable is in is on your path. (For example, on my Windows 7 machine, it’s in C:\Program Files (x86)\Java\jre6\bin.)

    Example:

    keytool -genkey -v -keystore NAME-mobileapps.keystore -alias NAMEmobileapps -keyalg RSA -keysize 2048 -validity 10000
    
    
    keystore password? : xxxxxxx
    What is your first and last name? :  xxxxxx
    What is the name of your organizational unit? :  xxxxxxxx
    What is the name of your organization? :  xxxxxxxxx
    What is the name of your City or Locality? :  xxxxxxx
    What is the name of your State or Province? :  xxxxx
    What is the two-letter country code for this unit? :  xxx
    

    Then the Key store has been generated with name as NAME-mobileapps.keystore

    Step 3:

    Place the generated keystore in
    D:\projects\Phonegap\Example\platforms\android\ant-build

    To sign the unsigned APK, run the jarsigner tool which is also included in the JDK:

    Syntax:

    jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore <keystorename <Unsigned APK file> <Keystore Alias name>
    

    If it doesn’t reconize do these steps

    (1) Right click on “This PC” > right-click Properties > Advanced system settings > Environment Variables > select PATH then EDIT.

    (2) Add your jdk bin folder path to environment variables, it should look like this:

    “C:\Program Files\Java\jdk1.8.0_40\bin”.

    Example:

    D:\projects\Phonegap\Example\platforms\android\ant-build> jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore NAME-mobileapps.keystore Example-release-unsigned.apk xxxxxmobileapps
    
    Enter KeyPhrase as 'xxxxxxxx'
    

    This signs the apk in place.

    Step 4:

    Finally, we need to run the zip align tool to optimize the APK:

    if zipalign not recognize then

    (1) goto your android sdk path and find zipalign it is usually in android-sdk\build-tools\23.0.3

    (2) Copy zipalign file paste into your generate release apk folder usually in below path

    yourproject/platforms/android/ant-build/Example-release-unsigned.apk

    D:\projects\Phonegap\Example\platforms\android\ant-build> zipalign -v 4 Example-release-unsigned.apk Example.apk 
    

    OR

    D:\projects\Phonegap\Example\platforms\android\ant-build> C:\Phonegap\adt-bundle-windows-x86_64-20140624\sdk\build-tools\android-4.4W\zipalign -v 4 Example-release-unsigned.apk Example.apk
    

    Now we have our final release binary called example.apk and we can release this on the Google Play Store.

    Android Babe is a Google Android Fan, All about Android Phones, Android Wear, Android Dev and Android Games Apps and so on.