Tinker 핫 픽스 프레임 액세스
13190 단어 안드로이드 노트
안드로이드는 현재 앱을 개발할 때 기본적으로 열 복구 프레임워크에 접속하기 시작했는데 일부 온라인 긴급 버그를 복구할 수 있기 위해서다.핫한 복구 프레임워크와 대비, 인터넷에서 소개한 것도 많은데 개인적으로는 텐센트의 틴커와 아리의 소픽스를 사용한 적이 있다.
텐센트 틴커 팅커 프로필은 공식 문서에 따라 틴커를 접속한 다음에 열 복구 패치를 테스트하는데 왠지 실패한다(혹시 자신의 기술이 너무 엉망일지도 모른다).어쩔 수 없이 괴롭히지 않고 제3자의tinkerpatch라는 sdk를 선택하고 패치 ok를 테스트했습니다.
주: 인터넷의tinker를 참조하여 블로그와 공식 문서를 접속하면 자신이 항상 결정하지 못한다. 자신의 기술 찌꺼기라고 할 수도 있고 그럴 수도 있다.어쨌든 나는 아리의 문서를 참조하여 sophix에 접속하면 매우 순조롭다.
잡담은 적게 하고 본론으로 돌아가며, 다음은tinkerpatch에 접속하는 대체적인 절차이다.
buildscript {
repositories {
...
maven { url 'https://dl.bintray.com/wemobiledev/maven' }
maven { url 'https://dl.bintray.com/tinker/maven' }
}
dependencies {
...
// TinkerPatch
classpath "com.tinkerpatch.sdk:tinkerpatch-gradle-plugin:1.2.8"
}
}
apply from: '../tinkerpatch.gradle'
dependencies{
// annotation , tinker
implementation 'com.tinkerpatch.sdk:tinkerpatch-android-sdk:1.2.8'
annotationProcessor 'com.tinkerpatch.tinker:tinker-android-anno:1.9.8'
//dex , tinker
implementation "com.android.support:multidex:1.0.3"
...
}
import java.util.regex.Matcher
import java.util.regex.Pattern
apply plugin: 'tinkerpatch-support'
/**
* TODO:
*/
def bakPath = file("${buildDir}/bakApk/")
tinkerpatchSupport {
/** debug tinkerPatch **/
tinkerEnable = true
/** **/
reflectApplication = true
/** , **/
protectedApp = false
/** Activity (exported false)**/
supportComponent = false
autoBackupApkPath = "${bakPath}"
/** tinkerpatch.com appKey **/
appKey = "20155552655555522"
/** : , appVersion **/
appVersion = appVersionName
baseApkFile = "${bakPath}/app-${appVersionName}.apk"
baseProguardMappingFile = "${bakPath}/app-${appVersionName}-mapping.txt"
baseResourceRFile = "${bakPath}/app-${appVersionName}-R.txt"
/**
* ( ) , '${appName}-${variantName}'
*
* Available vars:
* 1. projectName
* 2. appName
* 3. packageName
* 4. buildType
* 5. versionName
* 6. versionCode
* 7. buildTime
* 8. fileSHA1
* 9. flavorName
* 10. variantName
*
* default value: '${appName}-${variantName}'
* Note: plz use single-quotation wrapping this format string
*/
backupFileNameFormat = '${appName}-${variantName}'
/**
* flavors , : https://github.com/TinkerPatch/tinkerpatch-flavors-sample
* : flavor , zip comment ( :walle packer-ng)
**/
}
/**
* tinkerPatch
*/
android {
defaultConfig {
buildConfigField "boolean", "TINKER_ENABLE", "${tinkerpatchSupport.tinkerEnable}"
}
}
/**
* ,
* :
* https://github.com/Tencent/tinker/wiki/Tinker-%E6%8E%A5%E5%85%A5%E6%8C%87%E5%8D%97
*/
tinkerPatch {
ignoreWarning = false
useSign = true
dex {
dexMode = "jar"
pattern = ["classes*.dex"]
loader = []
}
lib {
pattern = ["lib/*/*.so"]
}
res {
pattern = ["res/*", "r/*", "assets/*", "resources.arsc", "AndroidManifest.xml"]
ignoreChange = []
largeModSize = 100
}
packageConfig {
}
sevenZip {
zipArtifact = "com.tencent.mm:SevenZip:1.2.12"
path = "D:\\Android\\7z\\x64\\7za.exe"
}
buildConfig {
keepDexApply = false
}
}
/**
* Release tinker, tinkerEnable return
* @return release
*/
def isRelease() {
Gradle gradle = getGradle()
String tskReqStr = gradle.getStartParameter().getTaskRequests().toString()
Pattern pattern
if (tskReqStr.contains("assemble")) {
println tskReqStr
pattern = Pattern.compile("assemble(\\w*)(Release|Debug)")
} else {
pattern = Pattern.compile("generate(\\w*)(Release|Debug)")
}
Matcher matcher = pattern.matcher(tskReqStr)
if (matcher.find()) {
String task = matcher.group(0).toLowerCase()
println("[BuildType] Current task: " + task)
return task.contains("release")
} else {
println "[BuildType] NO MATCH FOUND"
return true
}
}
다른 것은 기본적으로 수정하지 않거나 자신의 항목에 따라 설정할 수 있습니다.
private ApplicationLike tinkerApplicationLike;//Tinker
@Override
public void onCreate() {
super.onCreate();
//init tinkerpatch
initTinkerPatch();
...
}
@Override
public void attachBaseContext(Context base) {
super.attachBaseContext(base);
//you must install multiDex whatever tinker is installed!
MultiDex.install(base);
}
/**
* patch TinkerPatch
*/
@SuppressLint("LongLogTag")
private void initTinkerPatch() {
// Tinker
if (BuildConfig.TINKER_ENABLE) {
tinkerApplicationLike = TinkerPatchApplicationLike.getTinkerPatchApplicationLike();
// TinkerPatch SDK
TinkerPatch.init(tinkerApplicationLike)
.reflectPatchLibrary()
.setPatchRollbackOnScreenOff(true)
.setPatchRestartOnSrceenOff(true)
.setFetchPatchIntervalByHours(3);
// fetchPatchUpdateAndPollWithInterval fetchPatchUpdate(false)
// , handler
TinkerPatch.with().fetchPatchUpdateAndPollWithInterval();
}
}
여기서 주의해야 할 것은 앱이 여러 프로세스를 사용했다면 가능한 한 한 한 한 번만 초기화할 수 있다는 것이다.여러 번 초기화하는 데 문제가 있는지 없는지는 나는 시험해 본 적이 없다.
주의해야 할 것은, 여기에서 사용한 설명은release 구축입니다. 만약 debug를 테스트한다면,build가 debug 패키지에 대응하고,tinkerpatch도 debug이면 됩니다.
또 한 가지 설명은 틴커 패치라는 플랫폼의 무료 버전의 패치 발송 횟수에 제한이 있는 것 같다. 대형 프로젝트라면 틴커 공식 접속 방식을 어떻게 사용하는지 스스로 연구해야 한다.또는 아리의 소픽스를 사용할 수 있어 접속도 편리합니다.헝
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Android 학습 기록 - Handler를 사용하여 스레드에서 데이터 전달시간이 촉박한 데다가 나도 약간의 의혹이 있어서 코드만 넣었다.MainActivity.class ThreadTest.class...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.