本文介绍Android 7.1平台下Google LeanbakLauncher的反编译流程,并使用AS工具重新打包修改。

最近需要开发一款TV桌面应用,调研了各类桌面,如当贝桌面,小米桌面,开源的猫桌面。其中当贝桌面,小米桌面不符合Google推荐的Tv开发方式,猫桌面简洁,但是功能较少,如缺少APP的排序,卸载管理等功能。猫桌面的Github地址:https://github.com/JackyAndroid/AndroidTVLauncher。

相比之下,Google LeanbackLauncher页面较为绚丽,动画完美,符合Tv开发规范,是一款支持应用移动,卸载,视频内容推送的Leanback风格的桌面软件。只是这款软件不开源,于是自然想到反编译。

Google LeanbackLauncher的桌面UI如下:

反编译,用AS重新打包的UI如下(更换了壁纸,添加了以太网连接标记,视频推荐内容暂时无法还原):

下面正式介绍反编译与回编译的流程:

(1) 下载LeanbackLauncher  http://www.coolapk.com/apk/com.google.android.leanbacklauncher

(2)  一般的反编译工具推荐是APKTool,Dex2Jar,JadUI,其中APKTool用于解压资源文件,Dex2Jar用于将dex转换成Jar包,JadUI用于查看jar文件对应的java文件。不过我反编译LeanbackLauncher只用到了APKTool,此外,借助了一个在线网站,直接将APK转换成Java文件。

(3) 将下载下来的APK文件传到网站 http://www.javadecompilers.com/apk,等待一段时间之后,网站会自生成APK文件反编译后对应的Java文件和资源文件,下载下来解压。

(4) 解压之后的文件包括src和res文件,但是res文件的id是一连串的数字,无法直接翻译成@+id的形式,于是使用APKTool工具来解决该问题。从APKTool网站下

载该工具并配置好环境之后,使用命令:apktool d LeanbackLauncher.apk -o C:/LeanbackLauncher将资源文件解压到C盘的LeanbackLauncher目录下。

(5) 启动Android Studio,新建LeanbackLauncher工程,包名为com.google.android.leanbacklauncher,将在线网站反编译的java文件和APKTool工具反编译出来的res文件复制到对应的目录下,重新build,解决相关错误之后,编译可生成一个APK。

(6) 生成的APK如果直接install至Box上是起不来的,原因如下:

一些权限必须是系统应用才可以申请使用的,所以必须使用芯片厂商提供的签名工具,将其变成系统应用

相关findViewById,getColor,getDrawable等方法的参数是一连串的数字,必须将其变成R.type.name的引用

(7) 在工程目录下包含res/values/public.xml,这个xml文件包含所有资源引用的类型,名字,和16进制的引用值。Java文件下findViewById,getColor,getDrawabel方法的参数,转换成16进制之后,能在这个xml找到对应的某一行,通过组合成R.type.name的形式替换这些方法的参数。

(8) 通过手动一个一个去替换findViewById,getColor等方法的参数,显然太费时间,也很无聊,于是我用Python写了一个脚本文件去搜索,替换文件中的这些参数,Python脚本代码如下:

import sys
import os
def readAllLine(filePath):allLines = []with open(filePath, 'r') as f:for line in f:allLines.append(line)return allLinesdef filterLines(orginLines, str):lines = []for line in orginLines:if line.find(str) >= 0:lines.append(line)return linesdef extractValueForLine(line, key, start, end):searchIndex = line.find(key)if searchIndex < 0:return NonesearchIndex += 1while searchIndex < len(line) and line[searchIndex] != start:searchIndex += 1if searchIndex >= len(line):return Nonestart_tag = searchIndexsearchIndex += 1while searchIndex < len(line) and line[searchIndex] != end:searchIndex += 1if searchIndex >= len(line):return Noneend_tag = searchIndexend_tag += 1str_value = ''list_value = []for i in range(start_tag + 1, end_tag - 1):list_value.append(line[i])str_value = str_value.join(list_value)str_value = str_value.strip()print("start_tag->" + start, start_tag)print("end_tag->" + end, end_tag)return str_valuedef mergeValue(str_value, filePath):if str_value.find('R') >= 0:return str_valueelse:with open(filePath) as f:for line in f:try:int(str_value)except:continueif line.find(hex(int(str_value))) >= 0:type = extractValueForLine(line, "type=", '\"', '\"')name = extractValueForLine(line, "name=", '\"', '\"')return "R." + type + "." + namedef replaceFileStr(filePath, keyWord, searchPath):allLines = readAllLine(filePath);newLines = []for line in allLines:newLine = lineif line.find(keyWord) >=0:str_num = extractValueForLine(line, keyWord, '(', ')')                if str_num is not None and str_num.find('R') < 0:compValue = mergeValue(str_num, searchPath)if compValue is not None:newLine = newLine.replace(str_num, compValue)newLines.append(newLine)with open(filePath, 'w') as f:f.writelines(newLines)if __name__ == '__main__':os.system('java ReadAllFiles /home2/gf/PythonStudy/TextProc/java > all_files.txt')allLines = readAllLine('all_files.txt')for itemPath in allLines:itemPath = itemPath.replace('\n', '')replaceFileStr(itemPath, 'findViewById', '/home2/gf/PythonStudy/TextProc/public.xml')replaceFileStr(itemPath, 'getDimension', '/home2/gf/PythonStudy/TextProc/public.xml')replaceFileStr(itemPath, 'getText', '/home2/gf/PythonStudy/TextProc/public.xml')replaceFileStr(itemPath, 'getString', '/home2/gf/PythonStudy/TextProc/public.xml')replaceFileStr(itemPath, 'getColor', '/home2/gf/PythonStudy/TextProc/public.xml')replaceFileStr(itemPath, 'getDrawable', '/home2/gf/PythonStudy/TextProc/public.xml')replaceFileStr(itemPath, 'getBoolean', '/home2/gf/PythonStudy/TextProc/public.xml')replaceFileStr(itemPath, 'getFloat', '/home2/gf/PythonStudy/TextProc/public.xml')replaceFileStr(itemPath, 'getLayout', '/home2/gf/PythonStudy/TextProc/public.xml')replaceFileStr(itemPath, 'getAnimation', '/home2/gf/PythonStudy/TextProc/public.xml')replaceFileStr(itemPath, 'getXml', '/home2/gf/PythonStudy/TextProc/public.xml')replaceFileStr(itemPath, 'getInt', '/home2/gf/PythonStudy/TextProc/public.xml')

由于刚学Python不久,对Python文件遍历这块内容不熟悉,于是写了一段Java代码,用于获取某文件夹(包括子文件夹)下所有的文件,配合Python脚本一起使用,代码如下:

import java.util.List;
import java.util.LinkedList;
import java.io.File;
import java.util.ArrayList;
public class ReadAllFiles{public static void main(String[] args){String rootPath = args[0];//System.out.println(rootPath);List<String> paths = new ArrayList<String>();File targetFile = new File(rootPath);if(targetFile.isFile())paths.add(targetFile.getPath());else{LinkedList<File> dirFiles = new LinkedList<File>();dirFiles.add(targetFile);while(!dirFiles.isEmpty()){File dirFile = dirFiles.removeFirst();File[] childFiles = dirFile.listFiles();if(childFiles != null && childFiles.length > 0){for(File childFile : childFiles){if(childFile.isFile())System.out.println(childFile.getPath());else if(!childFile.getName().equals(".git"))dirFiles.add(childFile);}}}}        }
}

(9) 上述Python脚本可以替换掉大部分findViewById,getColor,getDrawabel的参数,但仍有少部分需要自己手动调整。重新Build之后,在Nexus机器上应用可以起来,但是在我们平台上会奔溃,原因是我们的平台把壁纸服务去掉了,无法获取WallPapaerManger。

(10) 修改相关代码之后,成功在我们平台上运行。

(11)重编译的Github源码:https://github.com/MoMoWait/LeanbackLauncher

觉得对您有益,支持一下?

    

Android TV下LeanbackLauncher的反编译,AS重新打包修改相关推荐

  1. ubuntu java反编译,[原创]Ubuntu下简单配置反编译工具以及其开发环境

    0x0:前言 个人电脑重新换了下系统,Ubuntu14.04,刚好需要配置下android的反编译环境,这里简单记录一下,以供有需要的朋友参考. 其实最简单的,只需要apktool就可以了,不过有编码 ...

  2. 反编译008神器,修改手机型号与android版本号信息

    一个可以修改手机信息的xposed插件 008神器依赖xposed可修改其他应用获取到的系统参数值,见下图 但是我们直接从网上下载的008神器生成的手机型号和安卓版本号都是好几年前的.下面就来分析下怎 ...

  3. Android TV下NFS和Samba挂载

    本文介绍Android TV下NFS和Samba的挂载方式,方法如下: 1. kernel目录下,执行make menuconfig,找到对应的选项,勾选即可,重新编译kernel 2.  重新烧录r ...

  4. android 混淆 去掉log,Android去掉/混淆Log,反编译都看不到

    原标题:Android去掉/混淆Log,反编译都看不到 出发点: 当然是由于编程习惯太好,打了一堆中文log,其实只是想给测试看.然而如果包被反编译,看log基本都能理解流程了,有点尴尬.所以此文主要 ...

  5. apktool 在mac下的使用 -反编译安卓apk文件

    1.下载apktool 点击这里下载 ,里面有两个文件,一个是.jar,一个是自己写的脚本.sh  注:最新的apktool.jar 文件可以点击这里下载 .sh脚本是自写脚本可不用更新最新,下载的j ...

  6. apk 反编译及重新打包签名

    apk 反编译及重新打包签名 1. 需要的工具 apktool,apk 编译及反编译工具 keytool,用于管理密钥和证书的工具 jarsigner,签名工具 apksigner,签名工具 2. a ...

  7. APP渗透—查脱壳、反编译、重打包签名

    APP渗透-查脱壳.反编译.重打包签名 1. 前言 1.1. 其它 2. 安装工具 2.1. 下载jadx工具 2.1.1. 下载链接 2.1.2. 执行文件 2.2. 下载apktool工具 2.2 ...

  8. linux反编译apk,apk反编译和重新打包

    操作系统:Mac OS X 软件:apktool 安装apktool 95264490-A493-4D02-B820-C23AB5140B5D.png 按Mac步骤: 1.打开"wrappe ...

  9. 【app反编译和逆向打包】

    一:反编译 1:反编译代码 JADX(推荐) 具体的安装和使用,推荐看这篇文章吧点这里 dex2jar 和 jd-gui 关键命令: d2j-dex2jar classes.dex ps:将获取到的c ...

最新文章

  1. x86汇编语言从实模式百度云_Intel x86 CPU 32位保护模式杂谈之任务切换 上
  2. 国内用得最多的框架,它排第一!
  3. 图解PE文件实例研究
  4. [转]常用OCR软件介绍
  5. linux shell 判断文件是否存在
  6. python -- 字符串的方法及注释
  7. mysql 主键 最佳实践_设计套路:Mysql主键的选取
  8. 第67课 选择排序 改进例67.1 《小学生C++编程入门》
  9. mysql gui tools ojdbc14.jar_[java]OJDBC版本区别 [ojdbc14.jar,ojdbc5.jar和ojdbc6.jar的区别]
  10. matlab作函数图像,matlab绘制函数图像
  11. SoundPool工具类
  12. 中职计算机应用和平面设计,中等职业教育十一五规划教材·中职中专计算机类教材系列·Photoshop平面设计与实训...
  13. 把sql中的image数据在网页中显示成图片
  14. 和计算机相关的英文名字女孩,最好听的英文名字女孩
  15. Django 千锋培训读书笔记
  16. android实现跑马灯效果,Android新手开发之旅-实现跑马灯效果
  17. python的数据类型分为复数_Python的基本数据类型
  18. 照片怎么添加相框?分享你和好用的方法
  19. 在c语言中 函数的作用是什么,C语言程序中函数的定义
  20. 万字长文!Unix 和 Linux 你不知道的那些历史(详解版)

热门文章

  1. EXCEL宏代码大全
  2. 安全芯片NRSEC3000应用于具有加密功能的电压监测仪
  3. 基于AD Event日志监测域委派后门
  4. (九)海哇VR全景电商平台-“商家入驻、我要开店”模块设计分析
  5. 世界上唯一的七星级宾馆
  6. 【Android】移动端二维码扫描解决方案衍变
  7. ant design table 表格空白
  8. 超好看的导航引导页源码V1.3开源+带后台/多模板/音乐
  9. 【前端基础知识笔记】 【项目导向型】(持续更新中)
  10. 中国联通与阿里云达成合作,推动5G+新媒体产业发展