Today I’d like to share with you my findings about how an existing .apk file can be modified.

An .apk file represents the mobile application as it is installed on a mobile device, like smartphone, tablet, wearable, etc.

Such an .apk file is a simple archive that can be opened with any packager like e.g. WinRAR

So you can easily open it and view the files – although viewing most of the files won’t make you happy, because you’ll realize that they’re compiled, in binary format, etc

… but this is a different story.

Anyways, you can open the archive and then modify any resource file and save the modification in the archive.

But if you afterwards try to install the .apk on the smartphone (or tablet or similar), you’ll get an error.

The following screenshot displays the error when installing the modified sample application myApp.apkon an Android device:

The reason is that after the modification, the checksum and the signature are not valid anymore.

Thus, simply changing an .apk file is not possible.

However, there’s still the valid use case to modify or replace files inside an existing .apk.

For example:

– files which are placed in the assets folder

– property files containing configuration data

– images which can be replaced

– styling information resources

and similar.

My personal use case was:

I had created an Android application using SAP Netweaver Gateway Productivity Accelerator.

I had to deliver the application to my users as .apk file.

But there was the requirement that they wanted to modify the ready application (change configuration data).

So I had to figure out how to achieve that: modify the app without having access to the source code.

Below, I’m sharing the required steps with you.

The description is based on the following software and versions:

Android current API 19

Java 7

Windows 7

If you aren’t familiar with Android, but wish to be, you might want to check the documents [1] and [2]

All prerequisites for understanding this blog are explained there.

Note:

In order to execute the commands described below, you need to have Java on your PATH variable of your Windows system (see [1] for an explanation).

Overview

There are 3 steps that need to be followed in order to modify an existing .apk file:

1. Do the actual desired modifications inside the .apk file

2. Sign the .apk

3. Install the .apk on the device

1.  Change the resource in the .apk

Open the .apk file with WinRAR (if that doesn’t work, rename the file extension .apk to .zip)

Change the resource in the archive as desired (packager tools allow to change files without the need to extract the archive)

Once you’re done with your changes, you have to take care about the signature files that are part of the .apk:

Inside the archive, go to folder META-INF

Delete the existing *.RSA and *.SF files

The following screenshot displays the content of the META-INF folder in an .apk file:

Now the archive can be closed.

In case you had changed the file extension before, you now have to change it back to .apk

2. Sign the .apk

Android doesn’t allow to install an application (apk) that isn’t signed.

When developing an app in Eclipse, the ADT (“Android Developer Tools”, the extension to Eclipse that supports development for Android) takes care of signing the app with a default certificate, before installing in on the device.

That’s comfortable, but with the following description, everybody is able to sign an application.

Signing the .apk is done in 2 steps:

a) create the certificate

b) sign the .apk with the created certificate

Both steps are done with commands on the command line

a) Generate a certificate

If you’re working in a Java environment, you have the JDK on your file system.

The JDK comes with a tool to manage certificates: the keytool.

You can find it in the …/bin folder of your JDK installation.

Example:

On my machine it is here:

Now you can generate a certificate using below command.

However, before executing it, please check the notes below, in order to adapt the parameters

keytool.exe -genkey -v -keystore <myKeystore> -alias <myAlias> -sigalg MD5withRSA -keyalg RSA -keysize 2048 -validity 1000

Please note that you have to adapt some of the parameters of the above command to your personal needs:

keystore <myKeystore>

Here, you can provide an arbitrary name for your keystore.

The name that you provide here will be the name of the keystore-file that will be created.

The file will be created in the current directory.

(I haven’t tried it, but probably you can enter the name of an existing keystore file, in order to store the new certificate there)

alias <myAlias>

Here as well, you can provide an arbitrary name for the alias.

It is meant for you to recognize it.

The alias is the human readable name of the certificate which will be created and stored in the keystore.

validity 1000

This is the number of desired days.

You can enter any number you wish.

I think it should be high enough in order to avoid trouble with expiration.

Note that the parameters sigalg and keyalg are required by JDK 7, so it shouldn’t be necessary to add them if you’re using JDK 6

Example:

keytool.exe -genkey -v -keystore mykeystore -alias myAlias -sigalg MD5withRSA -keyalg RSA -keysize 2048 -validity 10000

When executing the command, you’ll get several prompts on the command line, asking for password, username, organization, city, etc

You can enter any arbitrary data here, you only have to make sure to remember the password.

After you’ve executed the command, you’ll see the generated keystore file on your file system in the current directory (from where you’ve executed the command)

Now you can proceed with signing the .apk using the newly created certificate.

b) Sign the apk

Before signing the .apk file, you have to make sure that there are no certificates available in the .apk.

This is described in step 1 above.

For signing an archive, we use the jarsigner tool, which is provided with JDK, and which can be found in the same location like the keytool.

The following  command is used for signing an apk.

jarsigner -verbose  -sigalg MD5withRSA -digestalg SHA1 -keystore <keystoreName> <appName> <alias>

Please note that you have to adapt some of the parameters of the above command to fit your personal needs:

keystore <keystoreName>

Here you have to enter the name that you have given in the previous step a)

In order to keep the command line short, I recommend to temporarily copy the keystore file to the same location where you’re executing the command.

<appName>

Here you have to enter the name of the apk file which you want to sign

In order to keep the command line short, I recommend to temporarily copy the .apk file to the same location where you’re executing the command.

<alias>

Here you have to enter the name of the alias that you’ve provided when generating the certificate

Note that the parameters sigalg and digestalg are required by JDK 7, so it shouldn’t be necessary to add them if you’re using JDK 6

Example:

jarsigner -verbose  -sigalg MD5withRSA -digestalg SHA1 -keystore mykeystore myApp.apk myAlias

After you’ve executed the command, you can check the result inside the .apk file:

Open the archive, go to the folder …/META-INF and check if the files CERT.RSA and CERT.SF have been created.

3. Install the apk on the device

Now that the .apk file is signed, you can install it on your device.

BTW: This procedure is also called side-load.

For Android applications the installation is done on the command line, using the adb command.

adb stands for Android Debug Bridge

adb.exe is a piece of software that connects the PC with the Android device.

It allows access to the device, allows to trigger operations, transfer files, etc.

In order to install the .apk on the device, you have to connect the device to your PC via USB cable,

then execute following command

adb install <appName>

In order to keep the command line short, you can temporarily copy the apk file to the same location where you’re executing the command.

Example:

adb install myApp.apk

The result should be “success” message on command prompt.

If not, any of the previous steps may have failed.

That’s it.

You can find the application in the apps folder of your smartphone.

This procedure worked for me on WIN7 and JDK 7.

It wasn’t required to rebuild the app, nor to generate new checksum or similar.

Links

Please refer to the following documents for lot of information for beginners.

They also contain lots of additional links for further reading.

[1] Getting started with GWPA: Prerequisites: http://scn.sap.com/docs/DOC-52235

[2] Getting started with GWPA: Android Preparation: http://scn.sap.com/docs/DOC-52371

The official docu can be found here: http://developer.android.com/tools/publishing/app-signing.html

转自:https://blogs.sap.com/2014/05/21/how-to-modify-an-apk-file/

How to modify a compiled Android application (.apk file)的更多相关文章

  1. Android Application Fundamentals——Android应用程序基础知识

    Application Fundamentals--应用程序基础知识 Key classes--关键类 Activity Service BroadcastReceiver ContentProvid ...

  2. Android 验证APK是否已经签名或是否是Debug签名

    https://source.android.google.cn/ http://www.android-doc.com/tools/publishing/app-signing.html Signi ...

  3. repackage android application

    decompile the application file apktool d -o dianping/ dianping.apk modify the resources / smali asse ...

  4. My First Android Application Project 第一个安卓应用

    一.前言: 安卓(Android):是一种基于Linux的自由及开放源代码的操作系统,主要用在移动设备上,如手机.平板电脑.其他的设备也有使用安卓操作系统,比如:电视机,游戏机.数码相机等等. 二.具 ...

  5. 将HTML5封装成android应用APK文件的几种方法

    越来越多的开发者热衷于使用html5+JavaScript开发移动Web App.不过,HTML5 Web APP的出现能否在未来取代移动应用,就目前来说,还是个未知数.一方面,用户在使用习惯上,不喜 ...

  6. 将HTML5封装成android应用APK文件的几种方法(转载)

    越来越多的开发者热衷于使用html5+JavaScript开发移动Web App.不过,HTML5 Web APP的出现能否在未来取代移动应用,就目前来说,还是个未知数.一方面,用户在使用习惯上,不喜 ...

  7. Android实现apk文件下载并自动安装

    //下载apk程序代码 protected File downLoadFile(String httpUrl) { // TODO Auto-generated method stub final S ...

  8. 将HTML5封装成android应用APK文件的几种方法(转)

    作为下一代的网页语言,HTML5拥有很多让人期待已久的新特性.HTML5的优势之一在于能够实现跨平台游戏编码移植,现在已经有很多公司在移动 设备上使用HTML5技术.随着HTML5跨平台支持的不断增强 ...

  9. Android文件Apk下载变ZIP压缩包解决方案

    [root@ conf]# pwd /alidata/server/nginx/conf [root@ conf]# vi mime.types application/vnd.android.pac ...

随机推荐

  1. 在ListView控件中实现修改功能

    实现效果: 知识运用: ListView控件的LabelEdit属性 //指示用户是否可以编辑控件中数据项的标签 public bool LabelEdit{get;set;} 实现代码: priva ...

  2. SQLAlchemy简介

    一.SQLAlchemy简介 SQLAlchemy是Python SQL工具包和对象关系映射器,是python中最著名的ORM(Object Relationship Mapping)框架,它简化了应 ...

  3. 10个HTML5 实战教程 提升你的综合开发能力

    HTML5 作为下一代网站开发技术,无论你是一个 Web 开发人员或者想探索新的平台的游戏开发者,都值得去研究.借助尖端功能,技术和 API,HTML5 允许你创建响应性.创新性.互动性以及令人惊叹的 ...

  4. 支持无限加载的js图片画廊插件

    natural-gallery-js是一款支持无限加载的js图片画廊插件.该js图片画廊支持图片的懒加载,可以对图片进行搜索,分类,还可以以轮播图的方式来展示和切换图片. 使用方法 在页面中引入下面的 ...

  5. css中如何把鼠标变成手

    css中鼠标放上去变成手型怎么设置:其实就是一个属性的问题, css的cursor属性 cursor:pointer; 其实这个属性我也记了很多,到现在都容易拼写错误,不过好在编辑器有提示. defa ...

  6. 列举Asp.net页面之间传递值的几种方式和优缺点?

    一.QueryString变量 优点:使用简单,对于安全性要求不高时传递数字或是文本值非常有效. 缺点:缺乏安全性,由于它的值暴露在浏览器的URL地址中的:不能传递对象. 二. 使用Applicati ...

  7. 微信小程序 onLoad 函数

    小程序注册完成后,加载页面,触发onLoad方法. 页面载入后触发onShow方法,显示页面. 首次显示页面,会触发onReady方法,渲染页面元素和样式,一个页面只会调用一次. 当小程序后台运行或跳 ...

  8. HDU 6156 回文 数位DP(2017CCPC)

    Palindrome Function Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 256000/256000 K (Java/Ot ...

  9. VBA连接到SQL2008需要加上端口号

    VBA连接到SQL2008需要加上端口号1433,比如 conn = "server=XXXX.XXXX.XXXX.XXXX,1433;provider=SQLOLEDB.1;databas ...

  10. hdu1950Bridging signals(求最长上升自序列nlogn算法)

    Bridging signals Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...