java 调用 apktool_Android-用apktool工具进行拆包、重打包

这篇博客介绍了如何在Java环境下利用apktool工具对Android应用进行拆包、修改资源和代码,然后重新打包并签名的过程。主要步骤包括:使用apktool解包apk,修改smali文件和资源文件,添加新的Activity,合并资源,并使用jarsigner进行签名。
摘要由CSDN通过智能技术生成

准备工作:

一、拆包。(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的工作路径:

6e516fe0cccd

image

执行命令:java -jar apktool_2.1.1.jar d app-test.apk

6e516fe0cccd

image

操作成功后会产生一个与apk文件名相同的一个文件夹,结构如下:

6e516fe0cccd

image

二、修改。

从上图文件结构可以看到。所有的xml文件都是可以在这里找到的,资源文件在名为res的文件下,而且没有变化。而之前的java代码在这里变成了.smali文件在名为smali的文件夹中。

1.(简单修改)因为资源文件没有变化,可以直接修改,比如修改一些字符串的对应值,样式、颜色等。布局文件也没有变化,可以直接对布局中的控件的位置、长宽、背景颜色等直接做修改。

2.(加入新的页面)举个例子,我现在要在当前程序再加一个前导页:

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

6e516fe0cccd

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:

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

tools:context="com.mrtian.project.launcherapplication.LauncherActivity">

android:id="@+id/zz_tv_main"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Hello World!" />

android:id="@+id/zz_btn_start"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="点击进入"/>

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

6e516fe0cccd

image

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

6e516fe0cccd

image

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

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

ids.xml:

6e516fe0cccd

image

public.xml:

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

6e516fe0cccd

image

6e516fe0cccd

image

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

6e516fe0cccd

image

因为smali文件都是之前产生的,合并到本工程时id需要改为现在修改的id:

在目录里面找到LauncherActivity.smali文件并打开,

所有资源的id对需要改为刚才我们在public.xml中给资源添加的id值:

布局:

6e516fe0cccd

image

控件:

6e516fe0cccd

image

6e516fe0cccd

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(证书名)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值