您的位置:首页 > 移动开发 > Android开发

Android代码混淆前后分析

2013-01-24 16:11 218 查看
为了方便站在巨人臂膀上研读源码,特地将自己写的源码进行混淆之后与源码进行比较。

使用混淆的方法在project.properties文件上加入

[plain] view plaincopyprint?

proguard.config=proguard.cfg

这一条代码。关于如何反编译源码,请看之前的一篇博客如何反编绎APK文件。


一、代码结构


1、源码




2、未带混淆机制代码




3、混淆后的代码



从图中可以看出未带混淆机制的代码基本上与源码的结构相同,同时加入了R文件和android.annotation包。而混淆之后的代码删除了TestCommon文件,因为没有任何其他的文件使用到了这个文件当中的方法,因此使用混淆机制后其被删除。

二、MyTabHost代码分析

1、MyTabHost源码

[java] view plaincopyprint?

package com.yang.confusion;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.TabHost;

public class MyTabHost extends TabHost
{

public MyTabHost(Context context) {
super(context);
}

public MyTabHost(Context context, AttributeSet attrs)
{
super(context, attrs);
}

public TabSpec setIndicator(CharSequence label)
{
return null;
}
private String str = null;
private static final int FLAG
= 1;

//测试if
public void testIf()
{
if (str == null)
{
System.out.println("空");
}
}

/**
* 测试IfElse
*/
public void testIfElse()
{
if (str == null)
{
System.out.println("空");
} else {
System.out.println("不空");
}
}

public void testIfWhile()
{
if (str == null)
{
while (str == null)
{
System.out.println("空");
}
}
}

public void testIfDoWhile()
{
if (str == null)
{
do {
System.out.println("空");
} while (str == null);
}
}

public void testFor()
{
for (int i
= 0; i < 10; i++) {
System.out.println("asdf");
}
}

public void testForIf()
{
for (int i
= 0; i < 10; i++) {
if (i == 1)
{
System.out.println("asdf");
}
}
}

public void testWhile()
{
while (str == null)
{
System.out.println("空");
}
}

@SuppressWarnings("unused")
private void testSwitch(int key)
{
switch (key) {
case FLAG:

break;

default:
break;
}
}

}TestActivity

2、未带混淆机制MyTabHost代码

[java] view plaincopyprint?

package com.yang.confusion;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.TabHost;
import android.widget.TabHost.TabSpec;
import java.io.PrintStream;

public class MyTabHost extends TabHost
{
private static final int FLAG
= 1;
private String str = null;

public MyTabHost(Context paramContext)
{
super(paramContext);
}

public MyTabHost(Context paramContext, AttributeSet
paramAttributeSet)
{
super(paramContext, paramAttributeSet);
}

private void testSwitch(int paramInt)
{
switch (paramInt)
{
case 1:
}
}

public TabHost.TabSpec setIndicator(CharSequence paramCharSequence)
{
return null;
}

public void testFor()
{
for (int i
= 0; ; i++)
{
if (i >= 10)
return;
System.out.println("asdf");
}
}

public void testForIf()
{
for (int i
= 0; ; i++)
{
if (i >= 10)
return;
if (i != 1)
continue;
System.out.println("asdf");
}
}

public void testIf()
{
if (this.str
== null)
System.out.println("空");
}

public void testIfDoWhile()
{
if (this.str
== null)
do
System.out.println("空");
while (this.str
== null);
}

public void testIfElse()
{
if (this.str
== null)
System.out.println("空");
while (true)
{
return;
System.out.println("不空");
}
}

public void testIfWhile()
{
if (this.str
== null);
while (true)
{
if (this.str
!= null)
return;
System.out.println("空");
}
}

public void testWhile()
{
while (true)
{
if (this.str
!= null)
return;
System.out.println("空");
}
}
}

3、混淆后的MyTabHost代码

[java] view plaincopyprint?

package com.yang.confusion;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.TabHost;

public class MyTabHost extends TabHost
{
private String a = null;

public MyTabHost(Context paramContext, AttributeSet
paramAttributeSet)
{
super(paramContext, paramAttributeSet);
}
}

从中可以看出,只要源码没有进行混淆设置,还是可以读懂的。没有混淆机制的代码,对源码进行相应的改动,具体改动的目的不知道,但是还是可以看懂的。而对于混淆后的代码,对源代码进行了进一步的缩减,对源码当中没有使用到的方法全部删除。【成都安卓培训

三、TestActivity代码分析

1、TestActivity源码

[java] view plaincopyprint?

package com.yang.confusion;

import android.app.Activity;
import android.os.Bundle;

public class TestActivity extends Activity
{
@Override
protected void onCreate(Bundle
savedInstanceState) {
super.onCreate(savedInstanceState);
testIf();
testIfElse();
testIfWhile();
testIfDoWhile();
testFor();
testForIf();
testWhile();
testSwitch(2);
}
private String str = null;
private static final int FLAG
= 1;

//测试if
public void testIf()
{
if (str == null)
{
System.out.println("空");
}
}

/**
* 测试IfElse
*/
public void testIfElse()
{
if (str == null)
{
System.out.println("空");
} else {
System.out.println("不空");
}
}

public void testIfWhile()
{
if (str == null)
{
while (str == null)
{
System.out.println("空");
}
}
}

public void testIfDoWhile()
{
if (str == null)
{
do {
System.out.println("空");
} while (str == null);
}
}

public void testFor()
{
for (int i
= 0; i < 10; i++) {
System.out.println("asdf");
}
}

public void testForIf()
{
for (int i
= 0; i < 10; i++) {
if (i == 1)
{
System.out.println("asdf");
}
}
}

public void testWhile()
{
while (str == null)
{
System.out.println("空");
}
}

private void testSwitch(int key)
{
switch (key) {
case FLAG:

break;

default:
break;
}
}

}

2、未带混淆机制的TestActivity代码

[java] view plaincopyprint?

package com.yang.confusion;

import android.app.Activity;
import android.os.Bundle;
import java.io.PrintStream;

public class TestActivity extends Activity
{
private static final int FLAG
= 1;
private String str = null;

private void testSwitch(int paramInt)
{
switch (paramInt)
{
case 1:
}
}

protected void onCreate(Bundle
paramBundle)
{
super.onCreate(paramBundle);
testIf();
testIfElse();
testIfWhile();
testIfDoWhile();
testFor();
testForIf();
testWhile();
testSwitch(2);
}

public void testFor()
{
for (int i
= 0; ; i++)
{
if (i >= 10)
return;
System.out.println("asdf");
}
}

public void testForIf()
{
for (int i
= 0; ; i++)
{
if (i >= 10)
return;
if (i != 1)
continue;
System.out.println("asdf");
}
}

public void testIf()
{
if (this.str
== null)
System.out.println("空");
}

public void testIfDoWhile()
{
if (this.str
== null)
do
System.out.println("空");
while (this.str
== null);
}

public void testIfElse()
{
if (this.str
== null)
System.out.println("空");
while (true)
{
return;
System.out.println("不空");
}
}

public void testIfWhile()
{
if (this.str
== null);
while (true)
{
if (this.str
!= null)
return;
System.out.println("空");
}
}

public void testWhile()
{
while (true)
{
if (this.str
!= null)
return;
System.out.println("空");
}
}
}

3、混淆后的TestActivity代码 【成都安卓培训

[java] view plaincopyprint?

package com.yang.confusion;

import android.app.Activity;
import android.os.Bundle;
import java.io.PrintStream;

public class TestActivity extends Activity
{
private String a = null;

protected void onCreate(Bundle
paramBundle)
{
int i = 0;
super.onCreate(paramBundle);
if (this.a
== null)
System.out.println("空");
label44: int j;
if (this.a
== null)
{
System.out.println("空");
if (this.a
== null)
if (this.a
== null)
break label106;
if (this.a
== null)
do
System.out.println("空");
while (this.a
== null);
j = 0;
label75: if (j < 10)
break label117;
label81: if (i < 10)
break label131;
}
while (true)
{
if (this.a
!= null)
{
return;
System.out.println("不空");
break;
label106: System.out.println("空");
break label44;
label117: System.out.println("asdf");
j++;
break label75;
label131: if (i == 1)
System.out.println("asdf");
i++;
break label81;
}
System.out.println("空");
}
}
}

四、MainTabHostActivity代码分析

1、MainTabHostActivity源码

[java] view plaincopyprint?

package com.yang.tabhost;
import android.app.TabActivity;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TabHost;
import android.widget.TabWidget;
import android.widget.TextView;
/**
*
* @Title: MainTabHostActivity.java
* @Package com.yang.tabhost
* @Description: MainTabHostActivity
*
*/
public class MainTabHostActivity extends TabActivity
{
private TabHost tabHost;
private TabWidget tabWidget;

@Override
protected void onCreate(Bundle
savedInstanceState) {
super.onCreate(savedInstanceState);
// No Title bar
requestWindowFeature(Window.FEATURE_NO_TITLE);
requestWindowFeature(Window.FEATURE_PROGRESS);
setContentView(R.layout.main_layout);
makeTab();
}

private void makeTab()
{
if (this.tabHost
== null) {
tabHost = getTabHost();
tabWidget = getTabWidget();
tabHost.setup();
tabHost.bringToFront();

setupChild1();
setupChild2();
}

for (int i
= 0; i < tabWidget.getChildCount(); i++) {
TextView tv = (TextView) tabWidget.getChildAt(i).findViewById(
android.R.id.title);
android.widget.RelativeLayout.LayoutParams tvp = new android.widget.RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);
tvp.addRule(RelativeLayout.ALIGN_PARENT_TOP);
tvp.addRule(RelativeLayout.CENTER_HORIZONTAL);
tv.setLayoutParams(tvp);

ImageView iv = (ImageView) tabWidget.getChildAt(i).findViewById(
android.R.id.icon);
android.widget.RelativeLayout.LayoutParams ivp = new android.widget.RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);
ivp.addRule(RelativeLayout.CENTER_HORIZONTAL);
ivp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
iv.setLayoutParams(ivp);

// 得到每个tab
View vvv = tabWidget.getChildAt(i);
// 设置背景色为透明
vvv.setBackgroundColor(Color.TRANSPARENT);
// 设置字体颜色和大小
tv.setTextColor(this.getResources()
.getColorStateList(R.color.white));
tv.setTextSize(15);

}
}

private void setupChild2()
{
Intent intent = new Intent();
intent.setAction(Intent.ACTION_MAIN);
intent.setClass(this, AnotherChildActivity.class);
String name = (String) this.getResources().getText(R.string.allimage);
tabHost.addTab(tabHost
.newTabSpec(name)
.setIndicator(name,
getResources().getDrawable(R.drawable.tab_selected))
.setContent(intent));
}

private void setupChild1()
{
Intent intent = new Intent();
intent.setAction(Intent.ACTION_MAIN);
intent.setClass(this, ChildTabHostActivity.class);
String name = (String) this.getResources().getText(R.string.onepiece);
tabHost.addTab(tabHost
.newTabSpec(name)
.setIndicator(name,
getResources().getDrawable(R.drawable.tab_selected))
.setContent(intent));
}
}

2、未带混淆机制的MainTabHostActivity代码 【成都安卓培训

[java] view plaincopyprint?

,

package com.yang.tabhost;

import android.app.TabActivity;
import android.content.Intent;
import android.content.res.Resources;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout.LayoutParams;
import android.widget.TabHost;
import android.widget.TabHost.TabSpec;
import android.widget.TabWidget;
import android.widget.TextView;

public class MainTabHostActivity extends TabActivity
{
private TabHost tabHost;
private TabWidget tabWidget;

private void makeTab()
{
if (this.tabHost
== null)
{
this.tabHost = getTabHost();
this.tabWidget = getTabWidget();
this.tabHost.setup();
this.tabHost.bringToFront();
setupChild1();
setupChild2();
}
for (int i
= 0; ; i++)
{
if (i >= this.tabWidget.getChildCount())
return;
TextView localTextView = (TextView)this.tabWidget.getChildAt(i).findViewById(16908310);
RelativeLayout.LayoutParams localLayoutParams1 = new RelativeLayout.LayoutParams(-2,
-2);
localLayoutParams1.addRule(10);
localLayoutParams1.addRule(14);
localTextView.setLayoutParams(localLayoutParams1);
ImageView localImageView = (ImageView)this.tabWidget.getChildAt(i).findViewById(16908294);
RelativeLayout.LayoutParams localLayoutParams2 = new RelativeLayout.LayoutParams(-2,
-2);
localLayoutParams2.addRule(14);
localLayoutParams2.addRule(12);
localImageView.setLayoutParams(localLayoutParams2);
this.tabWidget.getChildAt(i).setBackgroundColor(0);
localTextView.setTextColor(getResources().getColorStateList(2130968578));
localTextView.setTextSize(15.0F);
}
}

private void setupChild1()
{
Intent localIntent = new Intent();
localIntent.setAction("android.intent.action.MAIN");
localIntent.setClass(this, ChildTabHostActivity.class);
String str = (String)getResources().getText(2131034113);
this.tabHost.addTab(this.tabHost.newTabSpec(str).setIndicator(str,
getResources().getDrawable(2130837512)).setContent(localIntent));
}

private void setupChild2()
{
Intent localIntent = new Intent();
localIntent.setAction("android.intent.action.MAIN");
localIntent.setClass(this, AnotherChildActivity.class);
String str = (String)getResources().getText(2131034114);
this.tabHost.addTab(this.tabHost.newTabSpec(str).setIndicator(str,
getResources().getDrawable(2130837512)).setContent(localIntent));
}

protected void onCreate(Bundle
paramBundle)
{
super.onCreate(paramBundle);
requestWindowFeature(1);
requestWindowFeature(2);
setContentView(2130903041);
makeTab();
}
}

3、混淆后的MainTabHostActivity代码

[java] view plaincopyprint?

package com.yang.tabhost;

import android.app.TabActivity;
import android.content.Intent;
import android.content.res.Resources;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout.LayoutParams;
import android.widget.TabHost;
import android.widget.TabHost.TabSpec;
import android.widget.TabWidget;
import android.widget.TextView;

public class MainTabHostActivity extends TabActivity
{
private TabHost a;
private TabWidget b;

protected void onCreate(Bundle
paramBundle)
{
super.onCreate(paramBundle);
requestWindowFeature(1);
requestWindowFeature(2);
setContentView(2130903041);
if (this.a
== null)
{
this.a = getTabHost();
this.b = getTabWidget();
this.a.setup();
this.a.bringToFront();
Intent localIntent1 = new Intent();
localIntent1.setAction("android.intent.action.MAIN");
localIntent1.setClass(this, ChildTabHostActivity.class);
String str1 = (String)getResources().getText(2131034113);
this.a.addTab(this.a.newTabSpec(str1).setIndicator(str1,
getResources().getDrawable(2130837512)).setContent(localIntent1));
Intent localIntent2 = new Intent();
localIntent2.setAction("android.intent.action.MAIN");
localIntent2.setClass(this, AnotherChildActivity.class);
String str2 = (String)getResources().getText(2131034114);
this.a.addTab(this.a.newTabSpec(str2).setIndicator(str2,
getResources().getDrawable(2130837512)).setContent(localIntent2));
}
for (int i
= 0; ; i++)
{
if (i >= this.b.getChildCount())
return;
TextView localTextView = (TextView)this.b.getChildAt(i).findViewById(16908310);
RelativeLayout.LayoutParams localLayoutParams1 = new RelativeLayout.LayoutParams(-2,
-2);
localLayoutParams1.addRule(10);
localLayoutParams1.addRule(14);
localTextView.setLayoutParams(localLayoutParams1);
ImageView localImageView = (ImageView)this.b.getChildAt(i).findViewById(16908294);
RelativeLayout.LayoutParams localLayoutParams2 = new RelativeLayout.LayoutParams(-2,
-2);
localLayoutParams2.addRule(14);
localLayoutParams2.addRule(12);
localImageView.setLayoutParams(localLayoutParams2);
this.b.getChildAt(i).setBackgroundColor(0);
localTextView.setTextColor(getResources().getColorStateList(2130968578));
localTextView.setTextSize(15.0F);
}
}
}

从中可以看出,混淆后的代码难以阅读,但是可以从中找到规律,至于什么规律,博主能力有限,看大家去找了……
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: