Android 패키지 세 가지 방식 인 스 턴 스 상세 설명

9317 단어 Android포장 방식
Android 패키지 세 가지 방식 인 스 턴 스 상세 설명
선언: app , , , 。01.포장 서명 은 포장 이 무엇 입 니까?
포장 은 서명 과 다른 표지 에 따라 설치 패 키 지 를 만 드 는 것 이다.
사인 이 뭐 예요?
1.android 응용 파일(apk)에 저 장 된 특별한 문자열
2.서로 다른 응용 개발 자 를 표시 하 는 데 사용:개발 자 A,개발 자 B
3.한 애플 리 케 이 션 개발 자가 개발 한 여러 애플 리 케 이 션 은 같은 서명 을 사용 합 니 다.
한 사람 이 글 을 쓰 는 것 과 같이 서명 은 작가 의 서명 에 해당 한다.
만약 두 응용 프로그램 이 모두 개발 자가 개발 한 것 이 라면 서명 은 같은 것 이다.
이 개발 자 는 개인 일 수도 있 고 회사,단체 일 수도 있 습 니 다.
왜 사인 을 해요?원인 1:가장 간단 하고 직접적인 대답:시스템 이 요구 하 는 것.
Android 시스템 은 모든 Android 응용 프로그램 이 디지털 서명 을 거 쳐 야 시스템 에 설치 할 수 있 도록 요구 합 니 다.즉,하나의 Android 응용 프로그램 이 디지털 서명 을 거치 지 않 으 면 시스템 에 설치 할 수 없습니다!
원인 2:
프로그래머 가 개발 한 애플 리 케 이 션 패키지 이름 이 같 을 수 있 으 며,한 애플 리 케 이 션 이 다른 애플 리 케 이 션 을 덮어 쓸 수 있 습 니 다.
패키지 이름 개념 만 있다 면 B 앱 이 설 치 된 A 앱 패키지 이름과 같다 면 덮어 쓰기 가 가능 하 다.불합리 하 다
사실은 B 가 들 어 있 지 않 습 니 다.가방 이름 이 일치 하지만 서명 이 다 릅 니 다.덮어 쓰 지 않 습 니 다.
어떻게 APK 에 서명 합 니까?
어떻게 서명 하 는 지 는 말 할 필요 가 없다.이 방면 의 박문 은 셀 수 없 이 많 으 니 이 글 을 보 는 너 도 마 땅 히 할 수 있 을 것 이 라 고 믿는다.
코드 에 적 용 된 서명 을 받 았 습 니까?(개 뿔

public void getSingInfo() {
  try {
    PackageInfo packageInfo = getPackageManager().getPackageInfo(
        "    ", PackageManager.GET_SIGNATURES);
    Signature[] signs = packageInfo.signatures;
    Signature sign = signs[0];
    parseSignature(sign.toByteArray());
  } catch (Exception e) {
    e.printStackTrace();
  }
}
public void parseSignature(byte[] signature) {
  try {
    CertificateFactory certFactory = CertificateFactory
        .getInstance("X.509");
    X509Certificate cert = (X509Certificate) certFactory
        .generateCertificate(new ByteArrayInputStream(signature));
    String pubKey = cert.getPublicKey().toString();
    String signNumber = cert.getSerialNumber().toString();
    Log.e("TAG", "pubKey:" + pubKey);
    Log.e("TAG", "signNumber:" + signNumber);
  } catch (Exception e) {
    e.printStackTrace();
  }
}
질문 주의:
현상:
Android 에서 APK 패 키 지 를 내 보 낼 때 나타 나 며 컴 파일 디 버 깅 시 나타 나 지 않 습 니 다.
오류 메시지:
Error:(16) Error: “baidutieba_client_inavailable” is not translated in “en” (English) [MissingTranslation]
Error:(63) Error: “baidutieba” is not translated in “en” (English) [MissingTranslation]
Error:(67) Error: “share_to_baidutieba” is not translated in “en” (English) [MissingTranslation]
오류 캡 처:
这里写图片描述  
해결 방법:
resources 탭 에 두 개의 속성 을 추가 하면 됩 니 다:

<?xml version="1.0" encoding="utf-8" ?> 
<resources xmlns:tools="http://schemas.android.com/tools" 
 tools:ignore="MissingTranslation"> 
</resources>
02.우 맹 의 다 중 채널 포장 설명:1.다 중 채널 가방 은 무엇 입 니까?
채널 패 키 지 는 설치 패 키 지 에 채널 정 보 를 추가 하 는 것 이다.즉,channel 이다.서로 다른 채널 에 대응 해 야 한다.예 를 들 어 샤 오미 시장,360 시장,응용 보 시장 등 이다.
2.왜 다 중 채널 가방 을 제공 합 니까?
우 리 는 설치 가방 에 서로 다른 표 지 를 추가 하고 네트워크 를 요청 할 때 채널 정 보 를 휴대 하여 배경 에서 운영 통 계 를 편리 하 게 해 야 한다(이것 이 바로 채널 정 보 를 추가 하 는 용도 이다).
3.다 중 채널 포장 의 원 리 를 실현 한다.
일반적으로 이 채널 의 표 지 는 AndroidManifest.xml 의 Application 의 메타 데이터 에 놓 입 니 다.그리고 자바 에서 API 를 통 해 해당 하 는 데 이 터 를 얻 을 수 있 습 니 다.
4.어떻게 실현 합 니까?
현재 안 드 로 이 드 채널 은 다양 하 다.사실은 채널 은 응용 시장 에 만 국한 되 는 것 이 아니 라 홍보 방식 도 하나의 채널 로 볼 수 있다.예 를 들 어 사람 을 끌 어 당 기 는 방식 으로 홍보 하고 홈 페이지 에서 홍보 하 며 바 이 두 홍보 등 이다.그래서 채널 이 수천 만 에 달 합 니 다.홍 보 를 위해 가끔 은 한 번 에 수천 개의 설치 가방 을 만 들 기도 합 니 다.그러면 반나절 이나 하루 동안 아무것도 하지 마 세 요.그래서 몇 개의 대기업 의 효율 적 인 포장 방식 을 소개 하고 참고 하 세 요.
첫 번 째:우 맹 은 여러 채널 로 포장 하 는 방식 을 제공 하여 채널 통계 등에 사용 할 수 있다.
현재 Android 의 구축 도 구 는 gradle 로 바 뀌 었 습 니 다.gradle 을 통 해 간단하게 설정 하면 모든 채널 패 키 지 를 자동 으로 걸 수 있 습 니 다.
실현 절차:
1.umeng 의 요구 에 따라 manifest 파일 에 필요 합 니 다.

<meta-data
 android:name="UMENG_CHANNEL"
 android:value="${UMENG_CHANNEL_VALUE}" />
이 설정,value 는 바로 wandoujia,360 과 같은 채널 이름 입 니 다.그러나 우 리 는 여기 서 채널 이름 을 쓰 지 않 습 니 다.자 리 를 차지 하 는 문자 로 쓰 여 있 습 니 다.뒤에 gradle 컴 파일 할 때 동적 으로 바 꿉 니 다.
2.module(일반적으로 app)의 build.gradle 의 android{}에 다음 과 같은 내용 을 추가 합 니 다.

productFlavors{
     wandoujia{
       manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
     }
     xiaomi{
       manifestPlaceholders=[UMENG_CHANNEL_VALUE: "xiaomi"]
     }
   }
produtFlavors 는 안 드 로 이 드 노드 의 자체 노드 입 니 다.당신 은 어떤 채널 의 가방 을 걸 어야 합 니까?바로 여기 서 umeng 의 요구 에 따라 채널 이름 으로 UMENG 에 게CHANNEL_VALUE 할당.
3.최적화 1:위 에 두 개의 채널 만 있 습 니 다.만약 에 몇 십 개의 채널 이 있 으 면 이렇게 쓰 고 중복 되 는 것 이 너무 많 습 니 다.모든 채널 이 flavor 의 이름 이라는 것 을 관찰 할 수 있 기 때문에 다음 과 같이 수정 합 니 다.

productFlavors{
 wandoujia{

 }
 xiaomi{

 }
 }
 productFlavors.all { flavor ->
 flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
 }
4.최적화 2:위 에 서명 포장 을 거 쳐 생 성 된 apk 의 이름 은 기본 적 인 명명 규칙 이 있 습 니 다.예 를 들 어 xxx-xiaomi-relase.apk.그러나 우 리 는 버 전 정 보 를 포함 하고 싶 습 니 다.예 를 들 어 xxx-xiaomi-relase-1.0.apk.그래서 최종 포장 스 크 립 트 는 다음 과 같 습 니 다.

productFlavors{
  wandoujia{

  }
  xiaomi{

  }
 }
 productFlavors.all { flavor ->
  flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
 }
 applicationVariants.all { variant ->
  variant.outputs.each { output ->
    def outputFile = output.outputFile
    if (outputFile != null && outputFile.name.endsWith('.apk')) {
      def fileName = outputFile.name.replace(".apk", "-${defaultConfig.versionName}.apk")
      output.outputFile = new File(outputFile.parent, fileName)
    }
  }
 }
4.획득 루트
코드 에서 저 희 는 mate-data 정 보 를 읽 어서 경 로 를 얻 은 다음 에 요청 매개 변수 에 추가 할 수 있 습 니 다.획득 방법 은 다음 과 같 습 니 다.

private String getChannel() {
  try {
    PackageManager pm = getPackageManager();
    ApplicationInfo appInfo = pm.getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
    return appInfo.metaData.getString("UMENG_CHANNEL");
  } catch (PackageManager.NameNotFoundException ignored) {
  }
  return "";
}
5.서명 패키지 실행
这里写图片描述
이때 app/build/outputs/apk 에 가면 자동 으로 걸 려 있 는 채널 패 키 지 를 볼 수 있 습 니 다.
6.단점:
이런 포장 방식 은 효율 이 비교적 낮 아서 몇 십 개의 가방 이 라면 대처 할 수 있 고 한 개의 가방 을 빨리 싸 는 데 10 여 초 걸 리 며 느 리 면 몇 분 이 걸 리 는 지 기다 리 지 않 아 기계 의 성능 과 매우 관련 이 있다.
03.미 단 다 중 채널 포장 원리:
안 드 로 이 드 패키지 하 나 를 zip 파일 패키지 로 압축 을 풀 고 서명 으로 생 성 된 디 렉 터 리(META-INF)에 빈 파일 을 추가 하면 다시 서명 할 필요 가 없습니다.이 메커니즘 을 이용 하면 이 파일 의 파일 이름 이 바로 채널 이름 입 니 다.이러한 방식 은 재 서명 등의 절차 없 이 매우 효율 적 이지 만 Android 7.0 이후 Google 은 서명 의 안전성 을 높이 기 위해 파일 마다 디지털 인 코딩 을 하 는 것 이 아니 라 zip 패키지 파일 구조 인 코딩 에 서명 한 후 apk signing block 이라는 유일한 데 이 터 를 만 드 는 새로운 서명 규칙 을 사용 한 것 으로 보 입 니 다.zip 파일 의 모든 모듈 의 내용 을 수정 하면 APK Signing Block 이 바 뀌 어 서명 메커니즘 을 돌아 갈 수 없습니다.
방법:
우선 관련 도 구 를 다운로드 해 야 합 니 다.
这里写图片描述
자세 한 절차:
1.포장 할 apk 를 Python Tool 에 넣 습 니 다.
2.Python Tool/info/channel.txt 에 필요 한 경 로 를 기록 하고 한 줄 을 차지 합 니 다.
3.Python Tool/MultichannelBuildTool.py 파일(Python 환경 필요)을 더 블 클릭 하면 채널 패 키 지 를 생 성 합 니 다.
4.채널 정보 획득:JavaUtil 파일 의 Channel Util.java 를 프로젝트 에 복사 하고 Channel Util.getChannel 을 호출 하면 채널 을 얻 을 수 있 습 니 다.
장단 점:
장점:
이런 포장 방식 은 속도 가 매우 빨 라 서 900 여 개의 채널 이 1 분 도 안 되 어 다 할 수 있다.
단점:
1.구 글 은 현재 새로운 서명 규칙 을 수 정 했 습 니 다.새로운 서명 규칙 을 사용 하면 사용 할 수 없습니다.
2.일부 불법 채널 업 체 는 도 구 를 통 해 채널 을 수정 하기 쉽다.만약 에 채널 업 체 가 인터넷 납치 와 채널 을 변경 하 는 조합 방식 으로 폭 리 를 얻 으 면 프로그램 개발 자 에 게 커 다란 경제적 손실 이 존재 할 수 있다.
04,360 다 중 채널 포장:
apk 파일 의 본질은 zip 파일 입 니 다.zip 파일 의'comment(요약)'데이터 구조 특징 을 이용 하여 파일 의 끝 에 임의의 데 이 터 를 기록 할 수 있 습 니 다.zip 파일 의 압축 을 다시 풀 지 않 고 경로 정 보 를 요약 구역 에 기록 할 수 있 습 니 다.
방법:
우선 관련 도 구 를 다운로드 하 세 요:
这里写图片描述
단계:
1.채널 정 보 를 기록 할 apk 를 MCPTool 폴 더 에 넣 습 니 다.
2.MCPTool.bat 일괄 처리 파일 을 수정 하고 채널 과 비밀 번 호 를 변경 합 니 다(채널 정 보 는 안전 을 위해 암호 화 되 어야 합 니 다)
3.apk 를 MCPTool.bat 에 끌 어 다 놓 고 실행 하면 채널 패 키 지 를 생 성 합 니 다.
4.MCPTool-check.bat 의 비밀 번 호 를 수정 하 는 것 은 MCPTool.bat 의 비밀번호 와 일치 합 니 다.
5.채널 패 키 지 를 MCPTool-check.bat 에 끌 어 다 놓 고 실행 하면 채널 정보 가 정확 한 지 확인 할 수 있 습 니 다.
6.획득 경로:MCPTool.java 를 프로젝트 에 추가 하거나 MCPTool.jar 를 프로젝트 에 가 져 오고 MCPTool.getChannel Id(this,"12345678",")를 호출 합 니 다.첫 번 째 매개 변 수 는 context 이 고 두 번 째 는 비밀번호 이 며 세 번 째 는 기본 값 입 니 다.
장단 점:
장점:
1,5M 의 apk,1 초 에 300 개 를 칠 수 있 습 니 다.
2.apk 를 다운로드 하 는 동시에 서버 에서 일부 정 보 를 기록 할 수 있 습 니 다.예 를 들 어 초대 코드,정보 공유 등 입 니 다.
단점:
채널 정보 도 쉽게 수정 되 고 암호 화 할 수 있 지만 수정의 문턱 만 높 였 다.
이상 은 여러 경로 로 포장 하 는 방법 으로 현재 대부분 회사 에서 자주 사용 하 는 것 은 우 맹 의 포장 방식 이다.
읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기