| module Fastlane |
| module Actions |
| module SharedValues |
| SIGNED_APK_PATH = :SIGNED_APK_PATH |
| end |
| |
| class SignApkAction < Action |
| def self.run(params) |
| |
| UI.user_error!("Couldn't find '*release-unsigned.apk' file at path 'app/build/outputs/apk/'") unless params[:apk_path] |
| |
| UI.user_error!("Need keystore in order to sign apk") unless params[:keystore_path] |
| |
| sign_cmd = ["jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1"] |
| sign_cmd << ["-keystore #{params[:keystore_path]}" ] if params[:keystore_path] |
| sign_cmd << ["#{params[:apk_path]}"] if params[:apk_path] |
| sign_cmd << ["#{params[:alias]}"] if params[:alias] |
| sign_cmd << ["-keypass #{params[:keypass] ? params[:keypass] : params[:storepass]}"] if params[:keypass] || params[:storepass] |
| sign_cmd << ["-storepass #{params[:storepass]}"] if params[:storepass] |
| sign_cmd << ["-tsa #{params[:tsa]}"] if params[:tsa] |
| |
| if params[:signed_apk_path] |
| sign_cmd << ["-signedjar #{params[:signed_apk_path]}" ] |
| Actions.lane_context[SharedValues::SIGNED_APK_PATH] = "#{params[:signed_apk_path]}" |
| elsif params[:apk_path].include?("unsigned") |
| sign_cmd << ["-signedjar #{params[:apk_path].gsub('-unsigned', '')}"] |
| Actions.lane_context[SharedValues::SIGNED_APK_PATH] = "#{params[:apk_path].gsub('-unsigned', '')}" |
| end |
| |
| Fastlane::Actions.sh(sign_cmd, log: true) |
| end |
| |
| ##################################################### |
| # @!group Documentation |
| ##################################################### |
| |
| def self.description |
| "Sign a Android apk with a java keystore" |
| end |
| |
| def self.available_options |
| |
| apk_path_default = Dir["*.apk"].last || Dir[File.join("app", "build", "outputs", "apk", "*release-unsigned.apk")].last |
| |
| [ |
| FastlaneCore::ConfigItem.new(key: :apk_path, |
| env_name: "apk_path", |
| description: "Path to your APK file that you want to sign", |
| default_value: Actions.lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH] || apk_path_default, |
| optional: true), |
| FastlaneCore::ConfigItem.new(key: :signed_apk_path, |
| env_name: "SIGNED_APK_PATH", |
| description: "Path to the signed APK file", |
| optional: true, |
| is_string: true), |
| FastlaneCore::ConfigItem.new(key: :keystore_path, |
| env_name: "KEYSTORE_PATH", |
| description: "Path to java keystore", |
| optional: true), |
| FastlaneCore::ConfigItem.new(key: :alias, |
| env_name: "ALIAS", |
| description: "The alias of the certificate in the keystore to use to sign the apk", |
| is_string: true), |
| FastlaneCore::ConfigItem.new(key: :keypass, |
| env_name: "KEY_PASS", |
| description: "The password used to protect the private key of the keystore entry addressed by the alias specified. If not specified storepass will be used", |
| optional:true, |
| is_string: true), |
| FastlaneCore::ConfigItem.new(key: :storepass, |
| env_name: "STORE_PASS", |
| description: "The password which is required to access the keystore", |
| is_string: true), |
| FastlaneCore::ConfigItem.new(key: :tsa, |
| env_name: "TIME_STAMPING_AUTHORITHY", |
| description: "The url of the Time Stamping Authority (TSA) used to timestamp the apk signing", |
| optional:true, |
| is_string: true) |
| ] |
| end |
| |
| def self.output |
| ['SIGN_APK_PATH', 'Path to your APK file'] |
| end |
| |
| def self.authors |
| "nomisRev" |
| end |
| |
| def self.is_supported?(platform) |
| platform == :android |
| end |
| end |
| end |
| end |