├── .gitignore ├── README.md ├── apkpatch-1.0.3 ├── 1.apk ├── 2.apk ├── apkpatch-1.0.3.jar ├── apkpatch.bat ├── apkpatch.sh ├── debug.keystore ├── lbpatch │ ├── diff.dex │ ├── out.apatch │ └── smali │ │ └── me │ │ └── yifeiyuan │ │ └── library │ │ └── XiHa_CF.smali ├── patch │ ├── diff.dex │ ├── out.apatch │ └── smali │ │ └── me │ │ └── yifeiyuan │ │ └── andfixdemo │ │ └── A_CF.smali ├── tl.apk └── tl2.apk ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── me │ │ └── yifeiyuan │ │ └── andfixdemo │ │ └── ApplicationTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── me │ │ │ └── yifeiyuan │ │ │ └── andfixdemo │ │ │ ├── A.java │ │ │ ├── App.java │ │ │ ├── F.java │ │ │ ├── Fix.java │ │ │ ├── MainActivity.java │ │ │ └── O.java │ └── res │ │ ├── layout │ │ ├── activity_main.xml │ │ └── content_main.xml │ │ ├── menu │ │ └── menu_main.xml │ │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxxhdpi │ │ └── ic_launcher.png │ │ ├── values-v21 │ │ └── styles.xml │ │ ├── values-w820dp │ │ └── dimens.xml │ │ └── values │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── me │ └── yifeiyuan │ └── andfixdemo │ └── ExampleUnitTest.java ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── library ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── me │ │ └── yifeiyuan │ │ └── library │ │ └── ApplicationTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── me │ │ │ └── yifeiyuan │ │ │ └── library │ │ │ └── XiHa.java │ └── res │ │ └── values │ │ └── strings.xml │ └── test │ └── java │ └── me │ └── yifeiyuan │ └── library │ └── ExampleUnitTest.java └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | /.idea 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # AndFixDemo 2 | 3 | 关于为什么要选择AndFix,可以去看看我之前写的文章[AndFix的抉择](http://mp.weixin.qq.com/s?__biz=MzIxNDE1NjQ2Mw==&mid=502388594&idx=1&sn=b75e11e37daa8b9d9229e11bafbe9c14#rd) 4 | 5 | AndroidStudio,AndFix的Demo(官方的Demo是Eclipse的) 6 | 7 | APK我已经生成好了,另加基本使用教程(官方的文档写的不是很清晰) 8 | 9 | 反正我什么都准备好了,想体验一下的可以看一下!! 10 | 11 | ## 直接体验 12 | 13 | 我已经准备好了一切,是不是超贴心! 14 | 15 | ### 安装 1.apk 16 | ``` 17 | cd apkpatch-1.0.3 18 | adb install 1.apk 19 | ``` 20 | Run 起来,查看 log,Tag为 MainActivity,可以看到日志: 21 | 22 | 23 | ``` 24 | MainActivity: a 25 | MainActivity: 0 26 | MainActivity: 10 27 | ``` 28 | 29 | ### push 补丁到SD卡 30 | 31 | 把apatch push到SD卡 sdcard 是我的路径 根据自己的路径来 32 | ``` 33 | adb push patch/out.apatch /sdcard/ 34 | ``` 35 | ### 重新安装1.apk 并run 36 | 37 | ``` 38 | adb install -r 1.apk 39 | ``` 40 | 41 | Run 起来,Tag 为`APP`有如下日志输出: 42 | 43 | ``` 44 | App: inited. 45 | App: apatch loaded. 46 | App: apatch:/storage/emulated/0/out.apatch added. 47 | ``` 48 | 49 | MainActivity 日志 : 50 | 51 | ``` 52 | MainActivity: b (不再是a而是b了!) 53 | MainActivity: 0 54 | MainActivity: 10 55 | ``` 56 | 57 | 同时,TAG为`euler` 也有`fix success`的信息输出 58 | 59 | 表示成功啦!~ 60 | 61 | 62 | ## 生成apatch 63 | 64 | 官方没有给具体的实例,这里我提供一个实例: 65 | 66 | 注意我的是MAC,所以是`.sh`文件,debugkeystore是AS自带的,2.apk是新的apk,1是旧的 67 | 68 | ``` 69 | ./apkpatch.sh -f 2.apk -t 1.apk -k debug.keystore -p android -a androiddebugkey -e android -o patch 70 | ``` 71 | 72 | 执行完会有如下日志输出,并且在patch目录下生成补丁文件 73 | 74 | ``` 75 | add modified Method:Ljava/lang/String; a(Ljava/lang/String;) in Class:Lme/yifeiyuan/andfixdemo/A; 76 | add new Method:Ljava/lang/String; c() in Class:Lme/yifeiyuan/andfixdemo/A; 77 | add modified Method:I b(Ljava/lang/String;Ljava/lang/String;) in Class:Lme/yifeiyuan/andfixdemo/A; 78 | ``` 79 | 80 | 81 | 82 | 83 | 84 | 85 | [![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/AlanCheen/andfixdemo/trend.png)](https://bitdeli.com/free "Bitdeli Badge") 86 | 87 | -------------------------------------------------------------------------------- /apkpatch-1.0.3/1.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/AndFixDemo/25fb24efd233780775a7bf03203fdfae4a90c9fc/apkpatch-1.0.3/1.apk -------------------------------------------------------------------------------- /apkpatch-1.0.3/2.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/AndFixDemo/25fb24efd233780775a7bf03203fdfae4a90c9fc/apkpatch-1.0.3/2.apk -------------------------------------------------------------------------------- /apkpatch-1.0.3/apkpatch-1.0.3.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/AndFixDemo/25fb24efd233780775a7bf03203fdfae4a90c9fc/apkpatch-1.0.3/apkpatch-1.0.3.jar -------------------------------------------------------------------------------- /apkpatch-1.0.3/apkpatch.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | REM 4 | REM ApkPatch - a tool for build/merge Android Patch file (.apatch). 5 | REM Copyright 2015 supern lee 6 | REM 7 | REM http://gitlab.alibaba-inc.com/groups/euler/CloudFix 8 | REM 9 | 10 | java -Xms512m -Xmx1024m -jar "%~dp0apkpatch-1.0.3.jar" %* 11 | -------------------------------------------------------------------------------- /apkpatch-1.0.3/apkpatch.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # 4 | # ApkPatch - a tool for build/merge Android Patch file (.apatch). 5 | # Copyright 2015 supern lee 6 | # 7 | # http://gitlab.alibaba-inc.com/groups/euler/CloudFix 8 | # 9 | PRG="$0" 10 | while [ -h "$PRG" ] ; do 11 | ls=`ls -ld "$PRG"` 12 | link=`expr "$ls" : '.*-> \(.*\)$'` 13 | if expr "$link" : '/.*' > /dev/null; then 14 | PRG="$link" 15 | else 16 | PRG=`dirname "$PRG"`/"$link" 17 | fi 18 | done 19 | PRGDIR=`dirname "$PRG"` 20 | 21 | java -Xms512m -Xmx1024m -jar $PRGDIR/apkpatch-1.0.3.jar "$@" -------------------------------------------------------------------------------- /apkpatch-1.0.3/debug.keystore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/AndFixDemo/25fb24efd233780775a7bf03203fdfae4a90c9fc/apkpatch-1.0.3/debug.keystore -------------------------------------------------------------------------------- /apkpatch-1.0.3/lbpatch/diff.dex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/AndFixDemo/25fb24efd233780775a7bf03203fdfae4a90c9fc/apkpatch-1.0.3/lbpatch/diff.dex -------------------------------------------------------------------------------- /apkpatch-1.0.3/lbpatch/out.apatch: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/AndFixDemo/25fb24efd233780775a7bf03203fdfae4a90c9fc/apkpatch-1.0.3/lbpatch/out.apatch -------------------------------------------------------------------------------- /apkpatch-1.0.3/lbpatch/smali/me/yifeiyuan/library/XiHa_CF.smali: -------------------------------------------------------------------------------- 1 | .class public Lme/yifeiyuan/library/XiHa_CF; 2 | .super Ljava/lang/Object; 3 | .source "XiHa.java" 4 | 5 | 6 | # static fields 7 | .field private static final TAG:Ljava/lang/String; = "XiHa" 8 | 9 | 10 | # direct methods 11 | .method public constructor ()V 12 | .locals 0 13 | 14 | .prologue 15 | .line 28 16 | invoke-direct {p0}, Ljava/lang/Object;->()V 17 | 18 | return-void 19 | .end method 20 | 21 | .method public static xiha()V 22 | .locals 2 23 | .annotation runtime Lcom/alipay/euler/andfix/annotation/MethodReplace; 24 | method = "xiha" 25 | clazz = "me.yifeiyuan.library.XiHa" 26 | .end annotation 27 | 28 | .prologue 29 | .line 36 30 | const-string v0, "XiHa" 31 | 32 | const-string v1, "after fix " 33 | 34 | invoke-static {v0, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I 35 | 36 | .line 37 37 | return-void 38 | .end method 39 | -------------------------------------------------------------------------------- /apkpatch-1.0.3/patch/diff.dex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/AndFixDemo/25fb24efd233780775a7bf03203fdfae4a90c9fc/apkpatch-1.0.3/patch/diff.dex -------------------------------------------------------------------------------- /apkpatch-1.0.3/patch/out.apatch: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/AndFixDemo/25fb24efd233780775a7bf03203fdfae4a90c9fc/apkpatch-1.0.3/patch/out.apatch -------------------------------------------------------------------------------- /apkpatch-1.0.3/patch/smali/me/yifeiyuan/andfixdemo/A_CF.smali: -------------------------------------------------------------------------------- 1 | .class public Lme/yifeiyuan/andfixdemo/A_CF; 2 | .super Ljava/lang/Object; 3 | .source "A.java" 4 | 5 | 6 | # static fields 7 | .field static i:I 8 | 9 | .field private static o:Lme/yifeiyuan/andfixdemo/O; 10 | 11 | 12 | # instance fields 13 | .field s:Ljava/lang/String; 14 | 15 | 16 | # direct methods 17 | .method static constructor ()V 18 | .locals 2 19 | 20 | .prologue 21 | .line 50 22 | new-instance v0, Lme/yifeiyuan/andfixdemo/O; 23 | 24 | const-string v1, "fix" 25 | 26 | invoke-direct {v0, v1}, Lme/yifeiyuan/andfixdemo/O;->(Ljava/lang/String;)V 27 | 28 | sput-object v0, Lme/yifeiyuan/andfixdemo/A_CF;->o:Lme/yifeiyuan/andfixdemo/O; 29 | 30 | .line 51 31 | const/16 v0, 0xb 32 | 33 | sput v0, Lme/yifeiyuan/andfixdemo/A_CF;->i:I 34 | 35 | return-void 36 | .end method 37 | 38 | .method public constructor ()V 39 | .locals 1 40 | 41 | .prologue 42 | .line 30 43 | invoke-direct {p0}, Ljava/lang/Object;->()V 44 | 45 | .line 31 46 | const-string v0, "s" 47 | 48 | iput-object v0, p0, Lme/yifeiyuan/andfixdemo/A_CF;->s:Ljava/lang/String; 49 | 50 | return-void 51 | .end method 52 | 53 | .method public static a(Ljava/lang/String;)Ljava/lang/String; 54 | .locals 2 55 | .param p0, "str" # Ljava/lang/String; 56 | .annotation runtime Lcom/alipay/euler/andfix/annotation/MethodReplace; 57 | clazz = "me.yifeiyuan.andfixdemo.A" 58 | method = "a" 59 | .end annotation 60 | 61 | .prologue 62 | .line 54 63 | const-string v0, "qq" 64 | 65 | invoke-static {v0, p0}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I 66 | 67 | .line 55 68 | const-string v0, "euler" 69 | 70 | const-string v1, "fix succes" 71 | 72 | invoke-static {v0, v1}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I 73 | 74 | .line 56 75 | const-string v0, "b" 76 | 77 | return-object v0 78 | .end method 79 | 80 | .method private c()Ljava/lang/String; 81 | .locals 1 82 | 83 | .prologue 84 | .line 68 85 | const-string v0, "a" 86 | 87 | return-object v0 88 | .end method 89 | 90 | 91 | # virtual methods 92 | .method public b(Ljava/lang/String;Ljava/lang/String;)I 93 | .locals 3 94 | .param p1, "s1" # Ljava/lang/String; 95 | .param p2, "s2" # Ljava/lang/String; 96 | .annotation runtime Lcom/alipay/euler/andfix/annotation/MethodReplace; 97 | clazz = "me.yifeiyuan.andfixdemo.A" 98 | method = "b" 99 | .end annotation 100 | 101 | .prologue 102 | .line 60 103 | const-string v0, "euler" 104 | 105 | invoke-static {v0, p1}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I 106 | 107 | .line 61 108 | const-string v0, "euler" 109 | 110 | new-instance v1, Ljava/lang/StringBuilder; 111 | 112 | invoke-direct {v1}, Ljava/lang/StringBuilder;->()V 113 | 114 | sget v2, Lme/yifeiyuan/andfixdemo/A;->i:I 115 | 116 | invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder; 117 | 118 | move-result-object v1 119 | 120 | const-string v2, "==" 121 | 122 | invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; 123 | 124 | move-result-object v1 125 | 126 | invoke-direct {p0}, Lme/yifeiyuan/andfixdemo/A_CF;->c()Ljava/lang/String; 127 | 128 | move-result-object v2 129 | 130 | invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; 131 | 132 | move-result-object v1 133 | 134 | invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; 135 | 136 | move-result-object v1 137 | 138 | invoke-static {v0, v1}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I 139 | 140 | .line 62 141 | const-string v0, "euler" 142 | 143 | new-instance v1, Ljava/lang/StringBuilder; 144 | 145 | invoke-direct {v1}, Ljava/lang/StringBuilder;->()V 146 | 147 | const-string v2, "fix succes" 148 | 149 | invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; 150 | 151 | move-result-object v1 152 | 153 | iget-object v2, p0, Lme/yifeiyuan/andfixdemo/A_CF;->s:Ljava/lang/String; 154 | 155 | invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; 156 | 157 | move-result-object v1 158 | 159 | invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; 160 | 161 | move-result-object v1 162 | 163 | invoke-static {v0, v1}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I 164 | 165 | .line 63 166 | const-string v0, "euler" 167 | 168 | sget-object v1, Lme/yifeiyuan/andfixdemo/A;->o:Lme/yifeiyuan/andfixdemo/O; 169 | 170 | iget-object v1, v1, Lme/yifeiyuan/andfixdemo/O;->s:Ljava/lang/String; 171 | 172 | invoke-static {v0, v1}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I 173 | 174 | .line 64 175 | const/4 v0, 0x0 176 | 177 | return v0 178 | .end method 179 | 180 | .method public getI()I 181 | .locals 1 182 | 183 | .prologue 184 | .line 47 185 | sget v0, Lme/yifeiyuan/andfixdemo/A;->i:I 186 | 187 | return v0 188 | .end method 189 | -------------------------------------------------------------------------------- /apkpatch-1.0.3/tl.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/AndFixDemo/25fb24efd233780775a7bf03203fdfae4a90c9fc/apkpatch-1.0.3/tl.apk -------------------------------------------------------------------------------- /apkpatch-1.0.3/tl2.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/AndFixDemo/25fb24efd233780775a7bf03203fdfae4a90c9fc/apkpatch-1.0.3/tl2.apk -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 23 5 | buildToolsVersion "24.0.0 rc1" 6 | 7 | defaultConfig { 8 | applicationId "me.yifeiyuan.andfixdemo" 9 | minSdkVersion 15 10 | targetSdkVersion 23 11 | versionCode 1 12 | versionName "1.0" 13 | } 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | } 21 | 22 | dependencies { 23 | compile fileTree(dir: 'libs', include: ['*.jar']) 24 | testCompile 'junit:junit:4.12' 25 | compile 'com.android.support:appcompat-v7:23.2.1' 26 | compile 'com.android.support:design:23.2.1' 27 | compile 'com.alipay.euler:andfix:0.4.0@aar' 28 | compile project(':library') 29 | } 30 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /Users/yifeiyuan/Library/Android/sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /app/src/androidTest/java/me/yifeiyuan/andfixdemo/ApplicationTest.java: -------------------------------------------------------------------------------- 1 | package me.yifeiyuan.andfixdemo; 2 | 3 | import android.app.Application; 4 | import android.test.ApplicationTestCase; 5 | 6 | /** 7 | * Testing Fundamentals 8 | */ 9 | public class ApplicationTest extends ApplicationTestCase { 10 | public ApplicationTest() { 11 | super(Application.class); 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 16 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /app/src/main/java/me/yifeiyuan/andfixdemo/A.java: -------------------------------------------------------------------------------- 1 | /* 2 | * 3 | * Copyright (c) 2015, alipay.com 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | 18 | package me.yifeiyuan.andfixdemo; 19 | 20 | import android.util.Log; 21 | 22 | /** 23 | * the class will be fix 24 | * 25 | * copy {@link Fix} to here, and then generate patch (.apatch file) 26 | * 27 | * @author sanping.li@alipay.com 28 | * 29 | */ 30 | public class A { 31 | String s = "s"; 32 | // private static O o = new O("a"); 33 | // static int i = 10; 34 | // 35 | // public static String a(String str) { 36 | // Log.i("euler", "fix error"); 37 | // return "a"; 38 | // } 39 | // 40 | // public int b(String s1, String s2) { 41 | // Log.i("euler", "fix error"); 42 | // Log.i("euler", o.s); 43 | // return 0; 44 | // } 45 | // 46 | public int getI() { 47 | return i; 48 | } 49 | 50 | private static O o = new O("fix"); 51 | static int i = 11; 52 | 53 | public static String a(String str) { 54 | Log.d("qq", str); 55 | Log.i("euler", "fix succes"); 56 | return "b"; 57 | } 58 | 59 | public int b(String s1, String s2) { 60 | Log.e("euler", s1); 61 | Log.e("euler", i + "==" + c()); 62 | Log.i("euler", "fix succes" + s); 63 | Log.i("euler", o.s); 64 | return 0; 65 | } 66 | 67 | private String c() { 68 | return "a"; 69 | } 70 | 71 | } 72 | -------------------------------------------------------------------------------- /app/src/main/java/me/yifeiyuan/andfixdemo/App.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2015, 程序亦非猿 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package me.yifeiyuan.andfixdemo; 18 | 19 | import android.app.Application; 20 | import android.os.Environment; 21 | import android.util.Log; 22 | 23 | import com.alipay.euler.andfix.patch.PatchManager; 24 | 25 | import java.io.IOException; 26 | 27 | /** 28 | * Created by 程序亦非猿 on 16/4/21. 29 | */ 30 | public class App extends Application { 31 | 32 | private static final String TAG = "App"; 33 | private PatchManager mPatchManager; 34 | private static final String APATCH_PATH = "/out.apatch"; 35 | 36 | @Override 37 | public void onCreate() { 38 | super.onCreate(); 39 | // initialize 40 | mPatchManager = new PatchManager(this); 41 | mPatchManager.init("1.0"); 42 | Log.d(TAG, "inited."); 43 | 44 | // load patch 45 | mPatchManager.loadPatch(); 46 | Log.d(TAG, "apatch loaded."); 47 | 48 | // add patch at runtime 49 | try { 50 | // .apatch file path 51 | String patchFileString = Environment.getExternalStorageDirectory() 52 | .getAbsolutePath() + APATCH_PATH;///storage/emulated/0/out.apatch 53 | mPatchManager.addPatch(patchFileString); 54 | Log.d(TAG, "apatch:" + patchFileString + " added."); 55 | } catch (IOException e) { 56 | Log.e(TAG, "", e); 57 | } 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /app/src/main/java/me/yifeiyuan/andfixdemo/F.java: -------------------------------------------------------------------------------- 1 | /* 2 | * 3 | * Copyright (c) 2015, alipay.com 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | 18 | package me.yifeiyuan.andfixdemo; 19 | 20 | /** 21 | * @author sanping.li@alipay.com 22 | * 23 | */ 24 | public class F { 25 | 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/java/me/yifeiyuan/andfixdemo/Fix.java: -------------------------------------------------------------------------------- 1 | /* 2 | * 3 | * Copyright (c) 2015, alipay.com 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | 18 | package me.yifeiyuan.andfixdemo; 19 | 20 | import android.util.Log; 21 | 22 | /** 23 | * new version of {@link A} 24 | * 25 | * @author sanping.li@alipay.com 26 | * 27 | */ 28 | public class Fix { 29 | String s = "s"; 30 | private static O o = new O("fix"); 31 | static int i = 11; 32 | 33 | public static String a(String str) { 34 | Log.d("qq", str); 35 | Log.i("euler", "fix succes"); 36 | return "b"; 37 | } 38 | 39 | public int b(String s1, String s2) { 40 | Log.e("euler", s1); 41 | Log.e("euler", i + "==" + c()); 42 | Log.i("euler", "fix succes" + s); 43 | Log.i("euler", o.s); 44 | return 0; 45 | } 46 | 47 | private String c() { 48 | return "a"; 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /app/src/main/java/me/yifeiyuan/andfixdemo/MainActivity.java: -------------------------------------------------------------------------------- 1 | package me.yifeiyuan.andfixdemo; 2 | 3 | import android.os.Bundle; 4 | import android.support.v7.app.AppCompatActivity; 5 | import android.util.Log; 6 | import android.widget.TextView; 7 | import android.widget.Toast; 8 | 9 | import me.yifeiyuan.library.XiHa; 10 | 11 | public class MainActivity extends AppCompatActivity { 12 | 13 | 14 | private static final String TAG = "MainActivity"; 15 | private TextView tv; 16 | 17 | @Override 18 | protected void onCreate(Bundle savedInstanceState) { 19 | super.onCreate(savedInstanceState); 20 | setContentView(R.layout.activity_main); 21 | tv = (TextView) findViewById(R.id.tv); 22 | } 23 | 24 | 25 | @Override 26 | protected void onResume() { 27 | super.onResume(); 28 | Log.e(TAG, A.a("good")); 29 | Log.e(TAG, "" + new A().b("s1", "s2")); 30 | Log.e(TAG, "" + new A().getI()); 31 | 32 | String data = A.a("good") + ";" + new A().b("s1", "s2") + ";" + new A().getI(); 33 | tv.setText(data); 34 | Toast.makeText(MainActivity.this, data, Toast.LENGTH_SHORT).show(); 35 | XiHa.xiha(); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /app/src/main/java/me/yifeiyuan/andfixdemo/O.java: -------------------------------------------------------------------------------- 1 | /* 2 | * 3 | * Copyright (c) 2015, alipay.com 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | 18 | package me.yifeiyuan.andfixdemo; 19 | 20 | /** 21 | * @author sanping.li@alipay.com 22 | * 23 | */ 24 | public class O { 25 | public String s = "s"; 26 | 27 | public O(String s) { 28 | this.s = s; 29 | } 30 | 31 | @Override 32 | public String toString() { 33 | return s; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/layout/content_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 15 | 16 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_main.xml: -------------------------------------------------------------------------------- 1 | 5 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/AndFixDemo/25fb24efd233780775a7bf03203fdfae4a90c9fc/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/AndFixDemo/25fb24efd233780775a7bf03203fdfae4a90c9fc/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/AndFixDemo/25fb24efd233780775a7bf03203fdfae4a90c9fc/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/AndFixDemo/25fb24efd233780775a7bf03203fdfae4a90c9fc/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanCheen/AndFixDemo/25fb24efd233780775a7bf03203fdfae4a90c9fc/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/values-v21/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/values-w820dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 64dp 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #3F51B5 4 | #303F9F 5 | #FF4081 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16dp 4 | 16dp 5 | 16dp 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | AndFixDemo 3 | Settings 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 14 |