代码混淆:
android apk文件实际也是一种特殊形式的压缩包,很容易就被人解包反编译。为了防止这种情况的发生,就有了代码混淆技术
在eclipse里代码混淆文件是proguard.cfg文件。在android studio中是proguard-rules.pro
以下所有都是在as中讲解,eclipse大同小异
代码混淆通用部分:
#指定代码的压缩级别
-optimizationpasses 5
#包明不混合大小写
-dontusemixedcaseclassnames
#不去忽略非公共的库类
-dontskipnonpubliclibraryclasses
#优化 不优化输入的类文件
-dontoptimize
#预校验
-dontpreverify
#混淆时是否记录日志
-verbose
# 混淆时所采用的算法
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
#保护注解
-keepattributes *Annotation*
一般的代码混淆都会如上配置基本项
一下是根据个人项目配置:
# 保持哪些类不被混淆
-keep public class * extends android.app.Fragment
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService
#如果有引用v4包可以添加下面这行
-keep public class * extends android.support.v4.app.Fragment
#保持 Parcelable 不被混淆
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
#保持 Serializable 不被混淆
-keepnames class * implements java.io.Serializable
#保持 Serializable 不被混淆并且enum 类也不被混淆
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
!static !transient <fields>;
!private <fields><span></span>;
!private <methods>;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
#避免混淆泛型 如果混淆报错建议关掉
–keepattributes Signature(此处一般建议配置,在引用第三方库的时候,不这样配置会很容易报错)
如果引用第三方jar包:
#避免gson库混淆
-keep class com.google.gson.examples.android.model.** { *; }
#避免okhttp混淆
-keep class com.squareup.okhttp.**{*;}
混淆配置文件配置完成后就需要加载配置文件:
android studio:在build.gradle文件
buildTypes {
release {
minifyEnabled true(此处要设置为true)
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
eclipse:在project.properties文件里:
proguard.config=${sdk.dir}/tools/proguard/proguard-
android.txt:proguard-project.txt
混淆后会生成一个混淆后代码与源代码的映射关系文件,保存在mapping.txt:
#混淆前后的映射
-printmapping mapping.txt(可以通过此文件查看对应关系)
版本名称和版本代号及签名文件:
版本名称和版本代号都在 manifest.xml文件中
版本名称是体现给用户的,版本代号是面向开发人员的
如:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.wen_en.aweather"
android:versionCode="10010"
android:versionName=“1.10">
版本代号和版本名称的更新都是以递增的形式体现,具体递增规则随意
签名文件是在打包程序的时候使用的:
一般的签名(非系统签名):
选择项目 export 选择export android application
下一步
输入项目名称(默认即可)
下一步
选择已有的签名文件(keystore)或者新建keystore
下一步
按照提示即可完成
系统签名:
将带签名文apk与系统签名文件放在同一文件夹内(系统签名文件需要在android源码环境下编译)
如:
前三个就是系统签名文件,后一个就是待签名apk
然后在dos界面定位到当前文件夹 输入:
java -jar signapk.jar platform.x509.pem platform.pk8 DemoKindgarder.apk Signapk.apk
Signup.apk为签名后的文件(名字自定义)
另外 如果需要签系统名 需要在manifest.xml 中添加
package="com.example.clientapptest"
android:sharedUserId="android.uid.system"
android:versionCode="37"
android:versionName="3.7" >
android:sharedUserId=“android.uid.system"这一句代表此app为系统应用
apk文件的反编译及回编译:
我在实际项目中用的比较少,只在以前做汉化的时候用过 推荐参考
http://android.tgbus.com/Android/tutorial/201103/346338.shtml
另外 如果你需要查看你签名文件的sha1码:
在控制台输入命令。
cd .android
开发模式使用 debug.keystore,命令为:keytool -list -v -keystore debug.keystore
发布模式使用 apk 对应的 keystore,命令为:keytool -list -v -keystore apk的keystore
得到: