当前位置:   article > 正文

Android StudioV3.2.1以上版本的两种模式及签名配置、apk打包混淆_android studio 混淆必须签名吗

android studio 混淆必须签名吗

我们使用Android Studio 运行我们的app,无非两种模式:debug和release模式。

debug模式

debug模式使用一个默认的debug.keystore进行签名。

这个默认签名(keystore)是不需要密码的,它的默认位置在C:\Users\<用户名>\.Android\debug.keystore,如果不存在Android studio会自动创建它。

例如我的debug.keystore就在C:\Users\Administrator\.android\debug.keystore。

 

release模式

在我们正式发布项目的时候是不能使用debug.keystore的。开发过程中我们也可以使用发布模式运行。可以通过如下设置:

BuildVariants-Build Variant-debug/release

如果项目需要细分开发dev和生产pro版本,每个版本中都包含debug和release模式,可以这么设置:

就细分成四种模式:

release模式需要配置签名才能运行,这时就需要一个keystore

如果没有就需要创建,已经创建过keystore请跳过此步骤

 

1.创建keystore,并生成我们的apk(打包)

 第一步: Build --->> Generate Signed APK

第二步:Create New···(已经创建过keystore选Choose existing···)

第三步:填写相关信息

设置keystore路径、密码,设置key:别名、密码、有效期,证书等

Key store path:存放路径

Key

  Alias:别名

  Validity(years):有效期(一般默认25年)

  Certificate:证书

    First and Last Name:姓名

    Organization Unit:组织单位

    Organization:组织

    City or Locality:城市或地区

    State or Province:州或省

    Country Code(XX):国家代码(XX),中国:86

 

第四步:输入key、keystore密码

第五步:选择发布app的路径,默认即可 选择release方式发布,V1必须勾选!!

OK,发布成功,可以到 刚才设置的目标文件夹下面找到发布的apk

 

那对一些人来说,这样也太麻烦了,每次都得输入相关信息,还得进行选择,那么有更简单快捷的方法吗?答案是有的。

我们可以在项目的app目录下的build.gradle中进行签名的配置。 

2.release模式配置keystore

Project structure-signing,输入已创建的keystore信息

使得签名生效需配置Build Types

点击OK即可,然后查看对应build.gradle的配置文件应该是这样的。当然了,你也可以通过直接在build.gradle里面写下面这段。

  1. signingConfigs {
  2. release {
  3. keyAlias 'androiddebugkey'
  4. keyPassword 'android'
  5. storeFile file('C:/Users/ssc/.android/debug.keystore')
  6. storePassword 'android'
  7. }
  8. }
  9. ·········
  10. buildTypes {
  11. release {
  12. //是否混淆
  13. minifyEnabled true
  14. //是否移除无用资源
  15. zipAlignEnabled true
  16. //混淆的配置文件
  17. proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
  18. signingConfig signingConfigs.release
  19. }
  20. }

上述的配置虽然配置简单,但是存在不安全性,假如你的项目是开源的,你把签名文件的配置密码之类的信息用明文写在build.gradle里面,那是不是很不安全呢?

可以将签名文件的配置密码之类的信息直接写在local.properties下,因为在Git版本控制的项目中,我们可以看到我们项目project模式根目录下有一个.gitignore的文件,里面的配置大概如下所示

我们可以看到/local.properties,意思就是说local.properties默认是不添加到版本控制里面的,因为local.properties存储的是我们环境资源的一些相关信息,如sdk的路径。故我们可以在local.properties下配置签名信息而不用担心密钥外泄。对于开源项目来说,是非常好的。

在local.properties下直接添加相关信息

在build.gradle里,为了不用明文显示,我们首先要获得key的相关配置,所以我们可以在app的build.gradle里

android {}之上新增代码
  1. def keystoreFilepath = ''
  2. def keystorePSW = ''
  3. def keystoreAlias = ''
  4. def keystoreAliasPSW = ''
  5. // default keystore file, PLZ config file path in local.properties
  6. def keyfile = file('s.keystore.temp')
  7. Properties properties = new Properties()
  8. // local.properties file in the root director
  9. properties.load(project.rootProject.file('local.properties').newDataInputStream())
  10. keystoreFilepath = properties.getProperty("keystore.path")
  11. if (keystoreFilepath) {
  12. keystorePSW = properties.getProperty("keystore.password")
  13. keystoreAlias = properties.getProperty("keystore.alias")
  14. keystoreAliasPSW = properties.getProperty("keystore.alias_password")
  15. keyfile = file(keystoreFilepath)
  16. }

app/build.gradle下的signingConfigs可以改为:

1

2

3

4

5

6

7

8

signingConfigs {

       release {

           keyAlias keystoreAlias

           keyPassword keystoreAliasPSW

           storeFile keyfile

           storePassword keystorePSW

       }

   }

  

设置后Signing中keystore值无需关心

相应的,buildTypes也可以配置成这样

  1. buildTypes {
  2. release {
  3. minifyEnabled false
  4. proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
  5. // signingConfig signingConfigs.release
  6. //签名文件存在,则签名
  7. if (keyfile.exists()) {
  8. println("WITH -> buildTypes -> release: using jks key")
  9. signingConfig signingConfigs.release
  10. } else {
  11. println("WITH -> buildTypes -> release: using default key")
  12. }
  13. 23       }
  14. }

到此,前面配置完成。

 部分内容转载自:http://www.cnblogs.com/details-666/p/keystore.html并进行更新。

附:查询keystore的相关信息,如查看sha1的值;可以在运行窗口,定位到keystore所在的路径,执行cd C:\Users\ssc\.android

执行这条语句后就能显示Key的所有信息(以android默认keystore为例)

keytool -list -v -keystore xxx.jks 

 

Android studio(windows平台上)更新到2.3版本以后,在没有充分了解它的新变化的情况下,使用的时候难免会遇到一些问题,比如gradle的问题可能是大家最常见的,不过解决的一般思路和之前(例如2.1更新到2.2之类的)没太大区别,本文要说不是gradle的问题,而是给apk正式签名后安装失败的问题。

附录:

签名打包遇到问题

1.

项目在正式上线之前一般都要有正式签名,也就是发布release版本的apk,而不再使用默认的debug版签名文件----debug.keystore。最常用的方式就是通过Android studio的工具栏里的Build-->Generate Signed APK...方式去签名。更多的步骤不再赘述,按照提示一步步的往下走就可以,相信大家都知道了。

这种方式签名后的apk就是发布版(release)的apk,android studio2.3之前是可以直接安装到设备上的,安装方式之一就是在docs命令行里用adb install <apk绝对路径>命令去安装到连接到PC上的Android设备。但是,Android studio2.3以后这种方式打包apk的话就有了些变化:

就如画圈的地方,2.3以前应该是没有的(印象中是没有,如果有的话是我记错了,见谅),多了这些选项的话不选择是无法继续下去的,选择的话,我当时看到V2和apk有关,V1和jar有关,在没有弄明白区别的时候果断选择V2的方式,然后点击了Finish.等了一会,apk打包好了,我用adb install命令安装这个apk的时候却遇到这样的问题:

对,就是说没有签名证书!但是我确实是签了名了啊,而且相应的.jks文件也是存在的。我通过手动编辑gradle文件进行签名的话再安装也是OK的。于是我clean,rebuild,新建项目,重启studio...各种方式都试了,然后通过这种方式签名打包后的apk仍然存在这个问题。于是只能上网找答案,然后就发现了问题确实是在上述画圈的地方:把V1单独勾选或者V1和V2都勾选的话,再打包就是OK的,也就是说只要勾选了V1就行,生成的apk就可以正常安装...晕。

2.升级完Android Studio2.3后,打包release出现的错误

Error:Execution failed for task ':qq:lintVitalRelease'.
> Lint found fatal errors while assembling a release target.
To proceed, either fix the issues identified by lint, or modify your build script as follows:
...
android {
    lintOptions {
        checkReleaseBuilds false
        // Or, if you prefer, you can continue to check for errors in release builds,
        // but continue the build even when errors are found:
        abortOnError false
    }
}
...


解决方法:
在app的build.gradle中添加如下代码,重新Generate Signed APK即可

  1. android{
  2.     lintOptions {
  3.         checkReleaseBuilds false
  4.         abortOnError false
  5.     }
  6. }

签名命令

既然提到了签名,自然就应当了解没有签名打包工具情况下,使用命令签名了。下面介绍3种签名,第一种是通常的对apk的签名;第二种是除apk外对jar的签名,即上文提及的V1、V2,没有对jar的签名在华为之类的手机安装过程中会报没有证书错误无法安装成功;第三种是apk上架360报签名算法采用“SHA256withRSA”错误问题;这边附上签名的脚本,只需文件名后缀改为.bat,双击运行即可签名,要签名的apk跟脚本放通过目录,路径之类的自己修改一下。

1、对apk签名

jarsigner -verbose -keystore [您的私钥存放路径] -signedjar [签名后文件存放路径] [未签名的文件路径] [您的证书名称]

  1. @echo off
  2. ::for %%i in (*.apk) do (
  3. echo start...
  4. cd C:\Program Files (x86)\Java\jdk1.8.0_181\bin
  5. jarsigner -verbose -keystore D:\php\AndroidTool\packSign\php20130508.keystore -signedjar D:\php\AndroidTool\packSign\IDcodeSDKDemo11.apk D:\php\AndroidTool\packSign\IDcodeSDKDemo.apk php
  6. echo end..
  7. pause
  8. ::)

2、V1/V2签名

Google在Android7.0(Nougat)推出了新的签名方案,该方案能够发现对 APK 的受保护部分进行的所有更改,从而有助于加快验证速度并增强完整性保证。也就是说目前比较流行的渠道分包方案在APK Signature Scheme v2下将无法使用,虽然目前V2签名方案Google并不是强制要求使用,但和传统的签名方案对比它有更快的签名速度和更安全的保护,而且没有V2签名的apk在应用自动更新成功后会闪退,没有显示安装成功界面。报错如下:

SecurityProfileService: Not found Exception No APK Signature Scheme v2 block in APK Signing Block

而正常应该是有界面

                                                                      

v1/v2签名
apksigner sign --ks (签名地址) --ks-key-alias (别名) --out (签名后的apk地址) (待签名apk地址)

注:apksigner 是api 26以上版本才有的,所以需定位到sdk的26以上的 编译目录

  1. @echo off
  2. ::for %%i in (*.apk) do (
  3. echo start...
  4. cd D:\php\AndroidTool\sdk24.4_as\sdk24.4\build-tools\28.0.3
  5. apksigner sign --ks D:\php\AndroidTool\packSign\SecSeal20130508.keystore --ks-key-alias kinsecsecseal --out D:\php\AndroidTool\packSign\IDcodeSDKDemo11.apk D:\php\AndroidTool\packSign\IDcodeSDKDemo.apk
  6. echo end..
  7. pause
  8. ::)

3、针对360上架打包版本

jarsgner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore [keystorePath] -singnedjar [apkOut] [apkln] [alias]


ps:红色英文不填的话,默认签名算法采用“SHA256withRSA”,所以会导致360提示:”您的应用签名算法采用“SHA256withRSA”,在部分4.2一下安卓版本的手机上不能安装

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore D:\php\AndroidTool\packSign\live\php.keystore -signedjar D:\php\发布\user\php-user-release.apk D:\php\发布\user\php.apk php

 

4、jks转keystore


首先把jks文件转为p12信息文件

keytool -importkeystore -srckeystore D:\php\AndroidTool\packSign\live\shanzhaapp.jks -srcstoretype JKS -deststoretype PKCS12 -destkeystore D:\php\AndroidTool\packSign\live\shanzhaapp.p12


然后把p12文件转为keystore文件

keytool -v -importkeystore -srckeystore D:\php\AndroidTool\packSign\live\shanzhaapp.p12 -srcstoretype PKCS12 -destkeystore D:\php\AndroidTool\packSign\live\shanzhaapp.keystore -deststoretype JKS

即:
keytool -importkeystore -srckeystore D:\php\AndroidTool\packSign\live\shanzhaapp.jks -srcstoretype JKS -deststoretype PKCS12 -destkeystore D:\php\AndroidTool\packSign\live\shanzhaapp.p12

keytool -v -importkeystore -srckeystore D:\php\AndroidTool\packSign\live\shanzhaapp.p12 -srcstoretype PKCS12 -destkeystore D:\php\AndroidTool\packSign\live\shanzhaapp.keystore -deststoretype JKS

获取秘钥签名MD5值:

keytool -list -v -keystore D:\php\AndroidTool\packSign\live\shanzhaapp.keystore

 

安卓混淆

build.gradle文件:

  1. buildTypes {
  2. release {
  3. minifyEnabled true
  4. proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
  5. }
  6. }

混淆文件proguard-rules.pro:

  1. -optimizationpasses 7 #指定代码的压缩级别 0 - 7
  2. -dontusemixedcaseclassnames #是否使用大小写混合
  3. -dontskipnonpubliclibraryclasses #如果应用程序引入的有jar包,并且想混淆jar包里面的class
  4. -dontpreverify #混淆时是否做预校验(可去掉加快混淆速度)
  5. -verbose #混淆时是否记录日志(混淆后生产映射文件 map 类名 -> 转化后类名的映射
  6. -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* #淆采用的算法
  7. -ignorewarnings #屏蔽警告
  8. -keep public class * extends android.app.Activity #所有activity的子类不要去混淆
  9. -keep public class * extends android.app.Application
  10. -keep public class * extends android.app.Service
  11. -keep public class * extends android.content.BroadcastReceiver
  12. -keep public class * extends android.content.ContentProvider
  13. -keep public class * extends android.app.backup.BackupAgentHelper
  14. -keep public class * extends android.preference.Preference
  15. -keep public class com.android.vending.licensing.ILicensingService #指定具体类不要去混淆
  16. -keepclasseswithmembernames class * {
  17. native <methods>; #保持 native 的方法不去混淆
  18. }
  19. -keepclasseswithmembers class * {
  20. public <init>(android.content.Context, android.util.AttributeSet); #保持自定义控件类不被混淆,指定格式的构造方法不去混淆
  21. }
  22. -keepclasseswithmembers class * {
  23. public <init>(android.content.Context, android.util.AttributeSet, int);
  24. }
  25. -keepclassmembers class * extends android.app.Activity {
  26. public void *(android.view.View); #保持指定规则的方法不被混淆(Android layout 布局文件中为控件配置的onClick方法不能混淆)
  27. }
  28. -keep public class * extends android.view.View { #保持自定义控件指定规则的方法不被混淆
  29. public <init>(android.content.Context);
  30. public <init>(android.content.Context, android.util.AttributeSet);
  31. public <init>(android.content.Context, android.util.AttributeSet, int);
  32. public void set*(...);
  33. }
  34. -keepclassmembers enum * { #保持枚举 enum 不被混淆
  35. public static **[] values();
  36. public static ** valueOf(java.lang.String);
  37. }
  38. -keep class * implements android.os.Parcelable { #保持 Parcelable 不被混淆(aidl文件不能去混淆)
  39. public static final android.os.Parcelable$Creator *;
  40. }
  41. -keepnames class * implements java.io.Serializable #需要序列化和反序列化的类不能被混淆(注:Java反射用到的类也不能被混淆)
  42. -keepclassmembers class * implements java.io.Serializable { #保护实现接口Serializable的类中,指定规则的类成员不被混淆
  43. static final long serialVersionUID;
  44. private static final java.io.ObjectStreamField[] serialPersistentFields;
  45. !static !transient <fields>;
  46. private void writeObject(java.io.ObjectOutputStream);
  47. private void readObject(java.io.ObjectInputStream);
  48. java.lang.Object writeReplace();
  49. java.lang.Object readResolve();
  50. }
  51. -keepattributes Signature #过滤泛型(不写可能会出现类型转换错误,一般情况把这个加上就是了)
  52. -keepattributes *Annotation* #假如项目中有用到注解,应加入这行配置
  53. -keep class **.R$* { *; } #保持R文件不被混淆,否则,你的反射是获取不到资源id的
  54. -keep class **.Webview2JsInterface { *; } #保护WebView对HTML页面的API不被混淆
  55. -keepclassmembers class * extends android.webkit.WebViewClient { #如果你的项目中用到了webview的复杂操作 ,最好加入
  56. public void *(android.webkit.WebView,java.lang.String,android.graphics.Bitmap);
  57. public boolean *(android.webkit.WebView,java.lang.String);
  58. }
  59. -keepclassmembers class * extends android.webkit.WebChromeClient { #如果你的项目中用到了webview的复杂操作 ,最好加入
  60. public void *(android.webkit.WebView,java.lang.String);
  61. }
  62. #对WebView的简单说明下:经过实战检验,做腾讯QQ登录,如果引用他们提供的jar,若不加防止WebChromeClient混淆的代码,oauth认证无法回调,反编译基代码后可看到他们有用到WebChromeClient,加入此代码即可。
  63. -keepclassmembernames class com.cgv.cn.movie.common.bean.** { *; } #转换JSON的JavaBean,类成员名称保护,使其不被混淆
  64. ##################################################################
  65. # 下面都是项目中引入的第三方 jar 包。第三方 jar 包中的代码不是我们的目标和关心的对象,故而对此我们全部忽略不进行混淆。
  66. ##################################################################
  67. #-libraryjars /libs/android-support-v4.jar
  68. -dontwarn android.support.v4.**
  69. -keep class android.support.v4.** { *; }
  70. -keep public class * extends android.support.v4.**
  71. -keep public class * extends android.app.Fragment
  72. #-libraryjars /libs/pdf.jar
  73. -dontwarn com.neusoft.android.pdf.**
  74. -dontwarn com.example.pdfactivity04.**
  75. -keep class com.neusoft.android.pdf.** { *;}
  76. -keep class com.example.pdfactivity04.** { *;}
  77. -dontwarn com.itextpdf.**
  78. -dontwarn org.apache.**
  79. -keep class com.itextpdf.**{*;}
  80. -keep class org.apache.**{*;}
  81. -dontwarn com.google.**
  82. -keep class com.google.**{*;}
  83. -dontwarn com.tencent.**
  84. -keep class com.tencent.**{*;}
  85. -dontwarn com.lidroid.**
  86. -keep class com.lidroid.**{*;}
  87. -keep class com.duicky.TestProvider{*;}
  88. #-dontwarn com.ui.**
  89. #-keep class com.ui.**{*;}
  90. #-dontwarn com.turui.**
  91. #-keep class com.turui.**{*;}
  92. #-dontwarn com.idcard.**
  93. #-keep class com.idcard.**{*;}
  94. -dontwarn com.i2trust.**
  95. -keep class com.i2trust.**{*;}
  96. -dontwarn com.hisign.**
  97. -keep class com.hisign.**{*;}
  98. -dontwarn com.ccit.**
  99. -keep class com.ccit.**{*;}
  100. -dontwarn com.plk.bluetoothlesdk.**
  101. -keep class com.plk.bluetoothlesdk.**{*;}
  102. -dontwarn org.kobjects.**
  103. -keep class org.kobjects.**{*;}
  104. -dontwarn org.ksoap2.**
  105. -keep class org.ksoap2.**{*;}
  106. -dontwarn org.kxml2.**
  107. -keep class org.kxml2.**{*;}
  108. -dontwarn org.xmlpull.**
  109. -keep class org.xmlpull.**{*;}
  110. -dontwarn org.nanohttpd.**
  111. -keep class org.nanohttpd.**{*;}
  112. -dontwarn com.sensetime.senseid.sdk.**
  113. -keep class com.sensetime.senseid.sdk.**{*;}
  114. #-libraryjars /libs/commons-codec-1.3.jar
  115. #-libraryjars /libs/commons-httpclient-3.1.jar
  116. #-libraryjars /libs/commons-logging-1.1.jar
  117. #-libraryjars /libs/zxing.jar
  118. #-libraryjars /libs/httpclient-4.3.6.jar
  119. #-libraryjars /libs/httpcore-4.3.2.jar
  120. #-libraryjars /libs/httpmime-4.3.5.jar
  121. #-libraryjars /libs/itextpdf.jar
  122. #-libraryjars /libs/libammsdk.jar
  123. #-libraryjars /libs/xUtils-2.6.14.jar
  124. #-libraryjars /libs/livedetectCTID.jar
  125. #-libraryjars /libs/i2trustauthensdk.jar
  126. #-libraryjars /libs/plkbluetoothlesdk.jar
  127. #-libraryjars /libs/ldap.jar
  128. #-libraryjars /libs/ksoap2-android-assembly-3.6.0-jar-with-dependencies.jar
  129. #-libraryjars /libs/MKeySDK.jar
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/420069
推荐阅读
相关标签
  

闽ICP备14008679号