Android-⽤apktool⼯具进⾏拆包、重打包
准备⼯作:
教师丝袜⼀、拆包。(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 -verbo -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
ian.project.launcherapplication;
import android.app.Activity;
t.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) {
tContentView(R.layout.activity_launcher);
textView = (TextView) findViewById(_tv_main);
button = (Button) findViewById(_btn_start);
button.tOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
textView.tText("start");
new Handler().postDelayed(new Runnable() {
走马舞@Override
public void run() {
Intent intent = new Intent("com.parttime.happytime.start");
彼岸花怎么种植
startActivity(intent);
}
},6000);
}
});
}
}
l:
将前导页⼯程编译产⽣apk,⽤⼀种同样的⽅法解包:
image
将程序的⼊⼝改成新加⼊的Activity,将原来的⼊⼝添加action为lanch,⽅便我们的隐式调⽤。
image
⼯程中引⽤的资源都需要在这边添加(res),res/layout中的
取义成仁的意思
l布局加⼊,
还有⼀个⽐较重要的地⽅,就是添加的控件id必须在res/values⽂件下的l和l中添加(布局只需要在l添加id,⽽控件l和l 都需要添加):
医院锦旗赠语
image
值得⼀说的是l内部的id值是16进制数编号,我们只需要在对应的type最后按顺序添加就可以了。
image
image
将前导页⼯程smali下的⽂件添加到本⼯程的com包下(l注册组件时对应包名):
image
因为smali⽂件都是之前产⽣的,合并到本⼯程时id需要改为现在修改的id:
在⽬录⾥⾯找到LauncherActivity.smali⽂件并打开,
沉默不是我的错
所有资源的id对需要改为刚才我们在l中给资源添加的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 -verbo -keystore moonlighting.jks(证书) -storepass [密钥] -keypass [密钥] -signedjar Thinkdrive_signed.apk(签名完后的apk) app-test/dist/app-debug.apk(上⼀步中产⽣的apk) moonlighting(证书名)
这样两个⼯程就巧妙的合并了。