手动 转移任意APP为系统APP的方法流程简述

宗旨: 保持和系统原本同目录下的文件各种设置(权限,所有者,SE上下文),目录结构保持一致即可!

  1. 从 /data/app/里将对应的APP文件移动到 /system/app 里.

    Android 5.0 之后的系统在APP目录里可能存在 AppName/AppName.apk 目录等,都需要全部移动走.

  2. 设置APP的文件权限为(0644)
  3. 所有者为(0:0,root:root)
  4. SE上下文为u:object_r:system_file:s0(部分系统开启了SELinux子系统时才需要设置)
  5. 重启即可

将任意APP转换为OPPO的Color OS 系统APP方法步骤:

由于OPPO的ColorOS系统定制了系统底层,使之无法识别在系统目录里的非OPPO应用.

所以需要将需要转换的APP包名增加到OPPO应用白名单里才能保证转移后开机识别到.

  1. 使用 加密文件 **pl.fs** 生成算法 将任意APP的PackageName包名增加进去得到新pl.fs

  2. 将新pl.fs文件替换老的/system/etc/security/pl.fs文件
  3. 使用钛备份幸运破解器手动将任意APP - 转换为系统应用即可.

包含Oppo所有APP应用程序包名列表的 加密文件 pl.fs 生成算法

try
{
//生成加密文件
mOppoApkList.add("cn.asiontang.launcher");
StringBuilder stringBuilder = new StringBuilder();
for (String p : mOppoApkList)
stringBuilder.append(p).append("\n");
final byte[] bytes = stringBuilder.toString().getBytes("UTF-8");
for (int i = 0; i < bytes.length; i++)
{
bytes[i] = (byte) (~bytes[i]);
bytes[i] = (byte) (bytes[i] ^ a);
}
new FileOutputStream(new File(Environment.getExternalStorageDirectory(), "pl.fs")).write(bytes);
}
catch (Exception e)
{
e.printStackTrace();
}

ReadEncryptFile 读取 mOppoApkList 关键的解密函数(翻译为JAVA代码)

try
{
final InputStream open = getResources().getAssets().open("pl.fs");
byte[] pl = new byte[open.available()];
final byte[] a = "a".getBytes("UTF-8");
final int read = open.read(pl);
for (int i = 0; i < read; i++)
{
pl[i] = (byte) (pl[i] ^ a[0]);
pl[i] = (byte) (~pl[i]);
}
final String s = new String(pl, 0, read);
final String[] split = s.split("\n");
mOppoApkList.addAll(Arrays.asList(split));
}
catch (Exception e)
{
e.printStackTrace();
}

ReadEncryptFile 读取 mOppoApkList 关键的解密函数(反编译为 .smali 代码)

.method public static ReadEncryptFile()I
.registers 15
00000000 const/4 v12, 0
00000002 const/4 v11, -1
00000004 const/4 v3, 0
:6
00000006 const-string v13, "ColorPackageManager"
0000000A const-string v14, "ReadEncryptFile!!!"
0000000E invoke-static Slog->d(String, String)I, v13, v14
00000014 new-instance v9, File
00000018 const-string v13, "/system/etc/security/pl.fs"
0000001C invoke-direct File-><init>(String)V, v9, v13
00000022 invoke-virtual-quick vtaboff@19, v9
:28
00000028 move-result v13
0000002A if-nez v13, :3A
:2E
0000002E if-eqz v3, :38
:32
00000032 invoke-virtual-quick vtaboff@12, v3
:38
00000038 return v11
:3A
0000003A invoke-virtual-quick vtaboff@36, v9
00000040 move-result-wide v13
00000042 long-to-int v7, v13
00000044 new-array v1, v7, [B
00000048 const-string v13, "a"
0000004C const-string v14, "UTF-8"
00000050 invoke-virtual-quick vtaboff@27, v13, v14
00000056 move-result-object v0
00000058 new-instance v4, FileInputStream
0000005C invoke-direct FileInputStream-><init>(File)V, v4, v9
:62
00000062 invoke-virtual-quick vtaboff@16, v4, v1
00000068 const/4 v5, 0
:6A
0000006A if-ge v5, v7, :94
:6E
0000006E aget-byte v13, v1, v5
00000072 const/4 v14, 0
00000074 aget-byte v14, v0, v14
00000078 xor-int/2addr v13, v14
0000007A int-to-byte v13, v13
0000007C aput-byte v13, v1, v5
00000080 aget-byte v13, v1, v5
00000084 xor-int/lit8 v13, v13, -0x01
00000088 int-to-byte v13, v13
0000008A aput-byte v13, v1, v5
0000008E add-int/lit8 v5, v5, 0x01
00000092 goto :6A
:94
00000094 new-instance v10, String
00000098 const/4 v13, 0
0000009A invoke-direct String-><init>([B, I, I)V, v10, v1, v13, v7
000000A0 const-string v13, "\n"
000000A4 invoke-virtual-quick vtaboff@49, v10, v13
000000AA move-result-object v8
000000AC const/4 v6, 0
:AE
000000AE array-length v13, v8
000000B0 if-ge v6, v13, :10C
:B4
000000B4 sget-object v13, ColorPackageManagerHelper->mOppoApkList:ArrayList
000000B8 aget-object v14, v8, v6
000000BC invoke-virtual-quick vtaboff@11, v13, v14
:C2
000000C2 add-int/lit8 v6, v6, 0x01
000000C6 goto :AE
:C8
000000C8 move-exception v2
:CA
000000CA invoke-virtual-quick vtaboff@19, v2
:D0
000000D0 if-eqz v3, :38
:D4
000000D4 invoke-virtual-quick vtaboff@12, v3
:DA
000000DA goto :38
:DC
000000DC move-exception v2
:DE
000000DE invoke-virtual-quick vtaboff@19, v2
000000E4 goto :38
:E6
000000E6 move-exception v2
:E8
000000E8 invoke-virtual-quick vtaboff@19, v2
:EE
000000EE if-eqz v3, :38
:F2
000000F2 invoke-virtual-quick vtaboff@12, v3
:F8
000000F8 goto :38
:FA
000000FA move-exception v2
000000FC goto :DE
:FE
000000FE move-exception v11
:100
00000100 if-eqz v3, :10A
:104
00000104 invoke-virtual-quick vtaboff@12, v3
:10A
0000010A throw v11
:10C
0000010C if-eqz v4, :116
:110
00000110 invoke-virtual-quick vtaboff@12, v4
:116
00000116 move v11, v12
00000118 goto :38
:11A
0000011A move-exception v2
0000011C invoke-virtual-quick vtaboff@19, v2
00000122 goto :10A
:124
00000124 move-exception v2
00000126 goto :DE
:128
00000128 move-exception v2
0000012A invoke-virtual-quick vtaboff@19, v2
00000130 goto :116
:132
00000132 move-exception v11
00000134 move-object v3, v4
00000136 goto :100
:138
00000138 move-exception v2
0000013A move-object v3, v4
0000013C goto :E8
:13E
0000013E move-exception v2
00000140 move-object v3, v4
00000142 goto :CA
.catch FileNotFoundException {:6 .. :28} :C8
.catch IOException {:6 .. :28} :E6
.catchall {:6 .. :28} :FE
.catch IOException {:32 .. :38} :124
.catch FileNotFoundException {:3A .. :62} :C8
.catch IOException {:3A .. :62} :E6
.catchall {:3A .. :62} :FE
.catch FileNotFoundException {:62 .. :C2} :13E
.catch IOException {:62 .. :C2} :138
.catchall {:62 .. :C2} :132
.catchall {:CA .. :D0} :FE
.catch IOException {:D4 .. :DA} :DC
.catchall {:E8 .. :EE} :FE
.catch IOException {:F2 .. :F8} :FA
.catch IOException {:104 .. :10A} :11A
.catch IOException {:110 .. :116} :128
.end method

为啥无论是通过软件还是手动移植APP到系统System APP目录下都无法生效?同样的手法别的手机却可以.

费尽千辛万苦终于找到原因为:

PackageManager: This is not oppo app, so skip it :/system/app/cn.xx.launcher-1.apk

反编译ROM里的 services.odex - PackageManagerService.java - ColorPackageManagerHelper.java - IsOppoApkListReadEncryptFile - 加密的"/system/etc/security/pl.fs"文件

OPPO 1107 移动定制版本的区别 和 刷机包的选择

原来的系统开机启动时会有移动 4G LTE 的LOGO,刷了 1107_11_A.20_OTA_020_all_201512151836.zip 版本(OPPO 论坛官网下载的)之后,就没有了。功能则基本测试都正常。

移动定制版本 1107_11_B.03_XXXXXX ROM版本没公开的市场版本ROM新.就没测试.

SELinux 如何修改权限

  1. 使用 ls -Z 可以查看文件的 各种权限

  2. 使用 chcon u:object_r:system_file:s0 XX.APK 修改SE上下文

  3. 使用 Root Explorer 可以修改所有者,权限,SE上下文.

Root 后卸载 KingRoot 换用 SuperSu 的方法

  1. 通过刷机精灵 或者 RootGenius Root精灵 成功 Root 掉 OPPO 1107 设备
  2. 此时系统里安装的是 KingRoot APP来管理 Root权限
  3. 然后安装第三方 Recovery

    如可通过 'Official TWRP App' APP 即可刷入 第三方Recovery镜像.

  4. 然后进入 Recovery 卡刷完整 ROM包 1107_11_A.20_OTA_020_all_201512151836.zip
  5. 在重启时,会提示"是否禁止还原到官方Recovery" 选择 "否"

    如果选择是,则第三方 Recovery 还将保留,但是 无法进入下一个选择"是否Root"的界面了.

  6. 然后弹出"是否Root" 选择 "是"
  7. 重启之后,安装 SuperSu APP即可.

支持将APK软件 ODEX 化的APP有:

  1. 幸运破解器

    点击指定APP - 工具箱 - Odex化此应用

  2. 钛备份

    点击指定APP - 转换为系统程序

  3. Link2SD ??

    点击指定APP - ??

OPPO.1107刷机笔记的更多相关文章

  1. oppo X907刷机包 COLOROS 1.0 正式版公布 安卓4.2.2

    ROM介绍 本版本号将是X907史上最好的一版本号 全新COLOROS的UI 更新全局手势板操作 优化高速启动应用 安全保障中心也是一直採用COLOROS组成的 COLOROS 1.0给用户带来在线音 ...

  2. OPPO A7X 刷机小结

    OPPO A7X 刷机小结: 概述:根据网上找到的教程(MTK模式刷机教程),没有成功.在QQ上询问一位提供刷机服务的大神,说是只有老版本才能刷. 操作步骤: 刷机工具: MediaTek SP Fl ...

  3. OPPO A57 刷机(官方安装包)+完美Root+ 破解主题+屏蔽Root顶部红色框+NV修复

    朋友说她的手机被被人刷后,有许多预装的软件问我能不能处理下,让我装个纯净版. 开机可以看到预装了许多软件,通常想要删除预装软件就必须Root,于是下载刷机精灵,360刷机大师,线刷包之类的软件Root ...

  4. vivo和OPPO手机刷机

    vivo和OPPO手机是蓝绿两厂,定位年轻时尚女士,比较注重拍照和听音乐,其他无视. 系统很少更新,Root和刷机也比较困难,建议是直接卡刷. 小米手机耍猴(猴子精,代指懂点手机的人) 蓝绿两厂是耍猪 ...

  5. OPPO R11刷机初体验

    刷机目的 最初打算是用旧手机搭一个服务器,首先想到的是刷一个Linux系统,但这太难了,我搞不定,然后就想着可以用一些软件比如KSWEB之类的来代替,但是想要访问80端口的话还是需要root,但是普通 ...

  6. Sony Z1 flashtool 刷机笔记

    第一次硬刷,(相较于recovery的卡刷)差点变成无限重启..记录一些关键步骤: 1 unlock bootloader http://developer.sonymobile.com/unlock ...

  7. Ye.云狐J2刷机笔记 | 完美切换内部存储卡和SD卡的改法.vold.fstab

    ================================================================================Ye.完美切换内部存储卡和SD卡成功.v ...

  8. K2路由器刷机笔记

    临近双11,K2路由器广告加的越来越放肆,实在太难忍受就刷了个固件.这里把路由器刷机的一般流程记录一下. 一.开启telnet 刷固件,首先要取得路由器系统的控制权,这样我们才能自由的进行操作. 方法 ...

  9. Android刷机教程

    我的机器是Nexus 5 一. 安装驱动 如何进入fastboot模式 1. 拔掉数据线,将手机关机 2. 关机后同时按住[音量减小键]和[开关机键]即可进入Fastboot模式 开启usb调试  - ...

随机推荐

  1. Linux命令之install

    install [选项] 源文件 目标文件 install [选项] 源文件 目录 install [选项] –t 目录 源文件 install [选项] –d 目录 install作用是安装或升级软 ...

  2. 简化的INSERT语句

    INSERT语句中也并不需要我们指定表中的所有列,比如在插入数据的时候某些字段没有值,我们可以忽略这些字段.下面我们插入一条没有备注信息的数据: INSERT INTO T_Person(FAge,F ...

  3. MySQL json 类型操作快速入门

    MySQL 5.7.8开始支持 json类型. create table t(id int,js json,PRIMARY KEY (`id`)) 插入数据insert into t values(1 ...

  4. [TC-FindingFriends]Finding Friends

    题目大意: 给定一个长度为$n(n\le10^5)$的数列$A(A_i\le10^9)$,求最小的$k$满足存在一个长度至少为$m(m\le n)$的子串,对于串中的每一个数$A_i$,都至少存在一个 ...

  5. Java高级架构师(一)第19节:X-gen生成相应的Visitor

    package cn.javass.themes.smvcsm.visitors; import cn.javass.xgen.genconf.vo.ExtendConfModel; import c ...

  6. 从系统相册中选择GIF图片上传到服务器

    -(void)assetPickerController:(ZYQAssetPickerController *)picker didFinishPickingAssets:(NSArray *)as ...

  7. springmvc-框架学习

    https://www.androiddev.net/springmvc-框架学习一-helloworld/

  8. P2P通信标准协议(二)之TURN

    上一篇P2P通信标准协议(一)介绍了在NAT上进行端口绑定的通用规则,应用程序可以根据这个协议来设计网络以外的通信. 但是,STUN/RFC5389协议里能处理的也只有市面上大多数的Cone NAT( ...

  9. 对list_entry(ptr, type, member)的理解

    如何根据一个结构体成员的地址.结构体类型以及该结构体成员名获得该结构体的首地址? #define list_entry(ptr, type, member) \ ((type *)((char *)( ...

  10. 【枚举】【SDOI 2011】【bzoj 2241】打地鼠

    2241: [SDOI2011]打地鼠 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 877 Solved: 557 Description 打地鼠是 ...