最近一直想发布应用到Android应用市场,但对Android应用的签名与打包不是很理解,就百度了许多,以下是我的总结。
一、Android的签名:
1.首先创建一个应用SignDemo
2.点击工程右键,Android Tools-->Export Signed Android Application Package...
弹出以下对话框
Next--->输入保存的位置、密码与确认密码。
点击Next.
3.输入相关信息。
4.输入apk的保存位置
点击完成,这样带有签名的apk就生成了。
二、Android 防止反编译
由于Android应用容易被反编译,利用apktool,dex,jd-gui等工具,可以很容易获取到开发者的图片、语音等资源。如果不加以防护,我们的代码也有可能被别人轻易获取。想想自己辛苦写的代码,被别人窃取,很不是滋味。下面我们来聊一下,怎样防止反编译自己的代码,因为图片与相关的语音资源无法避免。
下面我们不加防护,来反编译我们的代码。
1.不加防护,反编译
我们在上面的工程里,添加一个类Demo.java,
public class Demo {
private String name;
private String password;
public Demo(String name, String password) {
super();
this.name = name;
this.password = password;
}
}
MainActivity的代码如下,
public class MainActivity extends Activity {
private Demo mDemo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mDemo = new Demo("hello", "hello");
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
接着我们重新用签名生成apk文件,解压apk文件,获取classes.dex文件复制到dex工具的目录下。编译生成classes_dex2jar.jar文件。
生成的classes_dex2jar.jar文件如下。
我们用jd-gui打开classes_dex2jar.jar文件,我们所写的代码全部呈现。
2.防止反编译
(1)首先看下工程下面是否有proguard.cfg文件,没有的话,复制一个。proguard.cfg内容如下:
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
-libraryjars /home/huang/myworkspace/SignDemo/libs/android-support-v4.jar
-dontwarn android.support.v4.**
-keep class android.support.v4.** { *; }
-keep public class * extends android.support.v4.**
-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
-keepclasseswithmembernames class * {
native <methods>;
}
-keepclasseswithmembernames class * {
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembernames class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
project.properties文件最后加上,proguard.config=proguard.cfg
(2)重复以上的1中的步骤,生成新的apk文件,获取classes.dex,dex编译classes.dex生成classes_dex2jar.jar文件。再用jd-gui工具打开,如图我们发现Demo变成了a:
由于我们写的只是小部分代码,效果不是很明显。代码越多时,混淆得越厉害。防止别人轻易获取自己的代码。
f