2024年1月20日发(作者:焦昭懿)
如果是修改CM的apk很简单,修改原始代码使用命令单独编译该apk 就可。这篇文章主要讲那该死三星闭源系统是如何在有限的环境下最大化修改你的东西。
本人不是什么高手,只是接触android的时间比较长(从G1就开始用起),爱好收集andorid历史上比较有代表性的机器,时常爱摆动手机,倒腾ROM,因为个人时间问题,一直没制作完整的作品(我比较懒XD),就连自己使用的ROM还停留在CMbeta3中文化版本。
个人关注aosp比较多点,很高兴我编译的中文版能将CM for i9000 推到大家面前,让更多的I9000用户了解到CM,当然从G1时代开始刷CM的兄弟们自然会知道CM的优秀。CM发展至今,已经不仅仅是手机ROM,他代表了一种精神,开源和共享(国内论坛有多少?),以及无所不能——这是我欣赏和推崇的。如果将CM放大到无限的时间和个人团体集合,android 会支持理论上一切可以运行它的设备。
一:基本准备!
准备工具:
Android SDK
java,下载适合您系统的版本。
您需要的是apktool 或者apk manager 4.9(貌似最新版本了)。推荐用apk manager 4.9,下面主要介绍该工具使用方法。
以上工具Windows和Linux下都有。
三星I9000 FROYO 系统应用软件在 /system/app 同大多数Android系统一样。但注意三星有着自定义的framework,在 /system/framework/。
如果您要修改三星的system app就需要用到他。
首先我们要提取出系统软件。有两种方法,第一刷完机,获取root权限之后用以下命令:
1. windows和linux下面的命令同样:
2. adb pull /system/
3. //将手机system目录copy到您电脑的某个路径中
复制代码
或者解压缩三星官方刷机包:挂载factoryfs到某路径:然后拷贝所有文件。
1. linux only:
2. mount -o loop,rw
复制代码
二:反编译apk文件
对于三星i9000反编译apk文件需要做如下工作,安装framework,至于是否要将odex和apk文件合并这里无所谓。因为不想做可安装包(做了在三星系统中也不能安装,签名不一至XD)
1. apktool if
复制代码
apk manager使用方法:apk manager的脚本运行会检测adb是否存在,如果您正确安装了sdk,并设定了环境变量,这里就能检测到。否则请将adb拷贝到apk manager主目录下来。
将需要修改的apk文件放到place-apk-here-for-modding目录内,然后执行,会看到很多选择。这里重点讲:
1.
2.
3.
4.
9 Decompile apk
//反编译APK文件,并输出到products目录。
11 Compile apk
//打包好apk文件。
复制代码
基本执行步骤就是 9 ,然后修改,再执行11打包。
当然,你无法得到三星的签名,所以迂回打包方案:
1.
2.
3.
4.
5.
6.
复制代码
1. //keep是原始apk的文件这里所有的文件将会保持原样打包到新apk里
2. //如果您修改values valus-xx 语言包,请到keep文件夹里删除
3. //如果您修改layout或者xml文件夹里的xml文件请同样删除旧的xml文件
4. 按任意键继续;
5. 将在place-apk-here-for-modding目录里生成新的apk,不过带有unsigner前缀。
复制代码
11 Compile apk
//执行打包,提示是否系统文件
选择 y
//提示blabla,是否复制原始文件
提示y
//提示blabla,按任意键继续。这里不要动。下面进入keep文件夹
1. //用winrar打开unsigerapk和原始的apk文件,将修改过的文件拖到原始apk包里覆盖。
2. //替换回系统,重启:
3. adb push /system/app/
4. 以上步骤无需重签名,汉化和修改布局,等不需要反编译odex文件。
复制代码
三:汉化和修改?
首先您已经掌握了以上的修改apk 方法。
下面谈如何汉化,一个纯正的欧版rom,除google应用,和第三方应用外,其他系统apk是不带中文语言的。
下面就以为例子:
执行9,反编译后,进入products//res/目录中,可以看到这个launcher其实是i9000和tab共用的。先不管这些,主要是修改语言包。
删除类似。values-it,values-en-rUS文件夹。
但请保留values-hdip,values-hdip-xxx,values-land,values-port,等文件夹,这些未必全有但这些不是语言包。
建立一个values-zh-rCN文件夹 (简体)
将values目录下 拷贝到values-zh-rCN里,对于一个app文件来说,汉化这两个基本就够了。另讲。
1. 用notepad2打开 ,这是主要语言包。翻译XXXX部分:如“launcher“翻译成“主屏幕“
2.
复制代码
1.
2.
3.
4.
5.
6.
7.
8.
复制代码
对于,这个基本是菜单里的选项,
如果看到表示选项的值(带_values),请不要翻译。如:
请保持原样。
翻译完成后,执行打包步骤。
删除语言包后报错?
刚刚有讲到删除了一部分语言包,有些strings是是该语言独享,并且values中的亦没有,那么删除它们合成的时候报错是必然的了。
报错了怎么办?最简单的就是别删语言包。
进阶方案:只想保留英简繁三语,其他一定要删除。请看下文:
1. 到apk manager的主目录下看log。
2. 会告诉您 行号 xxxx资源不存在。如果仅仅是删除语言包产生的错误
3. 打开,比对log文件中的行号,将其删除(删除时请注意保留该行号,以免接下来的行号不对应log中的错误行号而导致误删除。)
4. 重新执行合成步骤,看看是否报错,如果您正确处理掉多余的string,那么将不再报错。
复制代码
处理报错的唯一方法,不是问为什么会报错,请看LOG文件,会详细列举报错原因,如果您用apk manager 从来不看日志文件,那么就如同从没入门过一般。
如何处理 ?
基本上大家都知道,里的语言包种类,在大部分情况下决定settings语言切换的选项种类,那么如何对这个包删减和增添呢(一般我们只保留英语,简体中文,和繁体中文)?
也是一个apk,比较特殊,但修改方法同一般apk就可以。
1. 将raw-xx 文件夹删除,只保留raw,raw-zh-rTW,raw-zh-rCN三个
2. 将values-xx以及values-mcc数字-xx,删除,但保留values-land
values-port values-hdip values-zh-rCN values-zh-rTW, values-mcc数字-zh-rCN, values-mcc数字-zh-rTW,等
3. 没有中文语言包,建立,拷贝values内的过来,并汉化。并且将其中的map相关参数,改成中国(请参照其他中文ROM)
复制代码
汉化framework是一项艰苦的工作,需要毅力和时间,以及细心。有些选项和词语不能过长,否则越界显示不全。汉化工作是有偷懒的方法,除非您建立了一个完善的汉化资源库,第一次汉化千万不要使用这方法,可以参照词典取实际意境翻译,但千万不要google翻译一下。
1. 请备份原始的,并制作成刷机包
2. 替换回去,您猜对了,重启之后,不FC的话,测试系统菜单,看看是否汉化完成了!
3. 如果FC,请进入recovery模式还原回来,然后再修改测试,直到成功为止。
复制代码
对于三星ROM,即使你修改了,只保留了英语,简体,繁体三语之后,还是远远不够的,因为三星还多了一个twframework
如何处理twframework?
说到底只是一个特殊的apk文件,他有着apk文件的特性(可以被反编译XD),亦有着区别app的特点,包含系统的资源(大部分是图片资源,以及菜单,按钮样式等),不能随意删除。
此楼同步更新:如何读懂反编译后的代码?反编译后的代码具有一定的可读性,但比起原始代码可读性要差,尤其是smali文件;下面谈谈如何读这个res文件夹。此楼同步二楼内容更新,战线开太长,更新会比较慢,我要整理一下思路,会一边写,一边重新排版,有可能早上和下午读的内容排版有很大不同,不要介意。
呃,反编译完一个apk之后,res文件夹里有很多xml文件,新手拿到基本会无从下手,下面简单谈谈如何读一个xml文件。
drawable文件夹,一般用来放一些图片(及少)以及交互样式:XML。
1.
2.
3.
4.
5.
//定义了,按键三种状态的样式,使用到的素材在@drawable 文件夹中,这个@drawoable在那里?320X240的荧幕在drawable-mdip,我们的i9000就在drawable-hdip里面。
复制代码
知道了这一点,我们就可以很轻松的修改一个按钮的交互样式,你所作的不仅仅是替换图片了,可以add图片,并在public文件中添加strings,但要记住,该strings必须在该类别的最后。
layout文件夹,用来存储布局样式。如果有横竖屏界面的话,还会有layout-port,layout-land。以及区分分辨率的layout-mdip,layout-hdip等。
values以及values-xx,这里是调整软件默认设定值以及界面语言。
当然还有一个XML文件夹。很多东西都要靠自己摸索。
下面举例我是如何将froyo的launcher2修改成为姜饼样式的。
1.
2. 第一步,分别从2.2和2.3的SDK中提取两个。分别反编译这两个包,并保持2.2的在apk manager里为当前编辑状态。
3.
4. 对比drawable-hdip,drawable-hdip-land?将相同命名的图片覆盖过去,至于壁纸以及一些图标都是一样的就不用复制了。
5.
6. 删除一切带有mdip后缀的文件夹。删除所有values-xx,但要保留values-hdip,values-land,values-port,未必全有,但有则一定要保留。
7. 开始打包:
8.
9. //提示erro,关闭apk manager,看log,提示某些资源不存在,在里找到,基本是wallpaper_xx。均为mdip的壁纸资源,已经被我们干掉了,所以删除里的这些strings。
10.
11. 打开apk manager,执行11打包,充满欣喜的等待提示按y?您错了,继续erro。关闭apk manager。看log:
12.
13. //这回告诉你某些资源larger,and某资源找不到。对比一下,居然是hdip的壁纸呢?android你有搞错没?
14.
15. 怎么办,这不是build~~,所以只好删除掉。再次执行打包,又提示一次erro,处理方法同上。
16.
17. 打包,咦?成功了。签名安装,居然也成功了。界面居然不需要再进行微调就很接近姜饼了。本以为是需要微调layout底部电话和浏览器的位置的,结果省事了!
复制代码
大家可以重新操作一下,删除mdip的资源,但保留所有mdip的壁纸,打包就不会出任何错误~。
下面再计算一下 hdip的壁纸数量 mdip壁纸数量+删除掉的hdip壁纸数量,到这里您似乎明白了点什么了。
关于合并apk odex文件,目前只有smali这一个方案。所谓的各种快速工具都是批处理命令行而已。
smali地址:/p/smali/
1.
2.
3.
4.
// 将<>分解成class,命令:
java -jar -x <>
//会生成out目录,里面当前的odex分解的class文件
5. // 将 class 生成为,命令:
6. java -Xmx512M -jar out -o
7. //这步完成后,会在当前路径下生成。
复制代码
smali 工作所需要的 BOOTCLASSPATH(你可以把这几个jar直接丢到smali的工作目录里去):
1. , , ,
2. ,
复制代码
当然厂商定制过的ROM需要的BOOTCLASSPATH会有别于一般的AOSP,I9000的就还需要:
1. , , ,
, ,
复制代码
2024年1月20日发(作者:焦昭懿)
如果是修改CM的apk很简单,修改原始代码使用命令单独编译该apk 就可。这篇文章主要讲那该死三星闭源系统是如何在有限的环境下最大化修改你的东西。
本人不是什么高手,只是接触android的时间比较长(从G1就开始用起),爱好收集andorid历史上比较有代表性的机器,时常爱摆动手机,倒腾ROM,因为个人时间问题,一直没制作完整的作品(我比较懒XD),就连自己使用的ROM还停留在CMbeta3中文化版本。
个人关注aosp比较多点,很高兴我编译的中文版能将CM for i9000 推到大家面前,让更多的I9000用户了解到CM,当然从G1时代开始刷CM的兄弟们自然会知道CM的优秀。CM发展至今,已经不仅仅是手机ROM,他代表了一种精神,开源和共享(国内论坛有多少?),以及无所不能——这是我欣赏和推崇的。如果将CM放大到无限的时间和个人团体集合,android 会支持理论上一切可以运行它的设备。
一:基本准备!
准备工具:
Android SDK
java,下载适合您系统的版本。
您需要的是apktool 或者apk manager 4.9(貌似最新版本了)。推荐用apk manager 4.9,下面主要介绍该工具使用方法。
以上工具Windows和Linux下都有。
三星I9000 FROYO 系统应用软件在 /system/app 同大多数Android系统一样。但注意三星有着自定义的framework,在 /system/framework/。
如果您要修改三星的system app就需要用到他。
首先我们要提取出系统软件。有两种方法,第一刷完机,获取root权限之后用以下命令:
1. windows和linux下面的命令同样:
2. adb pull /system/
3. //将手机system目录copy到您电脑的某个路径中
复制代码
或者解压缩三星官方刷机包:挂载factoryfs到某路径:然后拷贝所有文件。
1. linux only:
2. mount -o loop,rw
复制代码
二:反编译apk文件
对于三星i9000反编译apk文件需要做如下工作,安装framework,至于是否要将odex和apk文件合并这里无所谓。因为不想做可安装包(做了在三星系统中也不能安装,签名不一至XD)
1. apktool if
复制代码
apk manager使用方法:apk manager的脚本运行会检测adb是否存在,如果您正确安装了sdk,并设定了环境变量,这里就能检测到。否则请将adb拷贝到apk manager主目录下来。
将需要修改的apk文件放到place-apk-here-for-modding目录内,然后执行,会看到很多选择。这里重点讲:
1.
2.
3.
4.
9 Decompile apk
//反编译APK文件,并输出到products目录。
11 Compile apk
//打包好apk文件。
复制代码
基本执行步骤就是 9 ,然后修改,再执行11打包。
当然,你无法得到三星的签名,所以迂回打包方案:
1.
2.
3.
4.
5.
6.
复制代码
1. //keep是原始apk的文件这里所有的文件将会保持原样打包到新apk里
2. //如果您修改values valus-xx 语言包,请到keep文件夹里删除
3. //如果您修改layout或者xml文件夹里的xml文件请同样删除旧的xml文件
4. 按任意键继续;
5. 将在place-apk-here-for-modding目录里生成新的apk,不过带有unsigner前缀。
复制代码
11 Compile apk
//执行打包,提示是否系统文件
选择 y
//提示blabla,是否复制原始文件
提示y
//提示blabla,按任意键继续。这里不要动。下面进入keep文件夹
1. //用winrar打开unsigerapk和原始的apk文件,将修改过的文件拖到原始apk包里覆盖。
2. //替换回系统,重启:
3. adb push /system/app/
4. 以上步骤无需重签名,汉化和修改布局,等不需要反编译odex文件。
复制代码
三:汉化和修改?
首先您已经掌握了以上的修改apk 方法。
下面谈如何汉化,一个纯正的欧版rom,除google应用,和第三方应用外,其他系统apk是不带中文语言的。
下面就以为例子:
执行9,反编译后,进入products//res/目录中,可以看到这个launcher其实是i9000和tab共用的。先不管这些,主要是修改语言包。
删除类似。values-it,values-en-rUS文件夹。
但请保留values-hdip,values-hdip-xxx,values-land,values-port,等文件夹,这些未必全有但这些不是语言包。
建立一个values-zh-rCN文件夹 (简体)
将values目录下 拷贝到values-zh-rCN里,对于一个app文件来说,汉化这两个基本就够了。另讲。
1. 用notepad2打开 ,这是主要语言包。翻译XXXX部分:如“launcher“翻译成“主屏幕“
2.
复制代码
1.
2.
3.
4.
5.
6.
7.
8.
复制代码
对于,这个基本是菜单里的选项,
如果看到表示选项的值(带_values),请不要翻译。如:
请保持原样。
翻译完成后,执行打包步骤。
删除语言包后报错?
刚刚有讲到删除了一部分语言包,有些strings是是该语言独享,并且values中的亦没有,那么删除它们合成的时候报错是必然的了。
报错了怎么办?最简单的就是别删语言包。
进阶方案:只想保留英简繁三语,其他一定要删除。请看下文:
1. 到apk manager的主目录下看log。
2. 会告诉您 行号 xxxx资源不存在。如果仅仅是删除语言包产生的错误
3. 打开,比对log文件中的行号,将其删除(删除时请注意保留该行号,以免接下来的行号不对应log中的错误行号而导致误删除。)
4. 重新执行合成步骤,看看是否报错,如果您正确处理掉多余的string,那么将不再报错。
复制代码
处理报错的唯一方法,不是问为什么会报错,请看LOG文件,会详细列举报错原因,如果您用apk manager 从来不看日志文件,那么就如同从没入门过一般。
如何处理 ?
基本上大家都知道,里的语言包种类,在大部分情况下决定settings语言切换的选项种类,那么如何对这个包删减和增添呢(一般我们只保留英语,简体中文,和繁体中文)?
也是一个apk,比较特殊,但修改方法同一般apk就可以。
1. 将raw-xx 文件夹删除,只保留raw,raw-zh-rTW,raw-zh-rCN三个
2. 将values-xx以及values-mcc数字-xx,删除,但保留values-land
values-port values-hdip values-zh-rCN values-zh-rTW, values-mcc数字-zh-rCN, values-mcc数字-zh-rTW,等
3. 没有中文语言包,建立,拷贝values内的过来,并汉化。并且将其中的map相关参数,改成中国(请参照其他中文ROM)
复制代码
汉化framework是一项艰苦的工作,需要毅力和时间,以及细心。有些选项和词语不能过长,否则越界显示不全。汉化工作是有偷懒的方法,除非您建立了一个完善的汉化资源库,第一次汉化千万不要使用这方法,可以参照词典取实际意境翻译,但千万不要google翻译一下。
1. 请备份原始的,并制作成刷机包
2. 替换回去,您猜对了,重启之后,不FC的话,测试系统菜单,看看是否汉化完成了!
3. 如果FC,请进入recovery模式还原回来,然后再修改测试,直到成功为止。
复制代码
对于三星ROM,即使你修改了,只保留了英语,简体,繁体三语之后,还是远远不够的,因为三星还多了一个twframework
如何处理twframework?
说到底只是一个特殊的apk文件,他有着apk文件的特性(可以被反编译XD),亦有着区别app的特点,包含系统的资源(大部分是图片资源,以及菜单,按钮样式等),不能随意删除。
此楼同步更新:如何读懂反编译后的代码?反编译后的代码具有一定的可读性,但比起原始代码可读性要差,尤其是smali文件;下面谈谈如何读这个res文件夹。此楼同步二楼内容更新,战线开太长,更新会比较慢,我要整理一下思路,会一边写,一边重新排版,有可能早上和下午读的内容排版有很大不同,不要介意。
呃,反编译完一个apk之后,res文件夹里有很多xml文件,新手拿到基本会无从下手,下面简单谈谈如何读一个xml文件。
drawable文件夹,一般用来放一些图片(及少)以及交互样式:XML。
1.
2.
3.
4.
5.
//定义了,按键三种状态的样式,使用到的素材在@drawable 文件夹中,这个@drawoable在那里?320X240的荧幕在drawable-mdip,我们的i9000就在drawable-hdip里面。
复制代码
知道了这一点,我们就可以很轻松的修改一个按钮的交互样式,你所作的不仅仅是替换图片了,可以add图片,并在public文件中添加strings,但要记住,该strings必须在该类别的最后。
layout文件夹,用来存储布局样式。如果有横竖屏界面的话,还会有layout-port,layout-land。以及区分分辨率的layout-mdip,layout-hdip等。
values以及values-xx,这里是调整软件默认设定值以及界面语言。
当然还有一个XML文件夹。很多东西都要靠自己摸索。
下面举例我是如何将froyo的launcher2修改成为姜饼样式的。
1.
2. 第一步,分别从2.2和2.3的SDK中提取两个。分别反编译这两个包,并保持2.2的在apk manager里为当前编辑状态。
3.
4. 对比drawable-hdip,drawable-hdip-land?将相同命名的图片覆盖过去,至于壁纸以及一些图标都是一样的就不用复制了。
5.
6. 删除一切带有mdip后缀的文件夹。删除所有values-xx,但要保留values-hdip,values-land,values-port,未必全有,但有则一定要保留。
7. 开始打包:
8.
9. //提示erro,关闭apk manager,看log,提示某些资源不存在,在里找到,基本是wallpaper_xx。均为mdip的壁纸资源,已经被我们干掉了,所以删除里的这些strings。
10.
11. 打开apk manager,执行11打包,充满欣喜的等待提示按y?您错了,继续erro。关闭apk manager。看log:
12.
13. //这回告诉你某些资源larger,and某资源找不到。对比一下,居然是hdip的壁纸呢?android你有搞错没?
14.
15. 怎么办,这不是build~~,所以只好删除掉。再次执行打包,又提示一次erro,处理方法同上。
16.
17. 打包,咦?成功了。签名安装,居然也成功了。界面居然不需要再进行微调就很接近姜饼了。本以为是需要微调layout底部电话和浏览器的位置的,结果省事了!
复制代码
大家可以重新操作一下,删除mdip的资源,但保留所有mdip的壁纸,打包就不会出任何错误~。
下面再计算一下 hdip的壁纸数量 mdip壁纸数量+删除掉的hdip壁纸数量,到这里您似乎明白了点什么了。
关于合并apk odex文件,目前只有smali这一个方案。所谓的各种快速工具都是批处理命令行而已。
smali地址:/p/smali/
1.
2.
3.
4.
// 将<>分解成class,命令:
java -jar -x <>
//会生成out目录,里面当前的odex分解的class文件
5. // 将 class 生成为,命令:
6. java -Xmx512M -jar out -o
7. //这步完成后,会在当前路径下生成。
复制代码
smali 工作所需要的 BOOTCLASSPATH(你可以把这几个jar直接丢到smali的工作目录里去):
1. , , ,
2. ,
复制代码
当然厂商定制过的ROM需要的BOOTCLASSPATH会有别于一般的AOSP,I9000的就还需要:
1. , , ,
, ,
复制代码