Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Android-用apktool工具进行拆包、重打包 #19

Open
jeffrey1995 opened this issue Sep 13, 2016 · 0 comments
Open

Android-用apktool工具进行拆包、重打包 #19

jeffrey1995 opened this issue Sep 13, 2016 · 0 comments

Comments

@jeffrey1995
Copy link
Owner

jeffrey1995 commented Sep 13, 2016

准备工作:

一、拆包。(Mac环境)

1.下载apktool,我用的是apktool_2.1.1.jar。
2.需要拆包的apk。
用到的命令:
解包:
java -jar apktool_2.1.1.jar d app-test.apk
打包:
java -jar apktool_2.1.1.jar b app-test/
签名:
jarsigner -verbose -keystore moonlighting.jks(证书) -storepass [密钥] -keypass [密钥] -signedjar Thinkdrive_signed.apk(签名完后的apk) app-test/dist/app-debug.apk(上一步中产生的apk) moonlighting(证书名)

操作步骤:

1.打开Terminal,进入apktool的工作路径:
image
执行命令:java -jar apktool_2.1.1.jar d app-test.apk
image
操作成功后会产生一个与apk文件名相同的一个文件夹,结构如下:
image

二、修改。

从上图文件结构可以看到。所有的xml文件都是可以在这里找到的,资源文件在名为res的文件下,而且没有变化。而之前的java代码在这里变成了.smali文件在名为smali的文件夹中。
1.(简单修改)因为资源文件没有变化,可以直接修改,比如修改一些字符串的对应值,样式、颜色等。布局文件也没有变化,可以直接对布局中的控件的位置、长宽、背景颜色等直接做修改。
2.(加入新的页面)举个例子,我现在要在当前程序再加一个前导页:

2.1.首先创建一个工程,工程只包含一个Activity,为了排除干扰,我将Test目录删除,去除工程其他的依赖包:

image

LauncherActivity.xml:

package com.mrtian.project.launcherapplication;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class LauncherActivity extends Activity {
private TextView textView;
private Button button;
@OverRide
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_launcher);
textView = (TextView) findViewById(R.id.zz_tv_main);
button = (Button) findViewById(R.id.zz_btn_start);
button.setOnClickListener(new View.OnClickListener() {
@OverRide
public void onClick(View v) {
textView.setText("start!!!");
new Handler().postDelayed(new Runnable() {
@OverRide
public void run() {
Intent intent = new Intent("com.parttime.happytime.start");
startActivity(intent);
}
},6000);
}
});
}
}

activity_launcher.xml:




将前导页工程编译产生apk,用一种同样的方法解包:
image

将程序的入口改成新加入的Activity,将原来的入口添加action为com.zhuanfa.money.lanch,方便我们的隐式调用。

image

工程中引用的资源都需要在这边添加(res),res/layout中的activity_launcher.xml布局加入,

还有一个比较重要的地方,就是添加的控件id必须在res/values文件下的ids.xml和public.xml中添加(布局只需要在public.xml添加id,而控件ids.xml和public.xml都需要添加):

ids.xml:
image

public.xml:
值得一说的是public.xml内部的id值是16进制数编号,我们只需要在对应的type最后按顺序添加就可以了。
image

image

将前导页工程smali下的文件添加到本工程的com包下(AndroidManifest.xml注册组件时对应包名):

image

因为smali文件都是之前产生的,合并到本工程时id需要改为现在修改的id:
在目录里面找到LauncherActivity.smali文件并打开,
所有资源的id对需要改为刚才我们在public.xml中给资源添加的id值:
布局:
image
控件:
image

image

如果需要const/high16这样的声明,指的是对这个id值舍入,修改id值时将其改成const就行了,否则之后打包会报错

三、重新打包并签名(不签名不能安装)。

经过上面的步骤,我们的工程算是合并完了,打开终端,输入命令:
java -jar apktool_2.1.1.jar b app-test/
成功执行后会在app-test/dist目录下产生一个apk
在对该apk进行签名操作:
jarsigner -verbose -keystore moonlighting.jks(证书) -storepass [密钥] -keypass [密钥] -signedjar Thinkdrive_signed.apk(签名完后的apk) app-test/dist/app-debug.apk(上一步中产生的apk) moonlighting(证书名)

这样两个工程就巧妙的合并了。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant