首先Andorid不会安装没有数字签名的应用,但是数字签名也不需要权威的数字证书签名机构认证,只需程序员自己完成。

数字签名有几种模式

  1. 调试模式
    ADT自动使用Debug密钥为应用程序签名(这就是为什么我们没有自己进行任何签名操作却能在avd和真机完成程序调试)
    但是调试模式存在两个缺点:
    (1)Debug签名的程序不能在Android Market上销售,会强制你使用自己的签名
    (2)debug.keystore在不同的机器上所产生的可能都不一样,这就意味着换了机器进行APK版本升级将出现程序不能覆盖安装的问题。如果一个应用有多个用户使用那么这就相当于软件不具备升级功能。所以一定要有自己的数字证书来签名。
  2. 发布模式
    开发者使用自己的数字证书来给APK包签名,有两个方法为:
    (1)通过DOS命令来对APK签名
    (2)使用ADT ExportWizard来签名
    需要注意的是数字证书是有有效期的,Android只是在应用程序安装时才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影响程序的正常使用。

使用数字证书的几点好处

  1. 有利于程序升级
    当新老版本数字证书相同时,Android系统才会认为两个程序是同一个程序的不同版本,如果不一致则Android系统认为他们是不同的程序。
  2. 有利于程序模块化设计和开发
    Andorid系统允许拥有同一个数字签名的程序运行在一个进程中,Andorid程序会将他们视作同一个程序,所以开发者可以将自己的程序分模块开发,而用户只需要在需要时下载适当的模块即可。
  3. 可以通过权限的方式在多个程序间共享数据和代码

如何使用AndroidStudio进行多渠道打包
步骤为:
(1)在AndroidManifest.xml中设置动态渠道变量

<meta-data
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}" />

(2)在build.gradle中设置productFlavors
productFlavors定义的是产品特性,配合manifest merger使用可以在一次编译过程中产生具有独特配置的版本。这个配置是为每个渠道包产生不同的UMENG_CHANNEL_VALUE值。

//这里假定我们需要打包的渠道为酷安市场、360、小米、百度、豌豆荚
android {
productFlavors {
kuan {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "kuan"]
}
xiaomi {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
}
qh360 {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "qh360"]
}
baidu {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"]
}
wandoujia {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
}
}
}

或者批量修改

android {  
productFlavors {
kuan {}
xiaomi {}
qh360 {}
baidu {}
wandoujia {}
}

productFlavors.all {
flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
}

(3)执行打包操作
在AndroidStudio菜单栏点击Build菜单–>Generate signed APK–>选择key,并输入密码。最后选择打包渠道完成产生多渠道的APK包。

什么是代码混淆
对发出去的程序进行重新组织和处理,使得处理后的代码与处理前的代码完成相同的功能,这样的代码很难被反编译。简化代码的过程中将变量名、函数、类等名称变为简单的字母代号,一些不影响正常运行的信息也将永久丢失,这样编译后的jar文件体积大约能减少25%,达到精简程序的作用。

如何做到代码混淆
java源代码编译成中间字节码存储于class文件中,我们用java混淆器对java字节码进行混淆。
步骤为:
(1)在Android项目的根目录下创建一个proguard.cfg文件用来配置混淆选项
(2)在Android.mk中每个package类型的LOCAL_MODULE中的LOCAL_PACKAGE_NAME下面添加两行代码:​​​在这里插入代码片​

#指定当前的应用打开混淆
LOCAL_PROGUARD_ENABLED:=full
#指定混淆配置文件
LOCAL_PROGUARD_FLAG_FILES:=proguard.cfg

(3)编译时设置环境变量使用 . ./setenv.sh -bv user
(4)如何在项目中使用了第三方的SDK,则在混淆代码时需要按照第三方的SDK的要求来做。
实际工作中也可以使用第三方的混淆工具来混淆例如爱加密或者360加固助手。

简述不同SDK版本的两种代码混淆方式
低版本的SDK下,项目中同时包含proguard.cfg和project.properties文件,只需要在后者文件末尾添加proguard.config=proguard.cfg再将项目Exprot即可
高版本的SDK下同时包含上述两个文件,这时需要在proguard_project.txt文件中添加如下信息配置再将项目Exprot。
例如在project.properties中内容如下:

# Project target
target=android-18

如果想保留某个包下的文件不被混淆,可以在proguard-project.txt文件中加入保留对应包名的语句:

# Add any project specific keep options here:
-dontwarn com.cnki.android.cnkireader.**
-keep class com.cnki.android.cnkireader.** { *; }

如何加固APK
一般使用360和爱加密加固APK

  1. 360加固APK
    (1)在360加固界面上传apk进行加固,加固前要对apk进行签名
    (2)选择加固服务,有基础服务和增强服务。
    (3)下载应用签名,下载应用后,需要对该apk进行再次签名保证前后的签名一致,否则加固后的应用无法再手机上运行,用多渠道打包的应用需要加固成功后在进行多渠道打包。
  2. 爱加密加固APK
    (1)直接上传APK包,不用提供源代码
    (2)爱加密提供多个加密方式(云加密,PC加密,本地加密,so文件本地加密,全自动加密服务,安全审核加密)
    (2)加固完成后也要签名保证加固前后一致。

APK瘦身
APK越大消耗的流量就会越多,所以要瘦身
APK的辅助分析工具是NimbleDroid,是分析Android APP性能指标的系统。
APK瘦身的方式有:
(1)开启混淆,删除无用的Java文件,开启minifyEnable(开启混淆,删除无用的java文件),可减小APK中APK文件的大小。

android {
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}

(2)去除无用资源,同时去除工程中临时展示的图片。开启shrinkResources,同时去除工程中临时展示的图片可减小APK文件的大小,具体代码如下:

        android {
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}

(3)删除无用的语言资源。

defaultConfig{
...
resConfigs "zh"
...
}

(4)使用TinyPNG有损压缩。TinyPNG通过降低图片中颜色数量来减少PNG大小。可以将PNG压缩成8位的,压缩比例高达50%以上
(5)使用webp格式, Android 4.2.1才支持显示含透明度的webp使用格式工厂进行转化。
(6)PNG图片换成JPG图片。对于非透明的大图,JPG将会比PNG图片大小有显著的优势。在启动页、活动页之类的大图展示区采用JPG是非常明智的选择。
(7)删除或替换兼容包(v4 v7 v13)中无用的一些图,删除drawable-LDRTL,可以使用1*1的像素图片来替换v4 v7 v13中的一些图片资源
(8)注意删除第三方库中使用的大图
(9)so库的删除。建议实际工作的配置只保留armeabi、x86文件夹下的so文件
(10)通过v4包中的Drawable Compat,通过着色方案完成selector效果。
(11)使用shape文件替换图片。
(12)把so文件放置到网上或者sdcard内。

APK由哪些部分组成
(1)Classes.dex :是Java源码编译后形成的java字节码文件
(2)resources.arsc:编译后的二进制资源文件
(3)AndroidManifest.xml
(4)proguard.cfg:代码混淆配置文件
(5)project.properties:表示apk的target和sdk的依赖关系
(6)assets
(7)armeabi:该目录放在lib下用于存放一些so文件或者jar包
(8)META-INF:存放的是签名信息,保证apk的完整性和安全性
(9)res