手动 转移任意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. HDU2923 Einbahnstrasse (Floyd)

    Einbahnstrasse Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  2. boost::operators

    boost 的 operators 提供了comparison operators.arithmetic operators.operators for iterators 操作.虽然使用 C++ 的 ...

  3. oracle to_char FM099999

    to_char(column,'FM099999') The FM in the format removes leading and trailing blanks.

  4. mysql 列转行,合并字段的方法

    数据表(表名:xsk) +----+------+-----------+-------+ | id | name| course | score | +----+------+----------- ...

  5. intellij idea android错误: Missing styles. Is the correct theme chosen for this layout?

    Missing styles. Is the correct theme chosen for this layout? Use the Theme combo box above the layou ...

  6. 【找规律】Divide by Zero 2017 and Codeforces Round #399 (Div. 1 + Div. 2, combined) B. Code For 1

    观察一下,将整个过程写出来,会发现形成一棵满二叉树,每一层要么全是0,要么全是1. 输出的顺序是其中序遍历. 每一层的序号形成等差数列,就计算一下就可以出来每一层覆盖到的区间的左右端点. 复杂度O(l ...

  7. [POI2001]Peaceful Commission

    题目大意: 有n个国家要派代表开会,每个国家有两个代表可供选择. 有m对代表有仇,不能同时开会. 若每个国家只能派一个代表开会,问是否存在一种方案,使得每个国家都能正常参会? 如果有,输出字典序最小的 ...

  8. 1.3(Mybatis学习笔记)动态SQL

    一.<if> 使用<if>可以根据具体情况来拼接SQL语句,使其更加灵活更加适应我们的需求. <if>的标签体中是需要拼接的语句,满足条件才会将其进行拼接. < ...

  9. 倒置输入的数 Exercise07_02

    import java.util.Scanner; /** * @author 冰樱梦 * 时间:2018年下半年 * 题目:倒置输入的数 * */ public class Exercise07_0 ...

  10. mongodb_服务端安装及连接

    安装环境:Windows7  64位    附件内容: 1.mongodb Windows7 补丁:451413_intl_x64_zip.exe 2.mongodb Windows 安装程序:mon ...