[Compilation du code source] android 10.0.0_r2 pour Pixel 2 XL sur le serveur ubuntu20.04

[Compilation du code source] android-13.0.0_r7 pour Pixel 4 sur ubuntu20.04-server
[Compilation du code source] android-12.1.0_r11 pour Pixel 4 sur ubuntu20.04-server
[Compilation du code source] android-11.0.0_r46 pour Pixel 4 sur ubuntu20 .04-server
[compilation du code source] android 10.0.0_r2 pour Pixel 2 XL sur ubuntu20.04-server
[compilation du code source] android-9.0.0_r46 pour Pixel 2 XL sur ubuntu20.04-server
[compilation du code source ] android-8.0.0_r21 pour Pixel 2 XL sur ubuntu20.04-server

avant-propos

Merci à Kanxue, Jianshu, CSDN et d'autres tutoriels de compilation senior sur diverses plates-formes, merci à Google d'avoir rendu la compilation Android de plus en plus facile. Dans le passé, il y avait essentiellement divers problèmes de compilation, mais maintenant c'est direct jusqu'à la fin en une seule étape , ultra lisse

Environnement de configuration

  • ubuntu20.04-server (le miroir Tsinghua a été changé)
  • 4 cœurs
  • 8 Go de RAM
  • Disque 2T
  • hôte physique
  • Proxy nécessaire, assez rapide, recommandé au dessus de 20Mb/s
  • Un téléphone Pixel 2 XL
  • configurer les chaînes proxy

choisir la branche

Ici, je choisis android-10.0.0_r2, car j'ai vu cette branche utilisée dans plusieurs tutoriels inverses, donc je choisis cette branche pour faciliter l'analyse inverse. Quant à la raison spécifique, je suppose que cette branche prend en charge plus de modèles, et les modèles pris en charge Liste : Pixel 3a XL, Pixel 3a, Pixel 3 XL, Pixel 3, Pixel 2 XL, Pixel 2, Pixel XL, Pixel, tous pris en charge de Pixel à Pixel3, et j'utilise Pixel 2 XL

Remarque : la branche doit correspondre au modèle de l'appareil, toutes les branches ne peuvent pas être flashées pour un modèle, voir la liste de correspondance spécifique : Ici

télécharger le code source

sudo apt-get update

sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 libncurses5-dev lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig python

mkdir ~/bin
export PATH=~/bin:$PATH

proxychains curl https://storage.googleapis.com/git-repo-downloads/repo -o ~/bin/repo
chmod a+x ~/bin/repo

mkdir WORKING_DIRECTORY
cd WORKING_DIRECTORY

git config --global user.name Your Name
git config --global user.email [email protected]

# -b 后面代号选择,访问:https://source.android.com/setup/start/build-numbers#source-code-tags-and-builds
proxychains repo init -u https://android.googlesource.com/platform/manifest -b android-10.0.0_r2

# -j 的数字根据机器性能而定
proxychains repo sync -c -j8

Importer le pilote de périphérique (facultatif, nécessaire pour flasher dans un périphérique réel)

  • Téléchargez le fichier de pilote correspondant pour Pixel 2 XL, adresse : taimenqp1a.190711.020
  • Placez les deux packages compressés dans le répertoire racine du code source
  • Exécutez la commande de décompressiontar -zxvf xxxxx.tgz
  • Exécutez le fichier sh décompressé, généralement à 8.e.la fin de la ligne, et à la fin laissera l'entrée I ACCEPT, n'appuyez pas trop vite sur Entrée, sinon il sera ignoré directement
  • Après exécution, vous pouvez trouver le répertoire du vecteur dans le répertoire racine du code source

Configurer jdk

Avant android-8.1.0_r1, vous devez installer jdk vous-même, puis il est livré avec le code source, chemin : prebuilts/jdk, vous n'avez donc pas besoin de configurer jdk après android-8.0.0_r1

construire le code source

cd WORKING_DIRECTORY

sudo apt-get install libncurses5

export _JAVA_OPTIONS="-Xmx4g"

source build/envsetup.sh

lunch aosp_taimen-user

m 

Ici, m est exécuté dans une boucle, et si une erreur est signalée, il continuera à s'exécuter. S'il y a une invite de réparation, suivez l'invite, sinon la valeur par défaut sera toujours m, tant que l'erreur n'est pas la même à chaque fois

Flash dans le miroir

cd WORKING_DIRECTORY/out/target/product/taimen/
fastboot flashall -w

Brossez dans l'image (compilation de serveur distant, fenêtre locale) (Sur Xshell 5)

  • sous xshell
cd WORKING_DIRECTORY/out/target/product/taimen/
sz *.txt
sz *.img
  • Sous la fenêtre
    , basculez dans le répertoire téléchargé par la commande sz, ouvrez cmd dans ce répertoire, et exécutez la commande suivante
set ANDROID_PRODUCT_OUT=./
fastboot flashall -w

Compiler le noyau Pixel 2 XL

Le code source du noyau n'est pas dans aosp, il doit être téléchargé séparément, environ 4,35 Go,
le noyau de chaque modèle est différent, pour plus de détails, veuillez vous référer à : https://source.android.google.cn/setup/build /building-kernels?hl=zh-cn

télécharger le code source

mkdir android-msm-wahoo-4.4-android10-qpr3

cd android-msm-wahoo-4.4-android10-qpr3

proxychains repo init -u https://android.googlesource.com/kernel/manifest -b android-msm-wahoo-4.4-android10-qpr3

proxychains repo sync -c -j8

Passer au commitId spécifié

Ce commitId peut être obtenu en vérifiant la version du noyau du téléphone mobile, généralement sous la forme -g{commitId}

  • Afficher les détails du commit, full_commitId est inclus dans les détails
repo forall -c 'git show $commitId'
  • passer à ce commit
repo forall -c 'git reset --hard $full_commitId'

Compiler le code source

# openssl/bio.h file not found
sudo apt-get install libssl-dev

# soong_zip: cammand not found
export PATH=/mnt/d/tool/android/android-10.0.0_r2/out/soong/host/linux-x86/bin:$PATH

build/build.sh

remplacer le noyau aosp

Remplacez le noyau compilé ci-dessus dans aosp, qui est spécifié par la variable d'environnement TARGET_PREBUILT_KERNEL pour faciliter la commutation dynamique des noyaux. Pour plus de détails, voir : https://source.android.google.cn/setup/build/building-kernels?hl= zh-cn# en cours d'exécution

cd android-10.0.0_r2

# 先初始化aosp编译环境,具体看上面构建aosp源码步骤

export TARGET_PREBUILT_KERNEL=/mnt/d/tool/android/kernel/android-msm-wahoo-4.4-android10-qpr3/out/android-msm-wahoo-4.4/dist/Image.lz4-dtb

m bootimage

Après cela, suivez les étapes ci-dessus <Flash into image> pour flasher normalement

sur mesure

  • modifier le code
  • m <target module>
  • make snod(compiler system.img, ignorer les dépendances)
  • m
  • vérification du journal système lors de la personnalisation dmesg | grep <tag>oucat /proc/kmsg | grep <tag>

Le <module cible> fait ici référence au nom du module dans le fichier bp. Si le fichier exécutable est un module avec la structure cc_binary{} dans le bp, son attribut name est le nom du module. Si c'est une bibliothèque, cherchez celle qui commence par cc_library, si c'est une application, cherchez celle qui commence par android_app...etc

Modifier system.img

Étant donné que le module doit être occupé lorsque le système est en cours d'exécution, il ne peut pas être écrasé à ce stade. Bien sûr, vous pouvez également écraser directement l'intégralité du fichier system.img, mais le micrologiciel officiel de Google est définitivement différent du micrologiciel que nous avons compilé. Vous peut voir la différence. Il se peut que certaines choses privées aient été ajoutées au code source du système d'origine. Bien sûr, vous pouvez également essayer d'écraser des fichiers en mode de récupération, mais après avoir réellement testé twrp en mode de récupération, de nombreux problèmes se produiront. Le cryptage de la partition de données nécessite un changement de format, le système ne peut pas être monté et ainsi de suite.
Au final, la seule solution envisageable est de modifier le fichier system.img.

audit2allow correctifs d'exécution

sudo apt-get install python2
rm -rf /usr/bin/python
sudo ln -s /usr/bin/python2 /usr/bin/python

autorité racine

// voir référence

Activer le débogage USB par défaut (persist.sys.usb.config est toujours aucun pour empêcher la détection de connexion USB)

  • Activer le débogage USB
//android-10.0.0_r2/frameworks/base/services/core/java/com/android/server/adb/AdbService.java#119
                // mAdbEnabled = containsFunction(
                //         SystemProperties.get(USB_PERSISTENT_CONFIG_PROPERTY, ""),
                //         UsbManager.USB_FUNCTION_ADB);
                mAdbEnabled = true;

  • Gérer automatiquement la vérification USB
//android-10.0.0_r2/frameworks/base/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingActivity.java#onCreate()
   @Override
    public void onCreate(Bundle icicle) {
    
    
        //......
        setupAlert();
        //....
        mAlert.getButton(BUTTON_POSITIVE).setOnTouchListener(filterTouchListener);
        //add code
        try {
    
    
            IBinder b = ServiceManager.getService(ADB_SERVICE);
            IAdbManager service = IAdbManager.Stub.asInterface(b);
            service.allowDebugging(true, mKey);
        } catch (Exception e) {
    
    
            Log.e(TAG, "Unable to notify Usb service", e);
        }
        finish();
    }

créer une clé de libération

  • Créez create_key.sh dans le répertoire racine du code source
#create_key.sh
subject='/C=CN/ST=Shanghai/L=Shanghai/O=marto/OU=marto/CN=marto.cc/[email protected]'
for x in releasekey platform shared media networkstack;
do
  ./development/tools/make_key ~/.android-certs/$x "$subject";
done

  • Exécution du répertoire racine du code sourcecp -r ~/.android-certs/releasekey.* build/target/product/security/
  • testkey->releasekey
# build/core/config.mk

# The default key if not set as LOCAL_CERTIFICATE
ifdef PRODUCT_DEFAULT_DEV_CERTIFICATE
  DEFAULT_SYSTEM_DEV_CERTIFICATE := $(PRODUCT_DEFAULT_DEV_CERTIFICATE)
else
  DEFAULT_SYSTEM_DEV_CERTIFICATE := build/target/product/security/releasekey
endif
.KATI_READONLY := DEFAULT_SYSTEM_DEV_CERTIFICATE
# build/core/Makefile

# The "test-keys" tag marks builds signed with the old test keys,
# which are available in the SDK.  "dev-keys" marks builds signed with
# non-default dev keys (usually private keys from a vendor directory).
# Both of these tags will be removed and replaced with "release-keys"
# when the target-files is signed in a post-build step.
ifeq ($(DEFAULT_SYSTEM_DEV_CERTIFICATE),build/target/product/security/releasekey)
BUILD_KEYS := release-keys
else
BUILD_KEYS := dev-keys
endif

  • m -j4recompiler

Modifier les propriétés de l'appareil

Déverrouillage BL caché

Trace d'accès aux propriétés système

//bionic/libc/bionic/system_property_api.cpp

#include <async_safe/log.h>

__BIONIC_WEAK_FOR_NATIVE_BRIDGE
const prop_info* __system_property_find(const char* name) {
    
    
  char value[PROP_VALUE_MAX] = {
    
    0};
  system_properties.Get(name, value);
   async_safe_format_log(ANDROID_LOG_ERROR,
             "marto","call __system_property_find %s -> %s",name,value);
  return system_properties.Find(name);
}

__BIONIC_WEAK_FOR_NATIVE_BRIDGE
int __system_property_read(const prop_info* pi, char* name, char* value) {
    
    
  int ret= system_properties.Read(pi, name, value);
  async_safe_format_log(ANDROID_LOG_ERROR,
             "marto","call __system_property_read %s -> %s",name,value);
  return ret;
}

__BIONIC_WEAK_FOR_NATIVE_BRIDGE
int __system_property_get(const char* name, char* value) {
    
    
  int ret= system_properties.Get(name, value);
  async_safe_format_log(ANDROID_LOG_ERROR,
             "marto","call __system_property_get %s -> %s",name,value);
  return ret;
}


Activer l'application débogable (ro.debuggable est toujours 0)

//frameworks/base/core/java/android/content/pm/PackageParser.java#parseBaseApplication()

       // if (sa.getBoolean(
       //         com.android.internal.R.styleable.AndroidManifestApplication_debuggable,
       //         false)) {
    
    
            ai.flags |= ApplicationInfo.FLAG_DEBUGGABLE;
            // Debuggable implies profileable
            ai.privateFlags |= ApplicationInfo.PRIVATE_FLAG_PROFILEABLE_BY_SHELL;
       // }

Modifier le temps de veille par défaut de l'écran (unité : ms)

<!-- frameworks/base/packages/SettingsProvider/res/values/defaults.xml  -->
    <integer name="def_screen_off_timeout">36000000</integer>

Le verrouillage de l'écran est par défaut sur "aucun"

<!-- frameworks/base/packages/SettingsProvider/res/values/defaults.xml  -->
<bool name="def_lockscreen_disabled">true</bool>

Modifier la langue par défaut en chinois

# build/tools/buildinfo.sh

# ..........

echo "# end build properties"

echo "# custom build properties"

echo "# default language"
echo "ro.product.locale=zh_CN"
echo "ro.product.locale.language=zh"
echo "ro.product.locale.region=CN"
echo "persist.sys.language=zh"
echo "persist.sys.country=CN"
echo "persist.sys.timezone=Asia/Shanghai"


echo "# end custom build properties"

trace de trace

//bionic/libc/bionic/ptrace.cpp

#include <async_safe/log.h>

long ptrace(int req, ...) {
    
    
  //......
  
  va_end(args);
  
  async_safe_format_log(ANDROID_LOG_ERROR,
             "marto","call ptrace pid:%d,addr:0x%p",pid,addr);

  long result = __ptrace(req, pid, addr, data);
  if (is_peek && result == 0) {
    
    
    return peek_result;
  }
  return result;
}

getenforce obligé de revenir

Plus d'échanges de technologies inversées

Rejoignez la planète « Reverse Hunting »

référence

Je suppose que tu aimes

Origine blog.csdn.net/qq_26914291/article/details/127512748
conseillé
Classement