项目上线流程

一、生成keystore
1.作用
1.1 App升级:使用相同签名的升级软件可以正常覆盖老版本的软件,否则系统比较发现新版本的签名证书和老版本的签名证书不一致,不会允许新版本安装成功的。
1.2 App模块化:android系统允许具有相同的App运行在同一个进程中,如果运行在同一个进程中,则他们相当于同一个App,但是你可以单独对他们升级更新,这是一种App级别的模块化思路。
1.3 允许代码和数据共享:android中提供了一个基于签名的Permission标签。通过允许的设置,我们可以实现对不同App之间的访问和共享,如AndroidManifest.xml:<permission android:protectionLevel="normal" />

2.Ecplise生成方式
1.1 工具生成:选中项目右击,选择Android-Tools ,然后选中 Export Signed Application Package选项
如果没有keystore创建新的,选择Create new keystore选项,设置名称,密码完成

1.2 命令行生成:
1)dos下进入JDK的bin目录(位于jdk_xx\jre\bin目录下)
2)输入:keytool -genkey -alias qianfeng -keyalg RSA -validity 365000 -keystore qianfeng.keystore
指令解释:
-genkey 产生密钥
-alias mykey 别名 mykey
-keyalg RSA 使用RSA算法对签名加密
-validity 365000 代表有效期天数
-keystore qianfeng.keystore keystore的名字

3.Android Studio
1)选择build选项中generate signed apk

二、混淆(progruard)

1.proguard原理
Java代码编译成二进制class 文件,这个class 文件也可以反编译成源代码 ,除了注释外,原来的code 基本都可以看到。为了防止重要code 被泄露,我们往往需要混淆(Obfuscation code , 也就是把方法,字段,包和类这些java 元素的名称改成无意义的名称,这样代码结构没有变化,还可以运行,但是想弄懂代码的架构却很难。 proguard 就是这样的混淆工具,它可以分析一组class 的结构,根据用户的配置,然后把这些class 文件的可以混淆java 元素名混淆掉。在分析class 的同时,他还有其他两个功能,删除无效代码(Shrinking 收缩),和代码进行优化 (Optimization Options)。
缺省情况下,proguard 会混淆所有代码,但是下面几种情况是不能改变java元素的名称,否则就会这样就会导致程序出错。
一, 我们用到反射的地方。
二, 我们代码依赖于系统的接口,比如被系统代码调用的回调方法,这种情况最复杂。
三, 是我们的java元素名称是在配置文件中配置好的。所以使用proguard时,我们需要有个配置文件告诉proguard 那些java 元素是不能混淆的。
四,第三方jar,library

2.proguard配置
1)-dontwarn 缺省proguard 会检查每一个引用是否正确,但是第三方库里面往往有些不会用到的类,没有正确引用。如果不配置的话,系统就会报错。
2)-keep 指定的类和类成员被保留作为 入口 。
3)-keepclassmembers 指定的类成员被保留。
4)-keepclasseswithmembers 指定的类和类成员被保留,假如指定的类成员存在的话。

3.proguard问题和风险
1)混淆错误,用到第三方库的时候,必须告诉 proguard 不要检查,否则proguard 会报错。
2)运行错误,当code 不能混淆的时候,我们必须要正确配置,否则程序会运行出错,这种情况问题最多。
3)调试苦难,出错了,错误堆栈是混淆后的代码 ,自己也看不懂。

4.不能混淆的代码
1)下面这样代码混淆的时候要注意保留。
2)Android系统组件,系统组件有固定的方法被系统调用。
3)被Android Resource 文件引用到的。名字已经固定,也不能混淆,比如自定义的View
4)Android Parcelable ,需要使用android 序列化的。
5)Java序列化方法,系统序列化需要固定的方法。
6)枚举 ,系统需要处理枚举的固定方法
7)本地方法,不能修改本地方法名
8)annotations 注解
9)数据库驱动
10)有些resource 文件
11)用到反射的地方
12)其他Android 官方建议 不混淆的,如
android.app.backup.BackupAgentHelper
android.preference.Preference
com.android.vending.licensing.ILicensingService

5.混淆配置
1)参数:
-include {filename} 从给定的文件中读取配置参数
-basedirectory {directoryname} 指定基础目录为以后相对的档案名称
-injars {class_path} 指定要处理的应用程序jar,war,ear和目录
-outjars {class_path} 指定处理完后要输出的jar,war,ear和目录的名称
-libraryjars {classpath} 指定要处理的应用程序jar,war,ear和目录所需要的程序库文件
-dontskipnonpubliclibraryclasses 指定不去忽略非公共的库类。
-dontskipnonpubliclibraryclassmembers 指定不去忽略包可见的库类的成员。
2)保留选项:
-keep {Modifier} {class_specification} 保护指定的类文件和类的成员
-keepclassmembers {modifier} {class_specification} 保护指定类的成员,如果此类受到保护他们会保护的更好
-keepclasseswithmembers {class_specification} 保护指定的类和类的成员,但条件是所有指定的类和类成员是要存在。
-keepnames {class_specification} 保护指定的类和类的成员的名称(如果他们不会压缩步骤中删除)
-keepclassmembernames {class_specification} 保护指定的类的成员的名称(如果他们不会压缩步骤中删除)
-keepclasseswithmembernames {class_specification} 保护指定的类和类的成员的名称,如果所有指定的类成员出席(在压缩步骤之后)
-printseeds {filename} 列出类和类的成员-keep选项的清单,标准输出到给定的文件
3)压缩:
-dontshrink 不压缩输入的类文件
-printusage {filename}
-whyareyoukeeping {class_specification}
4)优化
-dontoptimize 不优化输入的类文件
-assumenosideeffects {class_specification} 优化时假设指定的方法,没有任何副作用
-allowaccessmodification 优化时允许访问并修改有修饰符的类和类的成员
5)混淆
-dontobfuscate 不混淆输入的类文件
-printmapping {filename}
-applymapping {filename} 重用映射增加混淆
-obfuscationdictionary {filename} 使用给定文件中的关键字作为要混淆方法的名称
-overloadaggressively 混淆时应用侵入式重载
-useuniqueclassmembernames 确定统一的混淆类的成员名称来增加混淆
-flattenpackagehierarchy {package_name} 重新包装所有重命名的包并放在给定的单一包中
-repackageclass {package_name} 重新包装所有重命名的类文件中放在给定的单一包中
-dontusemixedcaseclassnames 混淆时不会产生形形色色的类名
-keepattributes {attribute_name,...} 保护给定的可选属性,例如LineNumberTable, LocalVariableTable, SourceFile, Deprecated, Synthetic, Signature, and InnerClasses.
-renamesourcefileattribute {string} 设置源文件中给定的字符串常量

三、打包apk
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值