Tinker 핫 픽스 프레임 액세스

13190 단어 안드로이드 노트
Tinker 핫 픽스 프레임 액세스
안드로이드는 현재 앱을 개발할 때 기본적으로 열 복구 프레임워크에 접속하기 시작했는데 일부 온라인 긴급 버그를 복구할 수 있기 위해서다.핫한 복구 프레임워크와 대비, 인터넷에서 소개한 것도 많은데 개인적으로는 텐센트의 틴커와 아리의 소픽스를 사용한 적이 있다.
텐센트 틴커 팅커 프로필은 공식 문서에 따라 틴커를 접속한 다음에 열 복구 패치를 테스트하는데 왠지 실패한다(혹시 자신의 기술이 너무 엉망일지도 모른다).어쩔 수 없이 괴롭히지 않고 제3자의tinkerpatch라는 sdk를 선택하고 패치 ok를 테스트했습니다.
주: 인터넷의tinker를 참조하여 블로그와 공식 문서를 접속하면 자신이 항상 결정하지 못한다. 자신의 기술 찌꺼기라고 할 수도 있고 그럴 수도 있다.어쨌든 나는 아리의 문서를 참조하여 sophix에 접속하면 매우 순조롭다.
잡담은 적게 하고 본론으로 돌아가며, 다음은tinkerpatch에 접속하는 대체적인 절차이다.
  • 프로젝트 루트build.gradle 의존 설정 추가
  •       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"
          	}
          }
    
  • 앱의build.gradle에 의존 추가
  •       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"
              ...
          }
    
  • 위의 설정에 따라tinkerpatch를 바꿔야 합니다.gradle 파일, 경로와 app의builde.gradle 동급.일반적으로 두 위치를 주의해야 한다
  • appKey는 바로 당신이tinkerpatch 플랫폼에 있는 키
  • 입니다.
  • sevenZip의 버전과 경로 설정은 로컬 경로에 대응합니다.(주의, 여기 다운로드가 안 될 수도 있어요. 마븐 창고에 아리의 jcenter를 설정하는 게 좋을 거예요.)
  • 7zip 파일의 다운로드, 7za는 많은 사람들이 없습니다.https://www.7-zip.org/download.html이 목록의 download 디렉토리 아래 7-Zip Extra: standalone console version, 7z DLL, Plugin for Far Manager 란그리고 대응하는 경로로 압축을 풀고 아래로 설정하면 됩니다.
  • com.tencent.mm:SevenZip:1.2.12 가끔 불러올 수 없어요. 앱의buidle에 있어요.gradle에 이 의존implementationcom을 추가합니다.tencent.mm:SevenZip:1.2.12 다운로드하시면 됩니다.
  • 여기에 변수 appversionName을 사용하려면gradle에 설정된 변수가 필요합니다. 바로 app의 버전 번호입니다.루트 디렉터리의gradle에 있습니다.properties에서 설정, 예를 들어 appVersionCode=16 appVersionName=2.0.2 주의, 때때로 AS 설정에서compile 설정 항목의 -offline 파라미터를 제거하는 것이 좋다
  •       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
              }
          }
    

    다른 것은 기본적으로 수정하지 않거나 자신의 항목에 따라 설정할 수 있습니다.
  • 사용자 정의 응용 프로그램에서 tinkerpatch를 설정하고 초기화합니다:
  •     	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();
          		}
          	}
    

    여기서 주의해야 할 것은 앱이 여러 프로세스를 사용했다면 가능한 한 한 한 한 번만 초기화할 수 있다는 것이다.여러 번 초기화하는 데 문제가 있는지 없는지는 나는 시험해 본 적이 없다.
  • 그리고 시작하는 activity나 당신이 필요로 하는 곳에서 activity가 필요로 하는 곳으로 자동으로 호출하고 TinkerPatch를 호출합니다.with().fetchPatchUpdate(true);링크에 tinkerpatch 플랫폼에서 발표한 버전에 대한 패치를 요청합니다.
  • 이상 설정 ok는 포장할 때마다 프로젝트/app/build/bakapk/아래에 app-2.02-1012-11-25-31 양식의 폴더를 생성합니다. 그 안에는 debug 폴더가 있고 아래에는 app-debug가 있습니다.apk 및 app-debug-R.txt.만약release의build을 실행한다면release 폴더 아래에 있습니다
  • AS의 오른쪽Gradle 코너에서 app-build에서 assemble Release를 실행하면release의 패키지를 생성할 수 있습니다.
  • 그리고 상기 앱-release.apk 및 app-release-R.txt는bakapk 디렉터리로 이동하고 app-2.0.2와 같은 이름을 변경합니다.apk 및 app-2.02-R.txt.이것은 실제로 tinkerpatch.gradle에서 구성된 것입니다.
  • 혼동이 시작되면 기본 패키지를 생성할 때 마핑을 해야 합니다.txt 파일도 위의bakapk 디렉터리에 있습니다.
  • AS의Gradle에서 app-tinker-tinkerPatchRelease의task를 실행하면 패치가 생성됩니다.app-build-outputs-apk-tinkerPatch-release에 patch-signed-7z가 있습니다.apk의 패치.
  • 에 업로드된tinkerpatch 플랫폼입니다. 프로젝트에서 프로젝트를 만들고 패치를 만들고 패치를 만든 다음에 패치를 발표하는 것을 선택하십시오.
  • 이때 앱이 시작되면 네트워크에서 패치를 다운로드하고 다시 시작할 때 패치를 적용합니다.어떤 것은 세 번 시동을 걸어야 할 수도 있다.


  • 주의해야 할 것은, 여기에서 사용한 설명은release 구축입니다. 만약 debug를 테스트한다면,build가 debug 패키지에 대응하고,tinkerpatch도 debug이면 됩니다.
    또 한 가지 설명은 틴커 패치라는 플랫폼의 무료 버전의 패치 발송 횟수에 제한이 있는 것 같다. 대형 프로젝트라면 틴커 공식 접속 방식을 어떻게 사용하는지 스스로 연구해야 한다.또는 아리의 소픽스를 사용할 수 있어 접속도 편리합니다.헝을 깁는 것도 편리하다.

    좋은 웹페이지 즐겨찾기